96 |
97 |
98 | Items{" "}
99 |
104 |
105 | {items.map((item) => (
106 |
107 | ))}
108 |
109 |
110 |
111 |
112 |
113 | Amount Payable : ₹
114 | {total_price}
115 |
116 |
117 |
}
122 | style={{
123 | fontFamily: "Mulish",
124 | color: "white",
125 | backgroundColor: "#5995FD",
126 | border: "none",
127 | outline: "none"
128 | }}
129 | >
130 | Save Cart
131 |
132 |
133 |
}
137 | onClick={(e) => clearCart()}
138 | style={{
139 | fontFamily: "Mulish",
140 | color: "white",
141 | backgroundColor: "#DC3545",
142 | border: "none",
143 | outline: "none"
144 | }}
145 | >
146 | Clear Cart
147 |
148 |
149 |
}
153 | style={{
154 | fontFamily: "Mulish",
155 | color: "white",
156 | backgroundColor: "#007BFF",
157 | border: "none",
158 | outline: "none"
159 | }}
160 | >
161 | Checkout
162 |
163 |
164 |
165 |
166 | >
167 | )}
168 | >
169 | );
170 | };
171 |
172 | export default Cart;
173 |
--------------------------------------------------------------------------------
/client/src/components/DeleteItem.js:
--------------------------------------------------------------------------------
1 | import React from "react";
2 | import axios from "axios";
3 | import { Toast } from "react-bootstrap";
4 | import "animate.css";
5 |
6 | const DeleteItem = ({
7 | item,
8 | loading,
9 | setLoading,
10 | state,
11 | display,
12 | setDisplay,
13 | increaseCount
14 | }) => {
15 | const handleClick = async (e) => {
16 | const formdata = {
17 | name: item.name
18 | };
19 | const config = {
20 | headers: {
21 | "Content-Type": "application/json"
22 | }
23 | };
24 | try {
25 | const res = await axios.post(
26 | "/api/admin/items",
27 | formdata,
28 | config
29 | );
30 | setDisplay({
31 | val: 1,
32 | msg: "Successfully Deleted",
33 | color:"darkGreen"
34 | });
35 |
36 | increaseCount();
37 | const id = setTimeout(() => {
38 | setDisplay({ val: 0, msg: "",type:"",color:"" });
39 | clearTimeout(id);
40 | }, 3000);
41 | } catch (e) {
42 |
43 | setDisplay({val:1,msg:e.response.data,type:"fail",color:"red"})
44 | const id = setTimeout(() => {
45 | setDisplay({ val: 0, msg: "",type:"",color:"" });
46 | clearTimeout(id);
47 | }, 3000);
48 |
49 | }
50 | };
51 | return (
52 | <>
53 |
72 | <
73 | div className = "img_show" >
74 | <
75 | img src = {
76 | url
77 | }
78 | alt = "food" / >
79 |
80 |
26 | !isAuthenticated ? : verified? :
27 | }
28 | />
29 | );
30 | };
31 |
32 | export default PrivateRoutes;
33 | // ) : !verified ? (
34 | //
35 |
--------------------------------------------------------------------------------
/client/src/components/resetPassword.js:
--------------------------------------------------------------------------------
1 | import React, { useState, useEffect } from "react";
2 | import { Form, Button, Toast } from "react-bootstrap";
3 | import "animate.css";
4 | import axios from "axios";
5 | const ResetPassword = (props) => {
6 | const code = props.match.params.code;
7 | const [status, setStatus] = useState({ val: 0, msg: "", type: "" });
8 | const Alert = (msg, type) => {
9 | return (
10 |
18 |
25 |
26 | {type === "success" || "darkGreen" ? "Success" : "Fail"}
27 |
28 | {/* 2 seconds ago */}
29 |
30 | {status.msg}
31 |
32 | );
33 | };
34 | const [state, setState] = useState({
35 | password: "",
36 | confirmPassword: ""
37 | });
38 | const handleSubmit = async (e) => {
39 | e.preventDefault();
40 | if (
41 | state.password === state.confirmPassword &&
42 | state.password &&
43 | state.confirmPassword
44 | ) {
45 | e.preventDefault();
46 | const config = {
47 | headers: {
48 | "Content-Type": "application/json"
49 | }
50 | };
51 | const formData = {
52 | code,
53 | password: state.password
54 | };
55 | try {
56 | const res = await axios.post(
57 | "/api/reset",
58 | formData,
59 | config
60 | );
61 | if (res.status == 200) {
62 | setStatus({
63 | val: 1,
64 | msg: "Password Successfully Changed",
65 | type: "darkGreen"
66 | });
67 | let id = setTimeout(() => {
68 | setStatus({ val: 0, msg: "", type: "" });
69 | props.history.push("/");
70 | clearTimeout(id);
71 | }, 3000);
72 | }
73 | } catch (e) {
74 | setStatus({ val: 1, msg: "Server Error", type: "red" });
75 | let id = setTimeout(() => {
76 | setStatus({ val: 0, msg: "", type: "" });
77 | clearTimeout(id);
78 | }, 3000);
79 | }
80 | } else {
81 | setStatus({ val: 1, msg: "Fields Should Match", type: "red" });
82 | let id = setTimeout(() => {
83 | setStatus({ val: 0, msg: "", type: "" });
84 | clearTimeout(id);
85 | }, 3000);
86 | }
87 | };
88 | const handleChange = (e) => {
89 | setState({ ...state, [e.target.name]: e.target.value });
90 | };
91 | useEffect(() => {
92 | const get = async () => {
93 | try {
94 | let code = props.match.params.code;
95 |
96 | let res = await axios.get(
97 | "/api/reset?code=" + code,
98 | code,
99 | {
100 | headers: {
101 | "Content-Type": "application/json"
102 | }
103 | }
104 | );
105 | // console.log(res.data);
106 | } catch (e) {
107 | console.log(e.response);
108 | props.history.push("/");
109 | }
110 | };
111 | get();
112 | }, []);
113 | return (
114 | <>
115 | {status.val ? : ""}
116 | Reset Password
117 |
118 |
120 |
127 | Password
128 |
129 |
137 |
138 | Password And Confirm Password Should Match.
139 |
140 |
141 |
142 |
143 |
150 | Confirm Password
151 |
152 |
160 |
161 |
171 | Reset Password
172 |
173 |
174 |
175 | >
176 | );
177 | };
178 | export default ResetPassword;
179 |
--------------------------------------------------------------------------------
/client/src/components/sideBar.js:
--------------------------------------------------------------------------------
1 | import React, { useContext, useEffect, useState } from "react";
2 | import AuthContext from "../context/auth/authContext";
3 | import { Link, Redirect } from "react-router-dom";
4 | import "animate.css";
5 | const Sidebar = (props) => {
6 | const { logout, isAuthenticated, user, verified } = useContext(AuthContext);
7 | const [display,setDisplay]= useState(1);
8 |
9 | useEffect(()=>{
10 | function noScroll() {
11 | window.scrollTo(0, 0);
12 | }
13 |
14 | // add listener to disable scroll
15 | if(display==1){
16 | console.log("yes")
17 |
18 | window.addEventListener('scroll', noScroll);}
19 |
20 | // Remove listener to re-enable scroll
21 | return window.removeEventListener('scroll', noScroll);
22 | },[display])
23 |
24 |
25 | const handleLogout = (e) => {
26 | logout();
27 | props.changeDisplay();
28 | };
29 | return (
30 |
37 |
38 | {isAuthenticated ? (
39 |
40 | Hey, {user.name}
41 |
42 |
43 | ) : (
44 | ""
45 | )}
46 |
47 |
48 | {" "}
49 |
50 | Home
51 |
52 |
53 | {!isAuthenticated ? (
54 | {
56 | setDisplay(0)
57 | props.changeDisplay();
58 | }}
59 | >
60 |
64 | SignUp/Login
65 |
66 |
67 | ) : (
68 |
69 | Logout
70 |
71 | )}
72 | {/* {!isAuthenticated ? SignUp : ""} */}
73 |
74 | {isAuthenticated && verified && (
75 |
76 |
80 | Add Items
81 |
82 |
83 | )}
84 | {isAuthenticated && verified ? (
85 |
86 | {" "}
87 |
91 | Delete Items
92 |
93 |
94 | ) : (
95 | ""
96 | )}
97 | {isAuthenticated && verified && (
98 |
99 | {" "}
100 |
104 | Orders
105 |
106 |
107 | )}
108 |
109 | {" "}
110 |
114 | Contact Us
115 |
116 |
117 | {isAuthenticated && verified && (
118 |
119 | {" "}
120 |
124 | Cart
125 |
126 |
127 | )}
128 |
129 |
130 |
131 |
136 |
137 |
138 | );
139 | };
140 | export default Sidebar;
141 |
--------------------------------------------------------------------------------
/client/src/components/success.js:
--------------------------------------------------------------------------------
1 | import React, { useState, useEffect, useContext } from "react";
2 | import Axios from "axios";
3 | import AuthContext from "../context/auth/authContext";
4 | import { Spinner } from "react-bootstrap";
5 | import LoadingContext from "../context/loading/loadingContext";
6 | // import Spinnner from "../images/Spinnner.gif";
7 | const Success = (props) => {
8 | const [loading, setLoading] = useState(0);
9 | const { user } = useContext(AuthContext);
10 | const { Loader } = useContext(LoadingContext);
11 | const [data, setData] = useState(null);
12 | useEffect(() => {
13 | const orderid = props.location.search.split("?")[1].split("=")[1];
14 | const fetch = async () => {
15 | try {
16 | setLoading(1);
17 | const res = await Axios.get(
18 | "/api/orders?orderid=" + orderid
19 | );
20 | console.log(res.data);
21 | setData({...res.data});
22 |
23 | // console.log(res.data.order.items);
24 | setLoading(0);
25 | } catch (e) {
26 | props.history.push("/dvsjhvdsjhj")
27 | setLoading(0);
28 | }
29 | };
30 | fetch();
31 | setLoading(0);
32 | }, [props.location.search]);
33 | useEffect(()=>{
34 | console.log(data);
35 | },[data])
36 | return (
37 | <>
38 | {!data ? (
39 | <>
40 |
50 |
51 |
52 | >
53 | ) : (
54 | <>
55 | {" "}
56 |
57 |
62 |
THANK YOU!
63 |
64 |
65 | Your order was successfully placed. We have sent the order
66 | confirmation to {data.user.email}
67 | {" ."}
68 |
69 |
70 |
71 |
72 | ORDER DETAILS -{" "}
73 |
74 |
Order ID -{" "}
75 | {data.order_id}
76 |
77 |
78 |
Email
79 | {data.user.email}
80 |
81 |
82 |
Order Type
83 | {data.mode}
84 |
85 |
86 |
Payment Method
87 | {data.payment}
88 |
89 |
90 |
Order Date
91 | {new Date(data.time).toDateString()}
92 |
93 |
94 |
95 |
Order Summary
96 | {data.order.items.map((item) => (
97 |
98 | {item.q} X {item.name}
99 |
100 | ))}
101 |
102 |
110 |
111 |
Total Amount
112 |
113 | {" "}
114 | ₹ {data.order.total_price + data.deliveryCharges}
115 |
116 |
117 |
118 |
{" "}
119 | >
120 | )}
121 | >
122 | );
123 | };
124 |
125 | export default Success;
126 |
--------------------------------------------------------------------------------
/client/src/components/verify.js:
--------------------------------------------------------------------------------
1 | import React, {useState, useEffect, useContext} from 'react'
2 | import { makeStyles } from '@material-ui/core/styles';
3 | import TextField from '@material-ui/core/TextField';
4 | import Button from '@material-ui/core/Button';
5 | import {Toast} from "react-bootstrap"
6 | import MailOutlineIcon from '@material-ui/icons/MailOutline';
7 | import axios from 'axios';
8 | import { Redirect } from 'react-router-dom';
9 | import AuthContext from '../context/auth/authContext';
10 |
11 | const useStyles = makeStyles((theme) => ({
12 | root: {
13 | '& > *': {
14 | margin: theme.spacing(1),
15 | width: '25ch',
16 | },
17 | },
18 | }));
19 |
20 |
21 | const Verify = (props) => {
22 | const[status,setStatus]= useState({val:0,msg:"",type:""});
23 | const {user} = useContext(AuthContext);
24 | const Alert = (msg, type) => {
25 | return (
26 |
34 |
41 |
42 | {type === "success" || "darkGreen" ? "Success" : "Fail"}
43 |
44 | {/* 2 seconds ago */}
45 |
46 | {status.msg}
47 |
48 | );
49 | };
50 | useEffect(()=>{
51 | if(!user)
52 | props.history.push("/")
53 |
54 | },[])
55 | const [code, setCode] = useState(0);
56 | const [loading, setLoading] = useState(0);
57 |
58 | const handleSubmit = async(e)=>{
59 | e.preventDefault();
60 | const config = {
61 | headers: {
62 | "Content-Type": "application/json",
63 | }
64 | }
65 | setLoading(true);
66 | if(code==""){
67 | setLoading(false)
68 | alert("Please Enter Valid Code")}
69 | else{
70 | try{
71 | const res = await axios.post("/api/verify",{ code}, config);
72 | setLoading(false);
73 | document.write("Verified Successfully.You Are getting redirected to HomePage ")
74 | setTimeout(()=>{
75 | window.location.href="/"
76 | },3000)
77 | }
78 | catch(e){
79 | console.log(e.response.data)
80 | setStatus({val:1,
81 | type:"red",
82 | msg:e.response.data})
83 | let id = setTimeout(()=>{
84 | setStatus({val:0,
85 | type:"",
86 | msg:""})
87 | clearTimeout(id)
88 | },[3000])
89 | setLoading(false)
90 | }}
91 | }
92 |
93 | const classes = useStyles();
94 | const handleChange = (e)=>{
95 | setCode(e.target.value);
96 | }
97 | const resend = async()=>{
98 | let id = user._id;
99 | let email = user.email;
100 | let name= user.name;
101 | const config = {
102 | headers: {
103 | "Content-Type": "application/json",
104 | }
105 | }
106 | try{
107 | setLoading(true)
108 | const res = await axios.post("/api/resend",{id, email , name}, config);
109 | setStatus({val:1,msg:res.data,type:"darkGreen"})
110 | let id = setTimeout(()=>{
111 | setStatus({val:0,msg:"",type:""})
112 | },3000)
113 | setLoading(false);
114 |
115 | }
116 | catch(e){
117 | setStatus({val:1,msg:e.response.data,type:"red"})
118 | let id = setTimeout(()=>{
119 | setStatus({val:0,msg:"",type:""})
120 | },3000)
121 | }
122 | setLoading(false)
123 |
124 | }
125 | return (
126 | <>{loading==true?:<>
127 | {status.val==1? :""}
128 |
129 |
130 | Email Verification
131 |
132 |
133 |
134 |
135 |
136 |
137 | {" "}
138 | Enter the 6-digit code we sent to your email address to verify your account
139 |
140 |
141 |
148 |
}
154 | style={{ fontFamily:'Mulish'}}
155 | onClick = {resend}
156 | >
157 | Resend Code
158 |
159 |
160 |
161 |
162 |
165 |
166 |
167 |
168 | >}
169 | >
170 | )
171 | }
172 |
173 | export default Verify
--------------------------------------------------------------------------------
/client/src/context/alerts/alertContext.js:
--------------------------------------------------------------------------------
1 | import { createContext } from "react";
2 |
3 | const alertContext = createContext();
4 |
5 | export default alertContext;
6 |
--------------------------------------------------------------------------------
/client/src/context/alerts/alertState.js:
--------------------------------------------------------------------------------
1 | import React, { useReducer } from "react";
2 | import AlertContext from "./AlertContext";
3 |
4 | const Alerts = () => {
5 | const intitalState = [];
6 | const [state, dispatch] = useReducer(AlertReducer, initialState);
7 | };
8 |
--------------------------------------------------------------------------------
/client/src/context/auth/authContext.js:
--------------------------------------------------------------------------------
1 | import React, { createContext } from "react";
2 | const AuthContext = createContext();
3 | export default AuthContext;
4 |
--------------------------------------------------------------------------------
/client/src/context/auth/authReducer.js:
--------------------------------------------------------------------------------
1 | export default (state, action) => {
2 | switch (action.type) {
3 | case "REGISTER_SUCCESS":
4 | return {
5 | ...state,
6 | isAuthenticated: true,
7 | loading: false
8 | };
9 | case "REGISTER_FAIL":
10 | let x = [];
11 | if (action.payload.data.msg) {
12 | x.push(action.payload.data.msg);
13 | }
14 | if (action.payload.data.errors) {
15 | action.payload.data.errors.forEach((error) => {
16 | x.push(error.msg);
17 | });
18 | }
19 | return {
20 | ...state,
21 | isAuthenticated: false,
22 | loading: false,
23 | user: null,
24 | errors: x
25 | };
26 | case "USER_LOADED":
27 | return {
28 | ...state,
29 | isAuthenticated: true,
30 | user: action.payload,
31 | loading: false,
32 | verified: action.payload.verify,
33 | // displayVerified: !this.verified
34 | };
35 | // case "REMOVE_DISPLAY_VERIFIED":
36 | // return { ...state, displayVerified: !state.displayVerified };
37 | case "LOGIN_SUCCESS":
38 | return {
39 | ...state,
40 | isAuthenticated: true,
41 | current: 1,
42 | loading: false
43 | };
44 | case "LOGIN_FAIL":
45 | let y = [];
46 | if (action.payload.data.msg) {
47 | y.push(action.payload.data.msg);
48 | }
49 | if (action.payload.data.errors) {
50 | action.payload.data.errors.forEach((error) => {
51 | y.push(error.msg);
52 | });
53 | }
54 | return {
55 | ...state,
56 | isAuthenticated: false,
57 | errors: y,
58 | loading: false,
59 | user: null
60 | };
61 | case "AUTH_ERROR":
62 | return { ...state, isAuthenticated: false, user: null };
63 | case "LOGOUT":
64 | return {
65 | ...state,
66 | isAuthenticated: false,
67 | loading: false,
68 | user: null
69 | };
70 | case "REMOVE_ALERT":
71 | return {
72 | ...state,
73 | errors: []
74 | };
75 | case "SET_LOADING":
76 | return {
77 | ...state,
78 | loading: true
79 | };
80 | case "REMOVE_CURRENT":
81 | return { ...state, current: 0 };
82 | default:
83 | return state;
84 | }
85 | };
86 |
--------------------------------------------------------------------------------
/client/src/context/auth/authState.js:
--------------------------------------------------------------------------------
1 | import React, { useContext, useReducer } from "react";
2 | import AuthContext from "./authContext";
3 | import AuthReducer from "./authReducer";
4 | import axios from "axios";
5 | import setAuthToken from "./setAuthToken";
6 | import removeAuthToken from "./removeAuthToken";
7 |
8 | const AuthState = (props) => {
9 | const initialState = {
10 | isAuthenticated: false,
11 | user: null,
12 | loading: false,
13 | current: 0,
14 | errors: [],
15 | verified: false,
16 | displayVerified: false,
17 | };
18 | const [state, dispatch] = useReducer(AuthReducer, initialState);
19 |
20 | const userLoaded = async () => {
21 | if (localStorage.token) {
22 | setAuthToken(localStorage.token);
23 | }
24 | try {
25 | const config = {
26 | headers: {
27 | "Content-Type": "application/json",
28 | },
29 | };
30 | const res = await axios.get("/api/login", config);
31 | console.log(res);
32 | dispatch({
33 | type: "USER_LOADED",
34 | payload: res.data,
35 | });
36 | setTimeout(() => {
37 | dispatch({
38 | type: "REMOVE_DISPLAY_VERIFIED",
39 | });
40 | }, 3000);
41 | return 0;
42 | } catch (err) {
43 | // console.log(err.response.data);
44 | localStorage.removeItem("token")
45 | dispatch({
46 | type: "AUTH_ERROR",
47 | });
48 |
49 | return 0;
50 | }
51 | };
52 |
53 | const register = async (formData) => {
54 | const config = {
55 | headers: {
56 | "Content-Type": "application/json",
57 | },
58 | };
59 | try {
60 | const res = await axios.post("/api/register", formData, config);
61 | dispatch({
62 | type: "REGISTER_SUCCESS",
63 | payload: res.data,
64 | });
65 | localStorage.setItem("token", res.data);
66 | userLoaded();
67 | } catch (err) {
68 | dispatch({
69 | type: "REGISTER_FAIL",
70 | payload: err.response,
71 | });
72 | console.log(err.response);
73 | setTimeout(
74 | () =>
75 | dispatch({
76 | type: "REMOVE_ALERT",
77 | }),
78 | 3500
79 | );
80 | }
81 | };
82 | const login = async (formData) => {
83 | const config = {
84 | headers: {
85 | "Content-Type": "application/json",
86 | },
87 | };
88 | try {
89 | const res = await axios.post(
90 | "https://foodeazy.herokuapp.com/api/login",
91 | formData,
92 | config
93 | );
94 | localStorage.setItem("token", res.data);
95 | dispatch({
96 | type: "LOGIN_SUCCESS",
97 | payload: res.data,
98 | });
99 | // console.log(res.data);
100 | userLoaded();
101 | setTimeout(() => {
102 | dispatch({
103 | type: "REMOVE_CURRENT",
104 | });
105 | }, 3000);
106 | return 0;
107 | } catch (err) {
108 | console.log(err.response);
109 | if (!err.response) {
110 | alert("Connection Cannot Be Made to Server");
111 | } else {
112 | dispatch({
113 | type: "LOGIN_FAIL",
114 | payload: err.response,
115 | });
116 | // console.log(err.response.data.errors[0].msg);
117 | setTimeout(
118 | () =>
119 | dispatch({
120 | type: "REMOVE_ALERT",
121 | }),
122 | 3500
123 | );
124 | }
125 | }
126 | };
127 | const set_loading = () => {
128 | dispatch({
129 | type: "SET_LOADING",
130 | });
131 | };
132 | const logout = () => {
133 | localStorage.removeItem("token");
134 | dispatch({
135 | type: "LOGOUT",
136 | });
137 | removeAuthToken();
138 | };
139 |
140 | return (
141 |
157 | {" "}
158 | {props.children}{" "}
159 |
160 | );
161 | };
162 |
163 | export default AuthState;
164 |
--------------------------------------------------------------------------------
/client/src/context/auth/removeAuthToken.js:
--------------------------------------------------------------------------------
1 | import axios from "axios";
2 |
3 | const removeAuthToken = () => {
4 | delete axios.defaults.headers.common["x-auth-token"];
5 | };
6 |
7 | export default removeAuthToken;
8 |
--------------------------------------------------------------------------------
/client/src/context/auth/setAuthToken.js:
--------------------------------------------------------------------------------
1 | import axios from "axios";
2 |
3 | const setAuthToken = token => {
4 | if (token) {
5 | axios.defaults.headers.common["x-auth-token"] = token;
6 | } else {
7 | delete axios.defaults.headers.common["x-auth-token"];
8 | }
9 | };
10 |
11 | export default setAuthToken;
12 |
--------------------------------------------------------------------------------
/client/src/context/cart/cartContext.js:
--------------------------------------------------------------------------------
1 | import React, { createContext } from "react";
2 | const CartContext = createContext();
3 | export default CartContext;
4 |
--------------------------------------------------------------------------------
/client/src/context/cart/cartReducer.js:
--------------------------------------------------------------------------------
1 | import { ADD_PRODUCT, REMOVE_PRODUCT } from "../types";
2 | export default (state, action) => {
3 | let flag = 0;
4 | switch (action.type) {
5 | case "LOAD_CART":
6 | return action.payload.data;
7 | case "ADD_PRODUCT":
8 | let a = [];
9 | state.items.forEach((item) => {
10 | if (item.name == action.payload.name) {
11 | flag = 1;
12 |
13 | a.push(action.payload);
14 | } else a.push(item);
15 | });
16 | if (flag == 0) {
17 | a.push(action.payload);
18 | }
19 | let price = 0;
20 | let quantity = 0;
21 |
22 | a.forEach((item) => {
23 | price += item.price * Number(item.q);
24 | quantity += item.q;
25 | });
26 | return {
27 | total_quantity: quantity,
28 | total_price: price,
29 | items: a
30 | };
31 | case "REMOVE_PRODUCT":
32 | let b = [];
33 | // console.log(action.payload);
34 | state.items.forEach((item) => {
35 | if (item.name == action.payload.name) {
36 | flag = 1;
37 | if (action.payload.q > 0) b.push(action.payload);
38 | } else b.push(item);
39 | });
40 | if (flag == 0) {
41 | b.push(action.payload);
42 | }
43 | let price1 = 0;
44 | let quantity1 = 0;
45 |
46 | b.forEach((item) => {
47 | price1 += item.price * Number(item.q);
48 | quantity1 += item.q;
49 | });
50 | return {
51 | total_quantity: quantity1,
52 | total_price: price1,
53 | items: b
54 | };
55 | case "CLEAR_CART":
56 | return {
57 | total_quantity: 0,
58 | total_price: 0,
59 | items: [],
60 | current: 0
61 | };
62 | case "DELETE_CLICK":
63 | let n = [];
64 | state.items.map((item) => {
65 | if (item.name !== action.payload) n.push(item);
66 | });
67 | let price2 = 0;
68 | let quantity2 = 0;
69 | n.forEach((item) => {
70 | price2 += item.price * Number(item.q);
71 | quantity2 += item.q;
72 | });
73 | return {
74 | total_quantity: quantity2,
75 | total_price: price2,
76 | items: n
77 | };
78 | case "SetLoading":
79 | return{
80 | ...state,
81 | loading2: true
82 | }
83 | case "UnsetLoading":
84 | return{
85 | ...state,
86 | loading2: false
87 | }
88 | default:
89 | return state;
90 | }
91 | };
92 |
--------------------------------------------------------------------------------
/client/src/context/cart/cartState.js:
--------------------------------------------------------------------------------
1 | import React, { useContext, useReducer } from "react";
2 | import CartContext from "./cartContext";
3 | import CartReducer from "./cartReducer";
4 | import axios from "axios";
5 | const CartState = (props) => {
6 | const initialState = {
7 | total_quantity: 0,
8 | total_price: 0,
9 | items: [],
10 | current: 0,
11 | loading2: false,
12 | clicked: 0,
13 | };
14 | const [state, dispatch] = useReducer(CartReducer, initialState);
15 | const loadCart = async () => {
16 | try {
17 | dispatch({
18 | type: "SetLoading",
19 | });
20 | const res = await axios.get("/api/cart");
21 | await dispatch({
22 | type: "LOAD_CART",
23 | payload: res.data,
24 | });
25 | dispatch({
26 | type: "UnsetLoading",
27 | });
28 | } catch (e) {
29 | console.log(e.response);
30 | }
31 | };
32 | const clearCart = async () => {
33 | const config = {
34 | headers: {
35 | "Content-Type": "application/json",
36 | },
37 | };
38 | try {
39 | const res = await axios.put("/api/cart", config);
40 | dispatch({
41 | type: "CLEAR_CART",
42 | });
43 | } catch (e) {
44 | console.log(e);
45 | }
46 | };
47 | const addProduct = (item) => {
48 | // console.log(item);
49 | dispatch({
50 | type: "ADD_PRODUCT",
51 | payload: item,
52 | });
53 | };
54 |
55 | const removeProduct = (item) => {
56 | dispatch({
57 | type: "REMOVE_PRODUCT",
58 | payload: item,
59 | });
60 | };
61 | const saveCart = async (user_id, state) => {
62 | const formData = {
63 | user_id,
64 | cart: state,
65 | };
66 | const config = {
67 | headers: {
68 | "Content-Type": "application/json",
69 | },
70 | };
71 | try {
72 | const res = await axios.post("/api/cart", formData, config);
73 | if (res.status === 200) return 1;
74 | else return 0;
75 | } catch (err) {
76 | console.log(err.response);
77 | return 0;
78 | }
79 | };
80 | const deleteClick = (item) => {
81 | dispatch({
82 | type: "DELETE_CLICK",
83 | payload: item,
84 | });
85 | };
86 | return (
87 |
102 | {" "}
103 | {props.children}{" "}
104 |
105 | );
106 | };
107 |
108 | export default CartState;
109 |
--------------------------------------------------------------------------------
/client/src/context/loading/loadingContext.js:
--------------------------------------------------------------------------------
1 | import { createContext } from "react";
2 | const LoadingContext = createContext();
3 | export default LoadingContext;
4 |
--------------------------------------------------------------------------------
/client/src/context/loading/loadingState.js:
--------------------------------------------------------------------------------
1 | import React, { useState } from "react";
2 | import LoadingContext from "./loadingContext";
3 | import Spinner from "../../images/Spinner.gif";
4 | const LoadingState = (props) => {
5 | const [loading, setLoading] = useState(1);
6 | const Loader = () => {
7 | console.log("YES");
8 | return (
9 |
19 |
20 |
21 | );
22 | };
23 | return (
24 |
25 | {props.children}
26 |
27 | );
28 | };
29 | export default LoadingState;
30 |
--------------------------------------------------------------------------------
/client/src/context/products/productReducer.js:
--------------------------------------------------------------------------------
1 | export default (state, action) => {
2 | switch (action.type) {
3 | case "LOAD_PRODUCTS":
4 | let b = [];
5 | action.payload.forEach((item) => {
6 | let x = {};
7 | x.name = item.name;
8 | x.price = item.price;
9 | x.url = item.url;
10 | x.type = item.type;
11 | x.q = 0;
12 | b.push(x);
13 | });
14 | return { ...state, items: b };
15 |
16 | case "SEARCH_PRODUCTS":
17 | let a = [];
18 | const regex = new RegExp(`${action.payload}`, "gi");
19 | state.items.forEach((item) => {
20 | if (item.name.match(regex)) a.push(item);
21 | });
22 | // console.log(a);
23 | return {
24 | ...state,
25 | filtered: a
26 | };
27 | case "CLEAR_FILTER":
28 | return {
29 | ...state,
30 | filtered: []
31 | };
32 | case "SORT_BY_PRICE":
33 | let x = state.items;
34 | x.sort(function (a, b) {
35 | return a.price - b.price;
36 | });
37 | return {
38 | ...state,
39 | items: x
40 | };
41 | case "SORT_BY_NAME":
42 | let y = state.items;
43 | y.sort((a, b) => (a.name > b.name ? 1 : -1));
44 | return {
45 | ...state,
46 | items: y
47 | };
48 | case "SetLoading":
49 | return{
50 | ...state,
51 | loading1: true
52 | }
53 | case "UnsetLoading":
54 | return{
55 | ...state,
56 | loading1: false
57 | }
58 | default:
59 | return state;
60 | }
61 | };
62 |
--------------------------------------------------------------------------------
/client/src/context/products/productState.js:
--------------------------------------------------------------------------------
1 | import React, { useReducer } from "react";
2 | import ProductContext from "./productsContext";
3 | import ProductReducer from "./productReducer";
4 | import axios from "axios";
5 |
6 | const ProductState = (props) => {
7 | const initialState = {
8 | total_quanity: 0,
9 | items: [],
10 | filtered: [],
11 | loading1: false
12 | };
13 | const loadItems = async () => {
14 | try {
15 | dispatch({ type: "SetLoading" });
16 | const res = await axios.get("api/items");
17 | await dispatch({ type: "LOAD_PRODUCTS", payload: res.data });
18 | dispatch({ type: "UnsetLoading" });
19 | return 0;
20 | } catch (e) {
21 | console.log(e.response);
22 | }
23 | };
24 | const [state, dispatch] = useReducer(ProductReducer, initialState);
25 | const search = (product) => {
26 | dispatch({ type: "SEARCH_PRODUCTS", payload: product });
27 | };
28 | const clearFilter = () => {
29 | dispatch({ type: "CLEAR_FILTER" });
30 | };
31 | const sortByPrice = () => {
32 | dispatch({ type: "SORT_BY_PRICE" });
33 | };
34 | const sortByName = () => {
35 | dispatch({ type: "SORT_BY_NAME" });
36 | };
37 | return (
38 |
51 | {" "}
52 | {props.children}
53 |
54 | );
55 | };
56 |
57 | export default ProductState;
58 |
--------------------------------------------------------------------------------
/client/src/context/products/productsContext.js:
--------------------------------------------------------------------------------
1 | import { createContext } from "react";
2 |
3 | const ProductContext = createContext();
4 |
5 | export default ProductContext;
6 |
--------------------------------------------------------------------------------
/client/src/context/types.js:
--------------------------------------------------------------------------------
1 | export const INCREASE_Q = "INCREASE_Q";
2 | export const { ADD_PRODUCT } = "ADD_PRODUCT";
3 | export const { REGISTER_SUCCESS } = "REGISTER_SUCCESS";
4 | export const { REGISTER_FAIL } = "REGISTER_FAILs";
5 | export const { USER_LOADED } = "USER_LOADED";
6 | export const { LOGIN_SUCCESS } = "LOGIN_SUCCESS";
7 | export const { LOGIN_FAIL } = "LOGIN_FAIL";
8 | export const { AUTH_ERROR } = "AUTH_ERROR";
9 | export const { LOGOUT } = "LOGOUT";
10 | export const { SET_LOADING } = "SET_LOADING";
11 |
--------------------------------------------------------------------------------
/client/src/images/404.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Devforlife07/FoodEazy/68b5028250abc385f01e9f8efdb2e976f8a92d44/client/src/images/404.jpg
--------------------------------------------------------------------------------
/client/src/images/5598.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Devforlife07/FoodEazy/68b5028250abc385f01e9f8efdb2e976f8a92d44/client/src/images/5598.jpg
--------------------------------------------------------------------------------
/client/src/images/Mihir.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Devforlife07/FoodEazy/68b5028250abc385f01e9f8efdb2e976f8a92d44/client/src/images/Mihir.jpeg
--------------------------------------------------------------------------------
/client/src/images/Spinner.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Devforlife07/FoodEazy/68b5028250abc385f01e9f8efdb2e976f8a92d44/client/src/images/Spinner.gif
--------------------------------------------------------------------------------
/client/src/images/check.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Devforlife07/FoodEazy/68b5028250abc385f01e9f8efdb2e976f8a92d44/client/src/images/check.png
--------------------------------------------------------------------------------
/client/src/images/close.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Devforlife07/FoodEazy/68b5028250abc385f01e9f8efdb2e976f8a92d44/client/src/images/close.png
--------------------------------------------------------------------------------
/client/src/images/empty.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Devforlife07/FoodEazy/68b5028250abc385f01e9f8efdb2e976f8a92d44/client/src/images/empty.png
--------------------------------------------------------------------------------
/client/src/images/noItem.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Devforlife07/FoodEazy/68b5028250abc385f01e9f8efdb2e976f8a92d44/client/src/images/noItem.png
--------------------------------------------------------------------------------
/client/src/images/tick.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Devforlife07/FoodEazy/68b5028250abc385f01e9f8efdb2e976f8a92d44/client/src/images/tick.png
--------------------------------------------------------------------------------
/client/src/index.js:
--------------------------------------------------------------------------------
1 | import React from "react";
2 | import ReactDOM from "react-dom";
3 | import AuthState from "./context/auth/authState";
4 | import CartState from "./context/cart/cartState";
5 | import ProductState from "./context/products/productState";
6 | import LoadingState from "./context/loading/loadingState";
7 |
8 | import App from "./App";
9 |
10 | const rootElement = document.getElementById("root");
11 | ReactDOM.render(
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 | ,
23 | rootElement
24 | );
25 |
--------------------------------------------------------------------------------
/client/src/mobile.css:
--------------------------------------------------------------------------------
1 | @media only screen and (max-width: 600px) {
2 | * {
3 | box-sizing: border-box;
4 | }
5 |
6 | /* .parCart {
7 | width: 100vw !important;
8 | } */
9 | .empty{
10 | margin: auto;
11 | width: 60% ;
12 | height:60%;
13 | margin-top:4rem
14 | }
15 | .Card {
16 | width: 90vw !important;
17 | display: flex !important;
18 | height: auto;
19 | margin: 0.8rem auto;
20 | padding: 0.5rem;
21 | /* height: 25vh; */
22 | flex-direction: row;
23 | justify-content: center;
24 | flex-wrap: nowrap;
25 | align-items: center;
26 | border: none;
27 | border-bottom: solid 1px rgba(0, 0, 0, 0.2) !important;
28 | }
29 |
30 | .Card img {
31 | height: 60%;
32 | }
33 |
34 | .card-body {
35 | padding: 1rem;
36 | flex: 1;
37 | }
38 |
39 | .container {
40 | padding: 0 !important;
41 | }
42 |
43 | .menuImage {
44 | padding: 0;
45 | width: 30%;
46 | flex: 1;
47 | height: 80%;
48 | }
49 |
50 | .noItem {
51 | height: auto;
52 | width: 100%;
53 | margin: 0;
54 | image-rendering: auto;
55 | vertical-align: middle;
56 | border-style: none;
57 | }
58 |
59 | .crossicon {
60 | font-size: 1.5rem;
61 | }
62 |
63 | .left_align {
64 | font-size: 0.75rem;
65 | }
66 |
67 | i:active {
68 | font-size: 0.95rem;
69 | }
70 |
71 | .itemlist {
72 | max-width: 90%;
73 | margin: auto;
74 | }
75 |
76 | .itemlist h2 {
77 | font-size: 1.2rem !important;
78 | }
79 |
80 | .numbers1 {
81 | font-size: 1.7rem !important;
82 | }
83 |
84 | .img_show {
85 | height: 100%;
86 | flex: 1;
87 | }
88 |
89 | .img_show img {
90 | width: 100% !important;
91 | margin: auto;
92 | }
93 |
94 | .navbar {
95 | text-align: center !important;
96 | }
97 |
98 | .mobileNav {
99 | position: sticky;
100 | top: 3.8rem !important;
101 | z-index: 10097;
102 | display: flex;
103 | align-items: center;
104 | justify-content: center;
105 | height: 9vh;
106 | background: #007bff;
107 | }
108 |
109 | .titl {
110 | width: 100%;
111 | font-size: 1.5rem;
112 | }
113 |
114 | .hamburger {
115 | display: block;
116 | color: white;
117 | cursor: pointer;
118 | }
119 |
120 | .mainSide {
121 | display: flex;
122 | position: fixed;
123 | margin: -100000000px;
124 | width: 100%;
125 | /* height: 100vh ; */
126 | overflow: hidden;
127 | z-index: 1000900900;
128 | }
129 |
130 | .mainSide .left {
131 | flex: 2;
132 | height: 100vh;
133 | background: #007bff;
134 | }
135 |
136 | .mainSide .left ul {
137 | margin: 0;
138 | padding: 0;
139 | }
140 |
141 | .mainSide .left ul li {
142 | color: white;
143 | width: 100%;
144 | margin: 1.5rem auto;
145 | padding: 0;
146 | }
147 |
148 | .mainSide .right {
149 | flex: 1;
150 | display: flex;
151 | justify-content: flex-end;
152 | padding: 1rem;
153 | }
154 |
155 | .minus {
156 | /* position: absolute; */
157 | transition: all 0.5s ease-in;
158 | margin: auto;
159 | /* left: 0; */
160 | /* top: 0; */
161 | }
162 |
163 | .navLogout {
164 | display: none;
165 | }
166 |
167 | .name {
168 | color: white;
169 | padding: 1rem 0.1rem;
170 | white-space: wrap;
171 | font-size: 1.2rem;
172 | font-weight: bold;
173 | }
174 |
175 | .toast {
176 | width: 50vw;
177 | height: 17vh;
178 | }
179 |
180 | .forget {
181 | width: 95%;
182 | padding: 2.5rem 0;
183 | }
184 |
185 | .paymentContainer {
186 | flex-direction: column;
187 | }
188 |
189 | .order {
190 | border: none;
191 | }
192 |
193 | .cartItems {
194 | display: flex;
195 | flex-direction: column-reverse;
196 | }
197 |
198 | .summary {
199 | width: 100% !important;
200 | max-width: 100%;
201 | }
202 |
203 | .details {
204 | width: 100%;
205 | margin: 0;
206 | display: flex;
207 | flex-direction: column;
208 | }
209 |
210 | .details>div {
211 | margin: 0;
212 | padding: 0.3rem;
213 | display: flex;
214 | justify-content: space-evenly;
215 | }
216 |
217 | .hungryImage {
218 | display: block;
219 | }
220 |
221 | .pastOrderContainer {
222 | flex-direction: column;
223 | margin: 0;
224 | width: 100%;
225 | }
226 |
227 | .pastOrderContainer>h1 {
228 | text-align: center;
229 | }
230 |
231 | .pastOrderContainer div {
232 | width: 100% !important;
233 | flex-direction: column;
234 | }
235 |
236 | .mainComponent>div {
237 | width: 100%;
238 | }
239 |
240 | .i1 .info>div {
241 | flex-direction: column;
242 | }
243 |
244 | .buttonsCart {
245 | width: 100%;
246 | }
247 |
248 | .i1 .info {
249 | flex-direction: column;
250 | }
251 |
252 | .parent1 {
253 | flex-direction: column;
254 | flex-wrap: none;
255 |
256 | }
257 |
258 | .forget1 {
259 | width: 90%;
260 | margin: auto;
261 | }
262 |
263 | .verifyImage {
264 | width: 80%;
265 | margin: auto;
266 | }
267 |
268 | .verifyImage>img {
269 | width: 100%;
270 | max-width: 100vw;
271 | height: 100%;
272 | }
273 |
274 | .sortButton {
275 | display: flex;
276 | width: 95vw;
277 | margin: auto;
278 | justify-content: flex-end;
279 |
280 | }
281 |
282 | .dropdown>.btn {
283 | max-height: 7vh;
284 | padding: 0.3 0.5rem;
285 | width: 30vw;
286 | }
287 |
288 | .img_show2 {
289 | width: 30%;
290 | }
291 |
292 |
293 | }
--------------------------------------------------------------------------------
/config/db.js:
--------------------------------------------------------------------------------
1 | const mongoose = require("mongoose");
2 | const config = require("config");
3 |
4 | const connectDB = () => {
5 | mongoose
6 | .connect(config.get("mongoURL"), {
7 | useNewUrlParser: true,
8 | useUnifiedTopology: true,
9 | useCreateIndex: true,
10 | useFindAndModify: true
11 | })
12 | .then(() => console.log("MongoDB Connected..."))
13 | .catch(err => console.log(err.message));
14 | };
15 |
16 | module.exports = connectDB;
--------------------------------------------------------------------------------
/controllers/upload.js:
--------------------------------------------------------------------------------
1 | const multer = require("multer");
2 | const path = require("path");
3 | const storage = multer.diskStorage({})
4 | const upload = multer({
5 | storage: storage,
6 | limits: {
7 | files: 100,
8 | fileSize: 1 * 512 * 1024
9 | },
10 | fileFilter: function (req, file, callback) {
11 | var ext = path.extname(file.originalname);
12 | if (ext !== '.png' && ext !== '.jpg' && ext !== '.gif' && ext !== '.jpeg') {
13 | return callback(new Error('Only images are allowed'))
14 | }
15 | callback(null, true)
16 | }
17 | }).single("productImage")
18 | module.exports = upload;
--------------------------------------------------------------------------------
/default.conf:
--------------------------------------------------------------------------------
1 | server {
2 | listen 80;
3 | listen [::]:80;
4 |
5 | root /var/www/html/;
6 | server_name foodeazy.devforlife07.codes www.foodeazy.devforlife07.codes;
7 | index index.html index.htm index.nginx-debian.html;
8 |
9 | server_name localhost;
10 |
11 | location / {
12 | proxy_pass http://mainapp:5000;
13 | }
14 |
15 | # location ~ /.well-known/acme-challenge {
16 | location ~ /\.well-known/acme-challenge {
17 | allow all;
18 | # try_files $uri =404;
19 | root /var/www/html/;
20 | }
21 | }
--------------------------------------------------------------------------------
/docker-compose.yml:
--------------------------------------------------------------------------------
1 | version: "3"
2 | services:
3 | mainapp:
4 | container_name: node
5 | build: ./
6 | ports:
7 | - "5000:5000"
8 | webserver:
9 | container_name: nginx
10 | image: nginx:latest
11 | ports:
12 | - "80:80"
13 | - "443:443"
14 | volumes:
15 | - ./build:/var/www/html
16 | - ./default.conf:/etc/nginx/conf.d/default.conf
17 | - certbot-etc:/etc/letsencrypt
18 | - certbot-var:/var/lib/letsencrypt
19 | certbot:
20 | image: certbot/certbot
21 | container_name: certbot
22 | volumes:
23 | - certbot-etc:/etc/letsencrypt
24 | - certbot-var:/var/lib/letsencrypt
25 | - web-root:/var/www/html
26 | depends_on:
27 | - webserver
28 | command: certonly --webroot --webroot-path=/var/www/html --email devansh.forlife@gmail.com --agree-tos --no-eff-email --staging -d foodeazy.devforlife07.codes -d www.foodeazy.devforlife07.codes
29 | # letsencrypt-nginx-container:
30 | # container_name: 'letsencrypt-nginx-container'
31 | # image: nginx:latest
32 | # ports:
33 | # - "80:80"
34 | # volumes:
35 | # - ./default.conf:/etc/nginx/conf.d/default.conf
36 | # - ./build:/var/www/html
37 | # depends_on:
38 | # - mainapp
39 |
40 |
41 |
42 | networks:
43 | docker-network:
44 | driver: bridge
45 |
46 | volumes:
47 | certbot-etc:
48 | certbot-var:
49 | web-root:
50 | driver: local
51 | driver_opts:
52 | type: none
53 | device: C:\Users\Devansh\Desktop\foodeazy2
54 | o: bind
55 |
--------------------------------------------------------------------------------
/images/productImage-1598290103896-821019517.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Devforlife07/FoodEazy/68b5028250abc385f01e9f8efdb2e976f8a92d44/images/productImage-1598290103896-821019517.jpg
--------------------------------------------------------------------------------
/images/productImage-1598290116053-614118570.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Devforlife07/FoodEazy/68b5028250abc385f01e9f8efdb2e976f8a92d44/images/productImage-1598290116053-614118570.jpg
--------------------------------------------------------------------------------
/images/productImage-1598290127103-668259691.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Devforlife07/FoodEazy/68b5028250abc385f01e9f8efdb2e976f8a92d44/images/productImage-1598290127103-668259691.jpg
--------------------------------------------------------------------------------
/middleware/auth.js:
--------------------------------------------------------------------------------
1 | const jwt = require('jsonwebtoken');
2 | const config = require('config');
3 |
4 | module.exports = function (req, res, next) {
5 | const token = req.header('x-auth-token');
6 | if (!token)
7 | return res.status(401).json("No token");
8 |
9 | try {
10 | const decoded = jwt.verify(token, config.get('jwtSecret'));
11 | req.user = decoded.user;
12 | next();
13 |
14 | } catch (err) {
15 | console.log("Invalid token");
16 | return res.sendStatus(400)
17 | }
18 | }
--------------------------------------------------------------------------------
/models/forget.js:
--------------------------------------------------------------------------------
1 | const mongoose = require("mongoose")
2 | const Schema = mongoose.Schema;
3 |
4 | const forgetSchema = new Schema({
5 | email: {
6 | type : String,
7 | required: true
8 | },
9 | code : {
10 | type :String,
11 | required: true
12 | }
13 | })
14 |
15 | module.exports = mongoose.model("Forget", forgetSchema);
--------------------------------------------------------------------------------
/models/orders.js:
--------------------------------------------------------------------------------
1 | const mongoose = require("mongoose")
2 | const Schema = mongoose.Schema;
3 |
4 | const orders = new Schema({
5 | user: {
6 | type: mongoose.Schema.Types.ObjectId,
7 | ref: "auth",
8 | required: true
9 | },
10 | order_id: {
11 | type: String
12 | },
13 | mode: {
14 | type: String,
15 | required: true
16 | },
17 | order: {
18 | total_quantity: {
19 | type: Number,
20 | default: 0,
21 | required: true
22 | },
23 |
24 | total_price: {
25 | type: Number,
26 | default: 0,
27 | required: true
28 | },
29 | items: [{
30 | name: {
31 | type: String,
32 | required: true
33 | },
34 | price: {
35 | type: Number,
36 | required: true
37 | },
38 | q: {
39 | type: Number,
40 | required: true
41 | }
42 | }]
43 |
44 | },
45 | deliveryCharges: {
46 | type: Number,
47 | default: 0
48 | },
49 | status: {
50 | type: String,
51 | default: false
52 | },
53 | address: {
54 | type: Object
55 | },
56 | payment: {
57 | type: String
58 | },
59 | time: {
60 | type: Date,
61 | default: Date.now()
62 | }
63 |
64 | })
65 |
66 | module.exports = mongoose.model("orders", orders);
--------------------------------------------------------------------------------
/models/product.js:
--------------------------------------------------------------------------------
1 | const mongoose = require("mongoose")
2 | const Schema = mongoose.Schema;
3 | const productSchema = new Schema({
4 | name: {
5 | type: String,
6 | required: true,
7 | trim: true
8 | },
9 | price: {
10 | type: Number,
11 | required: true
12 | },
13 | type: {
14 | type: String,
15 | required: true,
16 | default : 'Veg'
17 | },
18 | url: {
19 | type:String,
20 | required : true
21 | }
22 |
23 | })
24 | module.exports = mongoose.model("Products", productSchema)
--------------------------------------------------------------------------------
/models/register.js:
--------------------------------------------------------------------------------
1 | const mongoose = require('mongoose');
2 | const Schema = mongoose.Schema;
3 |
4 | const register = new Schema({
5 | name: {
6 | type: String,
7 | required: true
8 | },
9 | uid: {
10 | type: String
11 | },
12 | role: {
13 | type: String,
14 | default: "user",
15 | enum: ["user", "admin"]
16 | },
17 | verify: {
18 | type: Boolean,
19 | default: false
20 | },
21 | email: {
22 | type: String,
23 | required: true
24 | },
25 | time: {
26 | type: Date,
27 | default: Date.now()
28 | },
29 | number: {
30 | type: Number,
31 | required: true
32 | },
33 | password: {
34 | type: String,
35 | required: true
36 | },
37 | cart: {
38 | total_quantity: {
39 | type: Number,
40 | default: 0,
41 | required: true
42 | },
43 |
44 | total_price: {
45 | type: Number,
46 | default: 0,
47 | required: true
48 | },
49 | items: [{
50 | name: {
51 | type: String,
52 | required: true
53 | },
54 | price: {
55 | type: Number,
56 | required: true
57 | },
58 | q: {
59 | type: Number,
60 | required: true
61 | },
62 | url: {
63 | type: String,
64 | required: true
65 | }
66 | }]
67 |
68 | },
69 | orders: [{
70 | total_quantity: {
71 | type: Number,
72 | default: 0,
73 | required: true
74 | },
75 |
76 | total_price: {
77 | type: Number,
78 | default: 0,
79 | required: true
80 | },
81 | items: [{
82 | name: {
83 | type: String,
84 | required: true
85 | },
86 | price: {
87 | type: Number,
88 | required: true
89 | },
90 | q: {
91 | type: Number,
92 | required: true
93 | },
94 | url: {
95 | type: String,
96 | required: true
97 | }
98 | }]
99 |
100 | }]
101 |
102 | })
103 |
104 | module.exports = mongoose.model('auth', register);
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "node-http-server",
3 | "version": "1.0.0",
4 | "description": "Node.js example server starter project",
5 | "main": "src/index.js",
6 | "scripts": {
7 | "start": "node server.js",
8 | "build": "cd client && npm run build",
9 | "install-client": "cd client && npm install",
10 | "client": "cd client && npm start",
11 | "dev": "concurrently \"node server.js\" \"npm run client\"",
12 | "heroku-postbuild": "npm run install-client and npm run build"
13 | },
14 | "dependencies": {
15 | "bcryptjs": "^2.4.3",
16 | "body-parser": "1.19.0",
17 | "cloudinary": "^1.22.0",
18 | "config": "3.3.1",
19 | "cors": "^2.8.5",
20 | "cron": "^1.8.2",
21 | "crypto": "^1.0.1",
22 | "dotenv": "^8.2.0",
23 | "express": "4.17.1",
24 | "express-validator": "^6.6.0",
25 | "jsonwebtoken": "^8.5.1",
26 | "mongoose": "5.9.25",
27 | "morgan": "^1.10.0",
28 | "multer": "^1.4.2",
29 | "nodemailer": "^6.4.10",
30 | "nodemailer-sendgrid-transport": "^0.2.0",
31 | "query-string": "^6.13.1",
32 | "querystring": "^0.2.0",
33 | "shortid": "^2.2.15",
34 | "uuid": "^8.3.0"
35 | },
36 | "devDependencies": {
37 | "nodemon": "1.18.4"
38 | },
39 | "keywords": []
40 | }
41 |
--------------------------------------------------------------------------------
/paytm/checksum.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 |
3 | var crypt = require('./crypt');
4 | var util = require('util');
5 | var crypto = require('crypto');
6 |
7 | //mandatory flag: when it set, only mandatory parameters are added to checksum
8 |
9 | function paramsToString(params, mandatoryflag) {
10 | var data = '';
11 | var tempKeys = Object.keys(params);
12 | tempKeys.sort();
13 | // console.log(tempKeys)
14 | tempKeys.forEach(function (key) {
15 | // console.log(params[key])
16 | var n = params[key].includes("REFUND");
17 | var m = params[key].includes("|");
18 | if (n == true) {
19 | params[key] = "";
20 | }
21 | if (m == true) {
22 | params[key] = "";
23 | }
24 | if (key !== 'CHECKSUMHASH') {
25 | if (params[key] === 'null') params[key] = '';
26 | if (!mandatoryflag || mandatoryParams.indexOf(key) !== -1) {
27 | data += (params[key] + '|');
28 | }
29 | }
30 | });
31 | return data;
32 | }
33 |
34 |
35 | function genchecksum(params, key, cb) {
36 | var data = paramsToString(params);
37 | crypt.gen_salt(4, function (err, salt) {
38 | var sha256 = crypto.createHash('sha256').update(data + salt).digest('hex');
39 | var check_sum = sha256 + salt;
40 | var encrypted = crypt.encrypt(check_sum, key);
41 | cb(undefined, encrypted);
42 | });
43 | }
44 |
45 | function genchecksumbystring(params, key, cb) {
46 |
47 | crypt.gen_salt(4, function (err, salt) {
48 | var sha256 = crypto.createHash('sha256').update(params + '|' + salt).digest('hex');
49 | var check_sum = sha256 + salt;
50 | var encrypted = crypt.encrypt(check_sum, key);
51 |
52 | var CHECKSUMHASH = encodeURIComponent(encrypted);
53 | CHECKSUMHASH = encrypted;
54 | cb(undefined, CHECKSUMHASH);
55 | });
56 | }
57 |
58 | function verifychecksum(params, key, checksumhash) {
59 | var data = paramsToString(params, false);
60 |
61 | //TODO: after PG fix on thier side remove below two lines
62 | if (typeof checksumhash !== "undefined") {
63 | checksumhash = checksumhash.replace('\n', '');
64 | checksumhash = checksumhash.replace('\r', '');
65 | var temp = decodeURIComponent(checksumhash);
66 | var checksum = crypt.decrypt(temp, key);
67 | var salt = checksum.substr(checksum.length - 4);
68 | var sha256 = checksum.substr(0, checksum.length - 4);
69 | var hash = crypto.createHash('sha256').update(data + salt).digest('hex');
70 | if (hash === sha256) {
71 | return true;
72 | } else {
73 | util.log("checksum is wrong");
74 | return false;
75 | }
76 | } else {
77 | util.log("checksum not found");
78 | return false;
79 | }
80 | }
81 |
82 | function verifychecksumbystring(params, key, checksumhash) {
83 |
84 | var checksum = crypt.decrypt(checksumhash, key);
85 | var salt = checksum.substr(checksum.length - 4);
86 | var sha256 = checksum.substr(0, checksum.length - 4);
87 | var hash = crypto.createHash('sha256').update(params + '|' + salt).digest('hex');
88 | if (hash === sha256) {
89 | return true;
90 | } else {
91 | util.log("checksum is wrong");
92 | return false;
93 | }
94 | }
95 |
96 | function genchecksumforrefund(params, key, cb) {
97 | var data = paramsToStringrefund(params);
98 | crypt.gen_salt(4, function (err, salt) {
99 | var sha256 = crypto.createHash('sha256').update(data + salt).digest('hex');
100 | var check_sum = sha256 + salt;
101 | var encrypted = crypt.encrypt(check_sum, key);
102 | params.CHECKSUM = encodeURIComponent(encrypted);
103 | cb(undefined, params);
104 | });
105 | }
106 |
107 | function paramsToStringrefund(params, mandatoryflag) {
108 | var data = '';
109 | var tempKeys = Object.keys(params);
110 | tempKeys.sort();
111 | tempKeys.forEach(function (key) {
112 | var m = params[key].includes("|");
113 | if (m == true) {
114 | params[key] = "";
115 | }
116 | if (key !== 'CHECKSUMHASH') {
117 | if (params[key] === 'null') params[key] = '';
118 | if (!mandatoryflag || mandatoryParams.indexOf(key) !== -1) {
119 | data += (params[key] + '|');
120 | }
121 | }
122 | });
123 | return data;
124 | }
125 |
126 | module.exports.genchecksum = genchecksum;
127 | module.exports.verifychecksum = verifychecksum;
128 | module.exports.verifychecksumbystring = verifychecksumbystring;
129 | module.exports.genchecksumbystring = genchecksumbystring;
130 | module.exports.genchecksumforrefund = genchecksumforrefund;
--------------------------------------------------------------------------------
/paytm/crypt.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 |
3 | var crypto = require('crypto');
4 | var util = require('util');
5 |
6 | var crypt = {
7 | iv: '@@@@&&&###$$$$',
8 |
9 | encrypt: function (data,custom_key) {
10 | var iv = this.iv;
11 | var key = custom_key;
12 | var algo = '256';
13 | switch (key.length) {
14 | case 16:
15 | algo = '128';
16 | break;
17 | case 24:
18 | algo = '192';
19 | break;
20 | case 32:
21 | algo = '256';
22 | break;
23 |
24 | }
25 | var cipher = crypto.createCipheriv('AES-' + algo + '-CBC', key, iv);
26 | //var cipher = crypto.createCipher('aes256',key);
27 | var encrypted = cipher.update(data, 'binary', 'base64');
28 | encrypted += cipher.final('base64');
29 | return encrypted;
30 | },
31 |
32 | decrypt: function (data,custom_key) {
33 | var iv = this.iv;
34 | var key = custom_key;
35 | var algo = '256';
36 | switch (key.length) {
37 | case 16:
38 | algo = '128';
39 | break;
40 | case 24:
41 | algo = '192';
42 | break;
43 | case 32:
44 | algo = '256';
45 | break;
46 | }
47 | var decipher = crypto.createDecipheriv('AES-' + algo + '-CBC', key, iv);
48 | var decrypted = decipher.update(data, 'base64', 'binary');
49 | try {
50 | decrypted += decipher.final('binary');
51 | } catch (e) {
52 | util.log(util.inspect(e));
53 | }
54 | return decrypted;
55 | },
56 |
57 | gen_salt: function (length, cb) {
58 | crypto.randomBytes((length * 3.0) / 4.0, function (err, buf) {
59 | var salt;
60 | if (!err) {
61 | salt = buf.toString("base64");
62 | }
63 | //salt=Math.floor(Math.random()*8999)+1000;
64 | cb(err, salt);
65 | });
66 | },
67 |
68 | /* one way md5 hash with salt */
69 | md5sum: function (salt, data) {
70 | return crypto.createHash('md5').update(salt + data).digest('hex');
71 | },
72 | sha256sum: function (salt, data) {
73 | return crypto.createHash('sha256').update(data + salt).digest('hex');
74 | }
75 | };
76 |
77 | module.exports = crypt;
78 |
79 | (function () {
80 | var i;
81 |
82 | function logsalt(err, salt) {
83 | if (!err) {
84 | console.log('salt is ' + salt);
85 | }
86 | }
87 |
88 | if (require.main === module) {
89 | var enc = crypt.encrypt('One97');
90 | console.log('encrypted - ' + enc);
91 | console.log('decrypted - ' + crypt.decrypt(enc));
92 |
93 | for (i = 0; i < 5; i++) {
94 | crypt.gen_salt(4, logsalt);
95 | }
96 | }
97 |
98 | }());
99 |
--------------------------------------------------------------------------------
/paytm/server.js:
--------------------------------------------------------------------------------
1 | const http = require('http');
2 | const https = require('https');
3 | const qs = require('querystring');
4 | const port = 8080;
5 | const checksum_lib = require('./checksum.js');
6 |
7 | var PaytmConfig = {
8 | mid: "XXXXXXXXXXXXXXXXXXXX",
9 | key: "XXXXXXXXXXXXXXXX",
10 | website: "XXXXXXXXXX"
11 | }
12 |
13 |
14 | http.createServer(function (req, res) {
15 |
16 | switch(req.url){
17 | case "/":
18 | var params = {};
19 | params['MID'] = PaytmConfig.mid;
20 | params['WEBSITE'] = PaytmConfig.website;
21 | params['CHANNEL_ID'] = 'WEB';
22 | params['INDUSTRY_TYPE_ID'] = 'Retail';
23 | params['ORDER_ID'] = 'TEST_' + new Date().getTime();
24 | params['CUST_ID'] = 'Customer001';
25 | params['TXN_AMOUNT'] = '1.00';
26 | params['CALLBACK_URL'] = 'http://localhost:'+port+'/callback';
27 | params['EMAIL'] = 'abc@mailinator.com';
28 | params['MOBILE_NO'] = '7777777777';
29 |
30 | checksum_lib.genchecksum(params, PaytmConfig.key, function (err, checksum) {
31 |
32 | var txn_url = "https://securegw-stage.paytm.in/theia/processTransaction"; // for staging
33 | // var txn_url = "https://securegw.paytm.in/theia/processTransaction"; // for production
34 |
35 | var form_fields = "";
36 | for(var x in params){
37 | form_fields += " ";
38 | }
39 | form_fields += " ";
40 |
41 | res.writeHead(200, {'Content-Type': 'text/html'});
42 | res.write('Merchant Checkout Page Please do not refresh this page... ');
43 | res.end();
44 | });
45 | break;
46 |
47 | case "/callback":
48 |
49 | var body = '';
50 |
51 | req.on('data', function (data) {
52 | body += data;
53 | });
54 |
55 | req.on('end', function () {
56 | var html = "";
57 | var post_data = qs.parse(body);
58 |
59 |
60 | // received params in callback
61 | console.log('Callback Response: ', post_data, "\n");
62 | html += "Callback Response ";
63 | for(var x in post_data){
64 | html += x + " => " + post_data[x] + " ";
65 | }
66 | html += " ";
67 |
68 |
69 | // verify the checksum
70 | var checksumhash = post_data.CHECKSUMHASH;
71 | // delete post_data.CHECKSUMHASH;
72 | var result = checksum_lib.verifychecksum(post_data, PaytmConfig.key, checksumhash);
73 | console.log("Checksum Result => ", result, "\n");
74 | html += "Checksum Result => " + (result? "True" : "False");
75 | html += " ";
76 |
77 |
78 |
79 | // Send Server-to-Server request to verify Order Status
80 | var params = {"MID": PaytmConfig.mid, "ORDERID": post_data.ORDERID};
81 |
82 | checksum_lib.genchecksum(params, PaytmConfig.key, function (err, checksum) {
83 |
84 | params.CHECKSUMHASH = checksum;
85 | post_data = 'JsonData='+JSON.stringify(params);
86 |
87 | var options = {
88 | hostname: 'securegw-stage.paytm.in', // for staging
89 | // hostname: 'securegw.paytm.in', // for production
90 | port: 443,
91 | path: '/merchant-status/getTxnStatus',
92 | method: 'POST',
93 | headers: {
94 | 'Content-Type': 'application/x-www-form-urlencoded',
95 | 'Content-Length': post_data.length
96 | }
97 | };
98 |
99 |
100 | // Set up the request
101 | var response = "";
102 | var post_req = https.request(options, function(post_res) {
103 | post_res.on('data', function (chunk) {
104 | response += chunk;
105 | });
106 |
107 | post_res.on('end', function(){
108 | console.log('S2S Response: ', response, "\n");
109 |
110 | var _result = JSON.parse(response);
111 | html += "Status Check Response ";
112 | for(var x in _result){
113 | html += x + " => " + _result[x] + " ";
114 | }
115 |
116 | res.writeHead(200, {'Content-Type': 'text/html'});
117 | res.write(html);
118 | res.end();
119 | });
120 | });
121 |
122 | // post the data
123 | post_req.write(post_data);
124 | post_req.end();
125 | });
126 | });
127 |
128 | break;
129 | }
130 |
131 |
132 | }).listen(port);
133 |
--------------------------------------------------------------------------------
/readme_images/add_dish.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Devforlife07/FoodEazy/68b5028250abc385f01e9f8efdb2e976f8a92d44/readme_images/add_dish.png
--------------------------------------------------------------------------------
/readme_images/cart.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Devforlife07/FoodEazy/68b5028250abc385f01e9f8efdb2e976f8a92d44/readme_images/cart.png
--------------------------------------------------------------------------------
/readme_images/checkout.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Devforlife07/FoodEazy/68b5028250abc385f01e9f8efdb2e976f8a92d44/readme_images/checkout.png
--------------------------------------------------------------------------------
/readme_images/contact_us.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Devforlife07/FoodEazy/68b5028250abc385f01e9f8efdb2e976f8a92d44/readme_images/contact_us.png
--------------------------------------------------------------------------------
/readme_images/delete_items.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Devforlife07/FoodEazy/68b5028250abc385f01e9f8efdb2e976f8a92d44/readme_images/delete_items.png
--------------------------------------------------------------------------------
/readme_images/login.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Devforlife07/FoodEazy/68b5028250abc385f01e9f8efdb2e976f8a92d44/readme_images/login.png
--------------------------------------------------------------------------------
/readme_images/menu.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Devforlife07/FoodEazy/68b5028250abc385f01e9f8efdb2e976f8a92d44/readme_images/menu.png
--------------------------------------------------------------------------------
/readme_images/order.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Devforlife07/FoodEazy/68b5028250abc385f01e9f8efdb2e976f8a92d44/readme_images/order.png
--------------------------------------------------------------------------------
/readme_images/verify.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Devforlife07/FoodEazy/68b5028250abc385f01e9f8efdb2e976f8a92d44/readme_images/verify.png
--------------------------------------------------------------------------------
/routes/admin.js:
--------------------------------------------------------------------------------
1 | const express = require("express");
2 | const upload = require("../controllers/upload");
3 | const Router = express.Router();
4 | const Product = require("../models/product");
5 | const User = require("../models/register");
6 | const Cloudinary = require("cloudinary");
7 | const auth = require("../middleware/auth");
8 | const config = require("config");
9 | Cloudinary.config({
10 | cloud_name: "devforlife07",
11 | api_key: config.get("api_key"),
12 | api_secret: config.get("api_secret"),
13 | });
14 |
15 | Router.post("/upload", auth, async (req, res) => {
16 | upload(req, res, async (err) => {
17 | if (err) {
18 | res.status(400).json(err);
19 | } else {
20 | let user = await User.findOne({ _id: req.user.id });
21 | if (user.role !== "admin")
22 | return res
23 | .status(401)
24 | .json(
25 | "Your request was processed but only admins are allowed to add or remove items!"
26 | );
27 | let product = await Product.findOne({
28 | name: req.body.name,
29 | });
30 |
31 | if (product) return res.status(400).json("Product already exists!");
32 | Cloudinary.v2.uploader.upload(req.file.path, async function (
33 | error,
34 | result
35 | ) {
36 | product = new Product({
37 | type: req.body.type,
38 | name: req.body.name,
39 | price: req.body.price,
40 | url: result.url,
41 | });
42 | try {
43 | await product.save();
44 | return res.status(200).json("Item Saved Successfully!");
45 | } catch (e) {
46 | console.log(e);
47 | res.status(500).send("Server Error");
48 | }
49 | });
50 | }
51 | });
52 | });
53 |
54 | Router.get("/items", async (req, res) => {
55 | Product.find({}, (err, items) => {
56 | if (err) res.status(400).json(err);
57 | res.status(200).json(items);
58 | });
59 | });
60 |
61 | Router.post("/items", auth, async (req, res) => {
62 | try {
63 | let user = await User.findOne({ _id: req.user.id });
64 | if (user.role !== "admin")
65 | return res
66 | .status(401)
67 | .json(
68 | "Your request was processed but only admins are allowed to add or remove items!"
69 | );
70 | const item = await Product.deleteOne({
71 | name: req.body.name,
72 | });
73 | res.status(200).send(item);
74 | } catch (e) {
75 | console.log(e);
76 | res.sendStatus(500);
77 | }
78 | });
79 | module.exports = Router;
80 |
--------------------------------------------------------------------------------
/routes/cart.js:
--------------------------------------------------------------------------------
1 | const express = require("express");
2 | const router = express.Router();
3 | const cors = require("cors");
4 | const User = require("../models/register");
5 | const Products = require("../models/product");
6 | const auth = require("../middleware/auth")
7 |
8 | router.post("/", async (req, res) => {
9 | let {
10 | user_id,
11 | cart
12 | } = req.body;
13 | if (cart.items.length === 0)
14 | return res.status(400).json({
15 | msg: "Cart is Empty"
16 | });
17 | let cart1 = {};
18 | (cart1.total_price = cart.total_price),
19 | (cart1.total_quantity = cart.total_quantity),
20 | (cart1.items = []);
21 | cart.items.forEach((item) => {
22 | cart1.items.push(item);
23 | });
24 | try {
25 | cart = await User.findByIdAndUpdate(user_id, {
26 | cart: cart1
27 | }, {
28 | new: true
29 | });
30 | res.status(200).send({
31 | msg: "Cart Saved Successfully",
32 | cart
33 | })
34 | } catch (e) {
35 | console.log(e);
36 | }
37 | });
38 | router.put("/", auth, async (req, res) => {
39 |
40 | try {
41 | cart = await User.findByIdAndUpdate(
42 | req.user.id, {
43 | cart: {
44 | total_quantity: 0,
45 | total_price: 0,
46 | items: []
47 | }
48 | }, {
49 | new: true,
50 | }
51 | );
52 | res.status(200).send({
53 | msg: "Cart Saved Successfully",
54 | cart,
55 | });
56 | } catch (e) {
57 | console.log(e);
58 | }
59 | });
60 | router.get("/", auth, async (req, res) => {
61 | try {
62 | let x = {};
63 | const user = await User.findById(req.user.id);
64 | x.total_quantity = 0;
65 | x.total_price = 0;
66 | x.items = [];
67 | let y = user.cart.items.length;
68 | let z = 0;
69 | if (y == 0)
70 | res.status(200).send({
71 | data: x
72 | })
73 | user.cart.items.forEach(async item => {
74 | const product = await Products.findOne({
75 | name: item.name
76 | });
77 | if (product) {
78 | x.items.push(item);
79 | x.total_price += (item.price * item.q);
80 | x.total_quantity += (item.q);
81 | }
82 | z++;
83 | if (z == y) {
84 | res.status(200).send({
85 | data: x
86 | })
87 | }
88 |
89 | })
90 |
91 | } catch (e) {
92 | res.status(500).send({
93 | msg: e
94 | })
95 | }
96 | })
97 |
98 | module.exports = router;
--------------------------------------------------------------------------------
/routes/forget.js:
--------------------------------------------------------------------------------
1 | const express = require("express");
2 | const router = express.Router();
3 | const Forget = require('../models/forget')
4 | const User = require("../models/register");
5 | const nodemailer = require('nodemailer');
6 | const sendgridTransport = require('nodemailer-sendgrid-transport');
7 | const shortid = require('shortid');
8 |
9 | const transporter = nodemailer.createTransport(
10 | sendgridTransport({
11 | auth: {
12 | api_key:
13 | process.env.SEND_GRID_KEY
14 | }
15 | })
16 | );
17 |
18 |
19 | router.post("/", async(req, res)=>{
20 | let {email} = req.body;
21 | User.findOne({email}, async(err, user)=>{
22 | if(err)
23 | {
24 | console.log(err);
25 | res.status(400).json(err);
26 | }
27 | else if(!user)
28 | {
29 | console.log(err);
30 | res.status(400).json("User not registered!");
31 | }
32 | else
33 | {
34 | let code = shortid.generate();
35 | let link = `https::/foodeazy.herokuapp.com/api/forget/${code}`;
36 | Forget.findOneAndDelete({email}, (err)=>{
37 | if(err)
38 | console.log(err);
39 | })
40 | forget = new Forget({
41 | email,
42 | code
43 | })
44 | await forget.save();
45 | let name = user.name;
46 |
47 | var mailOptions = {
48 | from: "food.eazy1@gmail.com",
49 | to: `${email}` ,
50 | subject: "Reset your password for Food Eazy",
51 | text: "That was easy!",
52 | html: "Hi, " + name+" Follow this Link to reset your passowrd.
If this request is not made by you kindly ignore this mail.
Regards, Food Eazy
",
53 | };
54 | transporter.sendMail(mailOptions, function (error, info) {
55 | if (error) {
56 | console.log(error);
57 | } else {
58 | res.status(200).json('Reset Email Sent to your mail id');
59 | }
60 | })
61 |
62 |
63 | }
64 | })
65 | })
66 |
67 |
68 | module.exports = router;
--------------------------------------------------------------------------------
/routes/image.js:
--------------------------------------------------------------------------------
1 | const Router = require("express").Router();
2 | const fs = require("fs");
3 |
4 | Router.get("/:id", (req, res) => {
5 | const file = fs.readFile("./images/" + req.params.id, (err, file) => {
6 | if (err) {
7 | console.log(err)
8 | res.sendStatus(500)
9 | } else {
10 | console.log(file);
11 | res.send(file);
12 | }
13 | })
14 | })
15 | module.exports = Router;
--------------------------------------------------------------------------------
/routes/items.js:
--------------------------------------------------------------------------------
1 | const Router = require("express").Router();
2 | const Product = require("../models/product");
3 | Router.get('/', async (req, res) => {
4 | Product.find({}, (err, items) => {
5 | if (err)
6 | res.status(400).send(err);
7 |
8 | res.status(200).send(items);
9 |
10 | })
11 | })
12 | module.exports = Router;
--------------------------------------------------------------------------------
/routes/login.js:
--------------------------------------------------------------------------------
1 | const express = require("express");
2 | const router = express.Router();
3 | const Register = require("../models/register");
4 | const bcrypt = require("bcryptjs");
5 | const cors = require("cors");
6 | const jwt = require("jsonwebtoken");
7 | const { check, validationResult } = require("express-validator");
8 | const config = require("config");
9 | const auth = require("../middleware/auth");
10 |
11 | router.get("/", auth, cors(), async (req, res) => {
12 | try {
13 | const user = await Register.findById(req.user.id).select("-password");
14 | res.json(user);
15 | } catch (err) {
16 | res.json(user);
17 | }
18 | });
19 |
20 | router.post(
21 | "/",
22 | [check("email", "Please include a valid email").isEmail()],
23 | cors(),
24 | async (req, res) => {
25 | const err = validationResult(req);
26 | if (!err.isEmpty()) {
27 | return res.status(400).json({
28 | errors: err.array(),
29 | });
30 | }
31 | const { email, password } = req.body;
32 |
33 | try {
34 | let user = await Register.findOne({
35 | email,
36 | });
37 | if (!user)
38 | return res.status(400).json({
39 | msg: "User not registered",
40 | });
41 | const isMatch = await bcrypt.compare(password, user.password);
42 | if (!isMatch)
43 | return res.status(500).json({
44 | msg: "Incorrect Password",
45 | });
46 | const payload = {
47 | user: {
48 | id: user.id,
49 | verified: user.verify
50 | },
51 | };
52 | jwt.sign(
53 | payload,
54 | config.get("jwtSecret"),
55 | {
56 | expiresIn: 432000,
57 | },
58 | (err, token) => {
59 | if (err) throw err;
60 | res.json(token);
61 | }
62 | );
63 | } catch (err) {
64 | console.log(err);
65 | res.status(400).json("Error");
66 | }
67 | }
68 | );
69 |
70 | module.exports = router;
71 |
--------------------------------------------------------------------------------
/routes/order.js:
--------------------------------------------------------------------------------
1 | const express = require("express");
2 | const router = express.Router();
3 | const cors = require("cors");
4 | const User = require("../models/register");
5 | const auth = require("../middleware/auth");
6 | const nodemailer = require("nodemailer");
7 | const crypto = require("crypto")
8 | const sendgridTransport = require("nodemailer-sendgrid-transport");
9 | const Order = require("../models/orders");
10 | const transporter = nodemailer.createTransport(
11 | sendgridTransport({
12 | auth: {
13 | api_key: process.env.SEND_GRID_KEY,
14 | },
15 | })
16 | );
17 |
18 |
19 | // router.post('/', async (req, res) => {
20 | // const {
21 | // id,
22 | // order
23 | // } = req.body;
24 | // let order1 = {};
25 | // (order1.total_price = cart.total_price),
26 | // (order1.total_quantity = order.total_quantity),
27 | // (order1.items = []);
28 | // order.items.forEach((item) => {
29 | // order1.items.push(item);
30 | // });
31 | // try {
32 | // User.findOneAndUpdate(id, {
33 | // $push: {
34 | // orders: order1
35 | // }
36 | // })
37 | // res.status(200).json({
38 | // msg: "Order Placed Successfully!"
39 | // })
40 | // } catch (err) {
41 | // res.status(400).json(err);
42 | // }
43 |
44 | // })
45 | router.post("/", cors(), auth, async (req, res) => {
46 | let method = req.body.value;
47 | let order_id = crypto.randomBytes(16).toString("hex");
48 | if (method === "Takeaway") {
49 | let order = new Order({
50 | user: req.user.id,
51 | order_id: order_id,
52 | mode: req.body.value,
53 | order: req.body.cart,
54 | deliveryCharges: req.body.deliveryCharges,
55 | payment: req.body.payment,
56 | })
57 | try {
58 | await order.save();
59 | let email = req.body.user.email;
60 |
61 | let name = req.body.user.name;
62 | var mailOptions = {
63 | from: "mailfoodeazy@gmail.com",
64 | to: `${email}`,
65 | subject: "Order Confirmation",
66 | text: "That was easy!",
67 | html: "Hi, " + name + " Order Successfully Placed! Thank you for ordering from Food Eazy Your order id: " + order_id + "
Regards,
Food Eazy >",
68 | };
69 | let msg = await transporter.sendMail(mailOptions)
70 | console.log(msg);
71 | let update = {
72 | cart: {},
73 | };
74 | await User.findOneAndUpdate({
75 | _id: req.user.id,
76 | },
77 | update
78 | );
79 | res.status(200).send({
80 | orderid: order_id
81 | })
82 | // res.redirect("/success?orderid=" + order_id)
83 |
84 | } catch (e) {
85 | console.log(e)
86 | res.sendStatus(500);
87 | }
88 | } else {
89 | let order_id = crypto.randomBytes(16).toString("hex");
90 | let order = new Order({
91 | user: req.user.id,
92 | address: req.body.address,
93 | order_id: order_id,
94 | mode: req.body.value,
95 | order: req.body.cart,
96 | deliveryCharges: req.body.deliveryCharges,
97 | payment: req.body.payment,
98 | address: req.body.address
99 | })
100 | try {
101 | await order.save();
102 | let email = req.body.user.email;
103 |
104 | let name = req.body.user.name;
105 | var mailOptions = {
106 | from: "mailfoodeazy@gmail.com",
107 | to: `${email}`,
108 | subject: "Order Confirmation",
109 | text: "That was easy!",
110 | html: "Hi, " + name + " Order Successfully Placed! Thank you for ordering from Food Eazy Your order id: " + order_id + "
Regards,
Food Eazy >",
111 | };
112 | let msg = await transporter.sendMail(mailOptions)
113 | console.log(msg);
114 | let update = {
115 | cart: {},
116 | };
117 | await User.findOneAndUpdate({
118 | _id: req.user.id,
119 | },
120 | update
121 | );
122 | res.status(200).send({
123 | orderid: order_id
124 | })
125 | // res.redirect("/success?orderid=" + order_id)
126 |
127 | } catch (e) {
128 | console.log(e)
129 | res.sendStatus(500);
130 | }
131 |
132 |
133 | }
134 | // order = new Order({
135 | // user: req.user.id,
136 | // order_id: order_id,
137 | // mode: req.body.value,
138 | // order: req.body.cart,
139 | // deliveryCharges: req.body.deliveryCharges,
140 | // payment: req.body.payment,
141 | // });
142 | // res.sendStatus(200)
143 | })
144 | router.get("/", async (req, res) => {
145 | let order_id = req.query.orderid;
146 | try {
147 | let current = await Order.findOne({
148 | order_id: order_id
149 | }).populate("user")
150 | // console.log(current)
151 | res.send(current)
152 | } catch (e) {
153 | res.sendStatus(404)
154 | }
155 |
156 | })
157 |
158 | module.exports = router
--------------------------------------------------------------------------------
/routes/orders.js:
--------------------------------------------------------------------------------
1 | const express = require("express");
2 | const router = express.Router();
3 | const Orders = require('../models/orders');
4 | const auth = require("../middleware/auth")
5 |
6 |
7 | router.get('/', auth, async (req, res) => {
8 | let user_id = req.user.id;
9 | let orders = await Orders.find({
10 | user: user_id
11 | });
12 | if (!orders)
13 | res.status(200).json('No Orders Placed!');
14 | else {
15 | res.status(200).json(orders);
16 | }
17 |
18 | })
19 |
20 | module.exports = router
--------------------------------------------------------------------------------
/routes/paytm.js:
--------------------------------------------------------------------------------
1 | const Router = require("express").Router();
2 | const qs = require("query-string");
3 | const crypto = require("crypto");
4 | const Order = require("../models/orders");
5 | const Users = require("../models/register");
6 | const https = require("https");
7 | const checksum_lib = require("../paytm/checksum");
8 | const auth = require("../middleware/auth");
9 | const nodemailer = require("nodemailer");
10 | const sendgridTransport = require("nodemailer-sendgrid-transport");
11 | var CronJob = require("cron").CronJob;
12 | const shortid = require("shortid");
13 |
14 | const transporter = nodemailer.createTransport(
15 | sendgridTransport({
16 | auth: {
17 | api_key: process.env.SEND_GRID_KEY,
18 | },
19 | })
20 | );
21 |
22 | Router.post("/", auth, async (req, res) => {
23 | console.log(process.env.SEND_GRID_KEY)
24 | let params = {};
25 | let order_id = crypto.randomBytes(16).toString("hex");
26 | (params["MID"] = process.env.MERCHANT_ID),
27 | (params["WEBSITE"] = "WEBSTAGING"),
28 | (params["CHANNEL_ID"] = "WEB"),
29 | ((params["ORDER_ID"] = order_id.toString()),
30 | (params["CUST_ID"] = req.user.id.toString()),
31 | (params["INDUSTRY_TYPE_ID"] = "Retail"),
32 | (params["TXN_AMOUNT"] = req.body.txn_amount.toString()),
33 | (params["CALLBACK_URL"] = "https://foodeazy.herokuapp.com/api/paytm/success"),
34 | (params["EMAIL"] = req.body.user.email.toString()),
35 | (params["MOBILE_NO"] = req.body.user.number.toString()));
36 |
37 | order = new Order({
38 | user: req.user.id,
39 | order_id: order_id,
40 | mode: req.body.value,
41 | order: req.body.cart,
42 | deliveryCharges: req.body.deliveryCharges,
43 | address: req.body.address,
44 | payment: req.body.payment,
45 | });
46 | try {
47 | await order.save();
48 |
49 | } catch (e) {
50 | return res.sendStatus(500)
51 | console.log(e);
52 | }
53 | checksum_lib.genchecksum(params, process.env.MERCHANT_API_KEY, (err, checksum) => {
54 | let txn_url = "https://securegw-stage.paytm.in/order/process";
55 | let form_fields = "";
56 | for (x in params) {
57 | form_fields +=
58 | " ";
59 | }
60 | form_fields +=
61 | " ";
62 | var html =
63 | "Please Do Not Refresh The Page ";
68 | res.writeHead(200, {
69 | "Content-Type": "text/html",
70 | });
71 | res.write(html);
72 | res.end();
73 | });
74 | });
75 | Router.post("/success", async (req, res) => {
76 | let body = req.body;
77 | let y = body
78 | console.log(req.body)
79 | let id = y.ORDERID;
80 | if (y.RESPCODE !== "01") {
81 | await Order.deleteOne({
82 | order_id: id,
83 | });
84 | res.redirect("https://foodeazy.herokuapp.com/fail");
85 |
86 | } else {
87 | let order = await Order.findOne({
88 | order_id: id,
89 | })
90 | let user = await Users.findById(order.user)
91 | var job = new CronJob(
92 | "*/15 * * * *",
93 | async () => {
94 | try {
95 | const update = {
96 | status: true
97 | };
98 | await Order.findOneAndUpdate({
99 | order_id: id
100 | }, update)
101 | } catch (e) {
102 | console.log(e);
103 | }
104 | },
105 | null,
106 | true,
107 | "America/Los_Angeles"
108 | );
109 | job.start();
110 | let email = user.email;
111 | let name = user.name;
112 | let user_id = order.user;
113 | var mailOptions = {
114 | from: "mailfoodeazy@gmail.com",
115 | to: `${email}`,
116 | subject: "Order Confirmation",
117 | text: "That was easy!",
118 | html: "Hi, " + name + " Order Successfully Placed! Thank you for ordering from Food Eazy Your order id: " + id + "
Regards, Food Eazy>",
119 | };
120 | await transporter.sendMail(mailOptions, async (error, info) => {
121 | if (error) {
122 | console.log(error);
123 | } else {
124 | let update = {
125 | cart: {},
126 | };
127 | await Users.findOneAndUpdate({
128 | _id: user_id,
129 | },
130 | update
131 | );
132 | res.redirect("https://foodeazy.herokuapp.com/success?orderid=" + body.ORDERID)
133 | }
134 | });
135 |
136 | }
137 |
138 |
139 | })
140 |
141 | module.exports = Router;
--------------------------------------------------------------------------------
/routes/register.js:
--------------------------------------------------------------------------------
1 | const express = require("express");
2 | const router = express.Router();
3 | const jwt = require("jsonwebtoken");
4 | const Register = require("../models/register");
5 | const bcrypt = require("bcryptjs");
6 | var CronJob = require("cron").CronJob;
7 | const {
8 | check,
9 | validationResult
10 | } = require("express-validator");
11 | const config = require("config");
12 | const auth = require("../middleware/auth");
13 | const shortid = require("shortid");
14 | const nodemailer = require("nodemailer");
15 | const sendgridTransport = require("nodemailer-sendgrid-transport");
16 |
17 | router.post(
18 | "/",
19 | [
20 | check("name", "Your name is required").not().isEmpty(),
21 | check("email", "Please include a valid email").isEmail(),
22 | check("number", "Please include a valid phone number").isMobilePhone(),
23 | check(
24 | "password",
25 | "Password should be combination of one uppercase , one lower case, one special char, one digit and min 8 , max 20 char long"
26 | ).matches(/^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[^a-zA-Z0-9]).{8,}$/, "i"),
27 | check("confirmPassword", "Passwords do not match!").custom(
28 | (value, {
29 | req,
30 | loc,
31 | path
32 | }) => {
33 | if (value !== req.body.password) {
34 | // trow error if passwords do not match
35 | throw new Error("Passwords don't match");
36 | } else {
37 | return value;
38 | }
39 | }
40 | ),
41 | ],
42 | async (req, res) => {
43 | const err = validationResult(req);
44 | if (!err.isEmpty()) {
45 | return res.status(400).json({
46 | errors: err.array(),
47 | });
48 | }
49 | const {
50 | name,
51 | email,
52 | number,
53 | password,
54 | confirmPassword
55 | } = req.body;
56 | try {
57 | let user = await Register.findOne({
58 | email: email,
59 | });
60 | if (user)
61 | return res.status(400).json({
62 | msg: "User already exists",
63 | });
64 | var uid = '';
65 | var characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
66 | var charactersLength = characters.length;
67 | for ( var i = 0; i < 6; i++ ) {
68 | uid += characters.charAt(Math.floor(Math.random() * charactersLength));
69 | }
70 | user = new Register({
71 | name,
72 | email,
73 | number,
74 | password,
75 | confirmPassword,
76 | uid: uid,
77 | });
78 | const salt = await bcrypt.genSalt(10);
79 | user.password = await bcrypt.hash(password, salt);
80 | await user.save();
81 |
82 |
83 | const transporter = nodemailer.createTransport(
84 | sendgridTransport({
85 | auth: {
86 | api_key: process.env.SEND_GRID_KEY,
87 | },
88 | })
89 | );
90 |
91 | var mailOptions = {
92 | from: "mailfoodeazy@gmail.com",
93 | to: `${email}`,
94 | subject: "Email Verification",
95 | text: "That was easy!",
96 | html: "
Hey, " +
100 | name +
101 |
102 | " Welcome to Food-Eazy Thanks for Signing up on our app Your Code for verification is : " + uid + " If this request is not made by you kindly ignore this mail.
Regards, Food Eazy
",
103 |
104 | };
105 |
106 | transporter.sendMail(mailOptions, function (error, info) {
107 | if (error) {
108 | console.log(error);
109 | } else {
110 | console.log("Email sent: " + info);
111 | console.log(info)
112 | }
113 | var job = new CronJob(
114 | "*/59 * * * *",
115 | async () => {
116 | try {
117 | const user1 = await Register.findOne({
118 | email,
119 | });
120 | if (user1.verify === false) {
121 | try {
122 | await Register.findOneAndDelete({
123 | email: user1.email,
124 | });
125 | } catch (er) {
126 | console.log(er);
127 | }
128 | }
129 | } catch (e) {
130 | console.log(e);
131 | }
132 | },
133 | null,
134 | true,
135 | "America/Los_Angeles"
136 | );
137 | job.start();
138 | const payload = {
139 | user: {
140 | id: user.id,
141 | verified: user.verify
142 | },
143 | };
144 | jwt.sign(
145 | payload,
146 | config.get("jwtSecret"), {
147 | expiresIn: 432000,
148 | },
149 | (err, token) => {
150 | if (err) throw err;
151 | res.json(token);
152 | }
153 | );
154 | });
155 | } catch (err) {
156 | console.log(err);
157 | res.status(400).json(err);
158 | }
159 | }
160 | );
161 |
162 | module.exports = router;
--------------------------------------------------------------------------------
/routes/resendCode.js:
--------------------------------------------------------------------------------
1 | const User = require("../models/register");
2 | const Router = require("express").Router();
3 | const nodemailer = require("nodemailer");
4 | const sendgridTransport = require("nodemailer-sendgrid-transport");
5 |
6 | Router.post('/', async(req, res)=>{
7 | const transporter = nodemailer.createTransport(
8 | sendgridTransport({
9 | auth: {
10 | api_key: process.env.SEND_GRID_KEY,
11 | },
12 | })
13 | );
14 | var uid = '';
15 | var characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
16 | var charactersLength = characters.length;
17 | for ( var i = 0; i < 6; i++ ) {
18 | uid += characters.charAt(Math.floor(Math.random() * charactersLength));
19 | }
20 |
21 | var mailOptions = {
22 | from: "mailfoodeazy@gmail.com",
23 | to: `${req.body.email}`,
24 | subject: "Email Verification",
25 | text: "That was easy!",
26 | html: "
Hey, " +
30 | req.body.name +
31 |
32 | " Welcome to Food-Eazy Thanks for Signing up on our app Your Code for verification is : " + uid + " If this request is not made by you kindly ignore this mail.
Regards, Food Eazy
",
33 |
34 | };
35 | transporter.sendMail(mailOptions, async(error, info)=> {
36 | if (error) {
37 | console.log(error);
38 | } else {
39 | console.log("Email sent: " + info);
40 | console.log(info);
41 | const update = {uid: uid};
42 | await User.findOneAndUpdate({_id: req.body.id}, update)
43 | res.status(200).json('Verification Code sent successfully to you mail id');
44 | }
45 | })
46 |
47 | })
48 | module.exports = Router;
--------------------------------------------------------------------------------
/routes/reset.js:
--------------------------------------------------------------------------------
1 | const express = require("express");
2 | const router = express.Router();
3 | const Forget = require("../models/forget");
4 | const User = require("../models/register");
5 | const bcrypt = require("bcryptjs");
6 | const {
7 | check,
8 | validationResult
9 | } = require("express-validator");
10 | router.get("/", async (req, res) => {
11 | console.log(req.query)
12 | let code = req.query.code;
13 | console.log("CODE");
14 | // console.log(code)
15 | try {
16 | let data = await Forget.findOne({
17 | code: code
18 | })
19 |
20 | if (data) {
21 | console.log(data)
22 | return res.sendStatus(200);
23 | }
24 | res.status(404).send({
25 | msg: "Unauthorized"
26 | })
27 | } catch (e) {
28 | console.log("yeah")
29 | res.status(404).send({
30 | msg: "Unauthorized"
31 | })
32 | }
33 | });
34 |
35 | router.post(
36 | "/",
37 | check(
38 | "password",
39 | "Password should be combination of one uppercase , one lower case, one special char, one digit and min 8 , max 20 char long"
40 | ).matches(/^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[^a-zA-Z0-9]).{8,}$/, "i"),
41 | async (req, res) => {
42 | const err = validationResult(req);
43 | if (!err.isEmpty()) {
44 | return res.status(400).json({
45 | errors: err.array(),
46 | });
47 | }
48 | let {
49 | code,
50 | password
51 | } = req.body;
52 | Forget.findOne({
53 | code
54 | }, async (err, user) => {
55 | if (err) console.log(err);
56 | else if (!user) {
57 | res.status(404).json("Invalid URL");
58 | } else {
59 | let email = user.email;
60 | const salt = await bcrypt.genSalt(10);
61 | let newPass = await bcrypt.hash(password, salt);
62 | const update = {
63 | password: newPass
64 | };
65 | let user1 = await User.findOneAndUpdate({
66 | email
67 | }, update);
68 | Forget.findOneAndDelete({
69 | code
70 | }, (err) => {
71 | console.log(err);
72 | });
73 | res.status(200).json("Password Updated Successfully!");
74 | }
75 | });
76 | }
77 | );
78 |
79 | module.exports = router;
--------------------------------------------------------------------------------
/routes/verify.js:
--------------------------------------------------------------------------------
1 | const User = require("../models/register");
2 | const Router = require("express").Router();
3 |
4 | Router.post("/", async (req, res) => {
5 | try {
6 |
7 | User.findOne({
8 | uid: req.body.code
9 | }, async (err, user) => {
10 | // console.log(user)
11 | if (err) {
12 | console.log(err);
13 | return res.status(404).send("Invalid Code")
14 | } else if (!user) {
15 | return res.status(401).send('Inavalid Code!');
16 | } else {
17 | if (user.verify) {
18 | return res.status(401).send("You have already verified. Login in to continue. ");
19 |
20 | } else {
21 |
22 | try {
23 | user.verify = true;
24 | await user.save();
25 | res.status(200).send("User Has Been Verified Successfully!");
26 | } catch (er) {
27 | console.log(er);
28 | res.sendStatus(500)
29 | }
30 | }
31 | }
32 | })
33 | } catch (e) {
34 | console.log(e)
35 | }
36 |
37 | })
38 |
39 |
40 | module.exports = Router;
--------------------------------------------------------------------------------
/server.js:
--------------------------------------------------------------------------------
1 | const express = require("express");
2 | const app = express();
3 | const morgan = require("morgan");
4 | const connectDB = require("./config/db");
5 | const path = require("path");
6 | require('dotenv').config();
7 | const bodyParser = require("body-parser");
8 | const cors = require("cors");
9 | app.use(cors());
10 |
11 | app.use(
12 | bodyParser.urlencoded({
13 | extended: false,
14 | })
15 | );
16 | app.use(bodyParser.json());
17 | connectDB();
18 |
19 | app.use("/images", express.static(path.join(__dirname, "images")));
20 | app.use(morgan(" :method :url :req[header] - :res[header]"));
21 | app.use("/api/register", require("./routes/register"));
22 | app.use("/api/login", require("./routes/login"));
23 | app.use("/api/cart", cors(), require("./routes/cart"));
24 | app.use("/api/orders", cors(), require("./routes/order"));
25 | app.use("/api/verify", require("./routes/verify"));
26 | app.use("/api/forget", require("./routes/forget"));
27 | app.use("/api/reset", require("./routes/reset"));
28 | app.use("/api/resend", require('./routes/resendCode'));
29 | app.use("/api/admin", require("./routes/admin"));
30 | app.use("/api/items", require("./routes/items"));
31 | app.use("/api/paytm", require("./routes/paytm"));
32 | app.use("/api/get_orders", require("./routes/orders"));
33 |
34 | app.use(express.static(path.join(__dirname, '/build/')))
35 |
36 | app.use("*", (req, res) => {
37 | res.sendFile(path.resolve(__dirname, "build", "index.html"))
38 | })
39 |
40 | const port = process.env.PORT || 5000;
41 | app.listen(port, () => {
42 | console.log(`Server running on port ${port}`);
43 | });
--------------------------------------------------------------------------------