├── server ├── config │ ├── keys.js │ ├── db.js │ ├── uploadFolderCreateScript.js │ └── function.js ├── routes │ ├── braintree.js │ ├── auth.js │ ├── orders.js │ ├── users.js │ ├── customize.js │ ├── categories.js │ └── products.js ├── models │ ├── customize.js │ ├── categories.js │ ├── users.js │ ├── orders.js │ └── products.js ├── package.json ├── middleware │ └── auth.js ├── controller │ ├── braintree.js │ ├── customize.js │ ├── orders.js │ ├── categories.js │ ├── users.js │ ├── auth.js │ └── products.js └── server.js ├── Data Privacy.pdf ├── Screenshots ├── 1.jpeg ├── 2.jpeg ├── 3.jpeg ├── 4.jpeg ├── 5.jpeg └── 6.jpeg ├── vercel.json ├── LICENSE └── README.md /server/config/keys.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | JWT_SECRET: "SecretKey", 3 | }; 4 | -------------------------------------------------------------------------------- /Data Privacy.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hindhuja-V/Organease/HEAD/Data Privacy.pdf -------------------------------------------------------------------------------- /Screenshots/1.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hindhuja-V/Organease/HEAD/Screenshots/1.jpeg -------------------------------------------------------------------------------- /Screenshots/2.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hindhuja-V/Organease/HEAD/Screenshots/2.jpeg -------------------------------------------------------------------------------- /Screenshots/3.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hindhuja-V/Organease/HEAD/Screenshots/3.jpeg -------------------------------------------------------------------------------- /Screenshots/4.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hindhuja-V/Organease/HEAD/Screenshots/4.jpeg -------------------------------------------------------------------------------- /Screenshots/5.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hindhuja-V/Organease/HEAD/Screenshots/5.jpeg -------------------------------------------------------------------------------- /Screenshots/6.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hindhuja-V/Organease/HEAD/Screenshots/6.jpeg -------------------------------------------------------------------------------- /vercel.json: -------------------------------------------------------------------------------- 1 | {"builds":[ 2 | { 3 | "src": "./client/src/App.js", 4 | "use": "@vercel/node" 5 | } 6 | ], 7 | "routes":[ 8 | { 9 | "src":"/.*", 10 | "dest":"app.js" 11 | } 12 | ] 13 | } -------------------------------------------------------------------------------- /server/routes/braintree.js: -------------------------------------------------------------------------------- 1 | const express = require("express"); 2 | const router = express.Router(); 3 | const brainTreeController = require("../controller/braintree"); 4 | 5 | router.post("/braintree/get-token", brainTreeController.ganerateToken); 6 | router.post("/braintree/payment", brainTreeController.paymentProcess); 7 | 8 | module.exports = router; 9 | -------------------------------------------------------------------------------- /server/config/db.js: -------------------------------------------------------------------------------- 1 | const mongoose = require("mongoose"); 2 | try { 3 | mongoose.connect("mongodb://localhost:27017/Ecommerce", { 4 | useNewUrlParser: true, 5 | useUnifiedTopology: true, 6 | useCreateIndex: true, 7 | }); 8 | console.log("Database Connected Successfully"); 9 | } catch (err) { 10 | console.log("Database Not Connected"); 11 | } 12 | -------------------------------------------------------------------------------- /server/models/customize.js: -------------------------------------------------------------------------------- 1 | const mongoose = require("mongoose"); 2 | 3 | const customizeSchema = new mongoose.Schema( 4 | { 5 | slideImage: { 6 | type: String, 7 | }, 8 | firstShow: { 9 | type: Number, 10 | default: 0, 11 | }, 12 | }, 13 | { timestamps: true } 14 | ); 15 | 16 | const customizeModel = mongoose.model("customizes", customizeSchema); 17 | module.exports = customizeModel; 18 | -------------------------------------------------------------------------------- /server/routes/auth.js: -------------------------------------------------------------------------------- 1 | const express = require("express"); 2 | const router = express.Router(); 3 | const authController = require("../controller/auth"); 4 | const { loginCheck, isAuth, isAdmin } = require("../middleware/auth"); 5 | 6 | router.post("/isadmin", authController.isAdmin); 7 | router.post("/signup", authController.postSignup); 8 | router.post("/signin", authController.postSignin); 9 | router.post("/user", loginCheck, isAuth, isAdmin, authController.allUser); 10 | 11 | module.exports = router; 12 | -------------------------------------------------------------------------------- /server/routes/orders.js: -------------------------------------------------------------------------------- 1 | const express = require("express"); 2 | const router = express.Router(); 3 | const ordersController = require("../controller/orders"); 4 | 5 | router.get("/get-all-orders", ordersController.getAllOrders); 6 | router.post("/order-by-user", ordersController.getOrderByUser); 7 | 8 | router.post("/create-order", ordersController.postCreateOrder); 9 | router.post("/update-order", ordersController.postUpdateOrder); 10 | router.post("/delete-order", ordersController.postDeleteOrder); 11 | 12 | module.exports = router; 13 | -------------------------------------------------------------------------------- /server/routes/users.js: -------------------------------------------------------------------------------- 1 | const express = require("express"); 2 | const router = express.Router(); 3 | const usersController = require("../controller/users"); 4 | 5 | router.get("/all-user", usersController.getAllUser); 6 | router.post("/signle-user", usersController.getSingleUser); 7 | 8 | router.post("/add-user", usersController.postAddUser); 9 | router.post("/edit-user", usersController.postEditUser); 10 | router.post("/delete-user", usersController.getDeleteUser); 11 | 12 | router.post("/change-password", usersController.changePassword); 13 | 14 | module.exports = router; 15 | -------------------------------------------------------------------------------- /server/models/categories.js: -------------------------------------------------------------------------------- 1 | const mongoose = require("mongoose"); 2 | 3 | const categorySchema = new mongoose.Schema( 4 | { 5 | cName: { 6 | type: String, 7 | required: true, 8 | }, 9 | cDescription: { 10 | type: String, 11 | required: true, 12 | }, 13 | cImage: { 14 | type: String, 15 | }, 16 | cStatus: { 17 | type: String, 18 | required: true, 19 | }, 20 | }, 21 | { timestamps: true } 22 | ); 23 | 24 | const categoryModel = mongoose.model("categories", categorySchema); 25 | module.exports = categoryModel; 26 | -------------------------------------------------------------------------------- /server/config/uploadFolderCreateScript.js: -------------------------------------------------------------------------------- 1 | const fs = require("fs"); 2 | 3 | const categoriesFolder = "./public/uploads/categories"; 4 | const customizeFolder = "./public/uploads/customize"; 5 | const productsFolder = "./public/uploads/products"; 6 | 7 | const CreateAllFolder = () => { 8 | if (!fs.existsSync(categoriesFolder)) { 9 | fs.mkdirSync(categoriesFolder, { 10 | recursive: true, 11 | }); 12 | } 13 | 14 | if (!fs.existsSync(customizeFolder)) { 15 | fs.mkdirSync(customizeFolder, { 16 | recursive: true, 17 | }); 18 | } 19 | 20 | if (!fs.existsSync(productsFolder)) { 21 | fs.mkdirSync(productsFolder, { 22 | recursive: true, 23 | }); 24 | } 25 | }; 26 | 27 | module.exports = CreateAllFolder; 28 | -------------------------------------------------------------------------------- /server/routes/customize.js: -------------------------------------------------------------------------------- 1 | const express = require("express"); 2 | const router = express.Router(); 3 | const customizeController = require("../controller/customize"); 4 | const multer = require("multer"); 5 | 6 | var storage = multer.diskStorage({ 7 | destination: function (req, file, cb) { 8 | cb(null, "public/uploads/customize"); 9 | }, 10 | filename: function (req, file, cb) { 11 | cb(null, Date.now() + "_" + file.originalname); 12 | }, 13 | }); 14 | 15 | const upload = multer({ storage: storage }); 16 | 17 | router.get("/get-slide-image", customizeController.getImages); 18 | router.post("/delete-slide-image", customizeController.deleteSlideImage); 19 | router.post( 20 | "/upload-slide-image", 21 | upload.single("image"), 22 | customizeController.uploadSlideImage 23 | ); 24 | router.post("/dashboard-data", customizeController.getAllData); 25 | 26 | module.exports = router; 27 | -------------------------------------------------------------------------------- /server/routes/categories.js: -------------------------------------------------------------------------------- 1 | const express = require("express"); 2 | const router = express.Router(); 3 | const categoryController = require("../controller/categories"); 4 | const multer = require("multer"); 5 | const { loginCheck } = require("../middleware/auth"); 6 | 7 | // Image Upload setting 8 | var storage = multer.diskStorage({ 9 | destination: function (req, file, cb) { 10 | cb(null, "./public/uploads/categories"); 11 | }, 12 | filename: function (req, file, cb) { 13 | cb(null, Date.now() + "_" + file.originalname); 14 | }, 15 | }); 16 | 17 | const upload = multer({ storage: storage }); 18 | 19 | router.get("/all-category", categoryController.getAllCategory); 20 | router.post( 21 | "/add-category", 22 | loginCheck, 23 | upload.single("cImage"), 24 | categoryController.postAddCategory 25 | ); 26 | router.post("/edit-category", loginCheck, categoryController.postEditCategory); 27 | router.post( 28 | "/delete-category", 29 | loginCheck, 30 | categoryController.getDeleteCategory 31 | ); 32 | 33 | module.exports = router; 34 | -------------------------------------------------------------------------------- /server/config/function.js: -------------------------------------------------------------------------------- 1 | /* This all of are helper function */ 2 | const userModel = require("../models/users"); 3 | 4 | exports.toTitleCase = function (str) { 5 | return str.replace(/\w\S*/g, function (txt) { 6 | return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase(); 7 | }); 8 | }; 9 | 10 | exports.validateEmail = function (mail) { 11 | if (/^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/.test(mail)) { 12 | return true; 13 | } else { 14 | return false; 15 | } 16 | }; 17 | 18 | exports.emailCheckInDatabase = async function (email) { 19 | let user = await userModel.findOne({ email: email }); 20 | user.exec((err, data) => { 21 | if (!data) { 22 | return false; 23 | } else { 24 | return true; 25 | } 26 | }); 27 | }; 28 | 29 | exports.phoneNumberCheckInDatabase = async function (phoneNumber) { 30 | let user = await userModel.findOne({ phoneNumber: phoneNumber }); 31 | user.exec((err, data) => { 32 | if (data) { 33 | return true; 34 | } else { 35 | return false; 36 | } 37 | }); 38 | }; 39 | -------------------------------------------------------------------------------- /server/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "OrganEase", 3 | "version": "Mark 1", 4 | "description": "Organ Tranfer WEbApp", 5 | "main": "app.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1", 8 | "start:dev": "nodemon app.js" 9 | }, 10 | "repository": { 11 | "type": "git", 12 | "url": "https://github.com/hasan-py/MERN_Stack_Project_Hayroo_Ecommerce" 13 | }, 14 | "author": "Hasan | https://hasan-py.github.io", 15 | "license": "ISC", 16 | "bugs": { 17 | "url": "https://github.com/hasan-py/MERN_Stack_Project_Hayroo_Ecommerce/issues" 18 | }, 19 | "homepage": "https://github.com/hasan-py/MERN_Stack_Project_Hayroo_Ecommerce#readme", 20 | "dependencies": { 21 | "bcryptjs": "^2.4.3", 22 | "braintree": "^3.0.0", 23 | "cookie-parser": "^1.4.5", 24 | "cors": "^2.8.5", 25 | "dotenv": "^8.2.0", 26 | "express": "^4.18.2", 27 | "i": "^0.3.6", 28 | "jsonwebtoken": "^8.5.1", 29 | "mongoose": "^5.9.27", 30 | "morgan": "^1.10.0", 31 | "multer": "^1.4.2", 32 | "nodemon": "^2.0.4", 33 | "npm": "^6.14.8" 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /server/models/users.js: -------------------------------------------------------------------------------- 1 | const mongoose = require("mongoose"); 2 | 3 | const userSchema = new mongoose.Schema( 4 | { 5 | name: { 6 | type: String, 7 | required: true, 8 | maxlength: 32, 9 | }, 10 | email: { 11 | type: String, 12 | required: true, 13 | trim: true, 14 | index: { unique: true }, 15 | match: /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/, 16 | }, 17 | password: { 18 | type: String, 19 | required: true, 20 | }, 21 | userRole: { 22 | type: Number, 23 | required: true, 24 | }, 25 | phoneNumber: { 26 | type: Number, 27 | }, 28 | userImage: { 29 | type: String, 30 | default: "user.png", 31 | }, 32 | verified: { 33 | type: String, 34 | default: false, 35 | }, 36 | secretKey: { 37 | type: String, 38 | default: null, 39 | }, 40 | history: { 41 | type: Array, 42 | default: [], 43 | }, 44 | }, 45 | { timestamps: true } 46 | ); 47 | 48 | const userModel = mongoose.model("users", userSchema); 49 | module.exports = userModel; 50 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 Kartik Banshi Katkar 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /server/models/orders.js: -------------------------------------------------------------------------------- 1 | const mongoose = require("mongoose"); 2 | const { ObjectId } = mongoose.Schema.Types; 3 | 4 | const orderSchema = new mongoose.Schema( 5 | { 6 | allProduct: [ 7 | { 8 | id: { type: ObjectId, ref: "products" }, 9 | quantitiy: Number, 10 | }, 11 | ], 12 | user: { 13 | type: ObjectId, 14 | ref: "users", 15 | required: true, 16 | }, 17 | amount: { 18 | type: Number, 19 | required: true, 20 | }, 21 | transactionId: { 22 | type: String, 23 | required: true, 24 | }, 25 | address: { 26 | type: String, 27 | required: true, 28 | }, 29 | phone: { 30 | type: Number, 31 | required: true, 32 | }, 33 | status: { 34 | type: String, 35 | default: "Not processed", 36 | enum: [ 37 | "Not processed", 38 | "Under Scrutiny", 39 | "Request Accepted", 40 | "Expired", 41 | "Cancelled", 42 | ], 43 | }, 44 | }, 45 | { timestamps: true } 46 | ); 47 | 48 | const orderModel = mongoose.model("orders", orderSchema); 49 | module.exports = orderModel; 50 | -------------------------------------------------------------------------------- /server/middleware/auth.js: -------------------------------------------------------------------------------- 1 | const jwt = require("jsonwebtoken"); 2 | const { JWT_SECRET } = require("../config/keys"); 3 | const userModel = require("../models/users"); 4 | 5 | exports.loginCheck = (req, res, next) => { 6 | try { 7 | let token = req.headers.token; 8 | token = token.replace("Bearer ", ""); 9 | decode = jwt.verify(token, JWT_SECRET); 10 | req.userDetails = decode; 11 | next(); 12 | } catch (err) { 13 | res.json({ 14 | error: "You must be logged in", 15 | }); 16 | } 17 | }; 18 | 19 | exports.isAuth = (req, res, next) => { 20 | let { loggedInUserId } = req.body; 21 | if ( 22 | !loggedInUserId || 23 | !req.userDetails._id || 24 | loggedInUserId != req.userDetails._id 25 | ) { 26 | res.status(403).json({ error: "You are not authenticate" }); 27 | } 28 | next(); 29 | }; 30 | 31 | exports.isAdmin = async (req, res, next) => { 32 | try { 33 | let reqUser = await userModel.findById(req.body.loggedInUserId); 34 | // If user role 0 that's mean not admin it's customer 35 | if (reqUser.userRole === 0) { 36 | res.status(403).json({ error: "Access denied" }); 37 | } 38 | next(); 39 | } catch { 40 | res.status(404); 41 | } 42 | }; 43 | -------------------------------------------------------------------------------- /server/models/products.js: -------------------------------------------------------------------------------- 1 | const mongoose = require("mongoose"); 2 | const { ObjectId } = mongoose.Schema.Types; 3 | 4 | const productSchema = new mongoose.Schema( 5 | { 6 | pName: { 7 | type: Number, 8 | required: true, 9 | }, 10 | pDescription: { 11 | type: String, 12 | required: true, 13 | }, 14 | pPrice: { 15 | type: Number, 16 | required: true, 17 | }, 18 | pSold: { 19 | type: Number, 20 | default: 0, 21 | }, 22 | pQuantity: { 23 | type: Number, 24 | default: 0, 25 | }, 26 | pCategory: { 27 | type: ObjectId, 28 | ref: "categories", 29 | }, 30 | pImages: { 31 | type: Array, 32 | required: true, 33 | }, 34 | pOffer: { 35 | type: String, 36 | default: null, 37 | }, 38 | pRatingsReviews: [ 39 | { 40 | review: String, 41 | user: { type: ObjectId, ref: "users" }, 42 | rating: String, 43 | createdAt: { 44 | type: Date, 45 | default: Date.now(), 46 | }, 47 | }, 48 | ], 49 | pStatus: { 50 | type: String, 51 | required: true, 52 | }, 53 | }, 54 | { timestamps: true } 55 | ); 56 | 57 | const productModel = mongoose.model("products", productSchema); 58 | module.exports = productModel; 59 | -------------------------------------------------------------------------------- /server/routes/products.js: -------------------------------------------------------------------------------- 1 | const express = require("express"); 2 | const router = express.Router(); 3 | const productController = require("../controller/products"); 4 | const multer = require("multer"); 5 | 6 | var storage = multer.diskStorage({ 7 | destination: function (req, file, cb) { 8 | cb(null, "public/uploads/products"); 9 | }, 10 | filename: function (req, file, cb) { 11 | cb(null, Date.now() + "_" + file.originalname); 12 | }, 13 | }); 14 | 15 | const upload = multer({ storage: storage }); 16 | 17 | router.get("/all-product", productController.getAllProduct); 18 | router.post("/product-by-category", productController.getProductByCategory); 19 | router.post("/product-by-price", productController.getProductByPrice); 20 | router.post("/wish-product", productController.getWishProduct); 21 | router.post("/cart-product", productController.getCartProduct); 22 | 23 | router.post("/add-product", upload.any(), productController.postAddProduct); 24 | router.post("/edit-product", upload.any(), productController.postEditProduct); 25 | router.post("/delete-product", productController.getDeleteProduct); 26 | router.post("/single-product", productController.getSingleProduct); 27 | 28 | router.post("/add-review", productController.postAddReview); 29 | router.post("/delete-review", productController.deleteReview); 30 | 31 | module.exports = router; 32 | -------------------------------------------------------------------------------- /server/controller/braintree.js: -------------------------------------------------------------------------------- 1 | var braintree = require("braintree"); 2 | require("dotenv").config(); 3 | 4 | var gateway = new braintree.BraintreeGateway({ 5 | environment: braintree.Environment.Sandbox, 6 | merchantId: process.env.BRAINTREE_MERCHANT_ID, 7 | publicKey: process.env.BRAINTREE_PUBLIC_KEY, 8 | privateKey: process.env.BRAINTREE_PRIVATE_KEY, 9 | }); 10 | 11 | class brainTree { 12 | ganerateToken(req, res) { 13 | gateway.clientToken.generate({}, (err, response) => { 14 | if (err) { 15 | return res.json(err); 16 | } 17 | return res.json(response); 18 | }); 19 | } 20 | 21 | paymentProcess(req, res) { 22 | let { amountTotal, paymentMethod } = req.body; 23 | gateway.transaction.sale( 24 | { 25 | amount: amountTotal, 26 | paymentMethodNonce: paymentMethod, 27 | options: { 28 | submitForSettlement: true, 29 | }, 30 | }, 31 | (err, result) => { 32 | if (err) { 33 | console.error(err); 34 | return res.json(err); 35 | } 36 | 37 | if (result.success) { 38 | console.log("Transaction ID: " + result.transaction.id); 39 | return res.json(result); 40 | } else { 41 | console.error(result.message); 42 | } 43 | } 44 | ); 45 | } 46 | } 47 | 48 | const brainTreeController = new brainTree(); 49 | module.exports = brainTreeController; 50 | -------------------------------------------------------------------------------- /server/server.js: -------------------------------------------------------------------------------- 1 | 2 | 3 | const express = require("express"); 4 | const app = express(); 5 | require("dotenv").config(); 6 | const mongoose = require("mongoose"); 7 | const morgan = require("morgan"); 8 | const cookieParser = require("cookie-parser"); 9 | const cors = require("cors"); 10 | 11 | // Import Router 12 | const authRouter = require("./routes/auth"); 13 | const categoryRouter = require("./routes/categories"); 14 | const productRouter = require("./routes/products"); 15 | const brainTreeRouter = require("./routes/braintree"); 16 | const orderRouter = require("./routes/orders"); 17 | const usersRouter = require("./routes/users"); 18 | const customizeRouter = require("./routes/customize"); 19 | // Import Auth middleware for check user login or not~ 20 | const { loginCheck } = require("./middleware/auth"); 21 | const CreateAllFolder = require("./config/uploadFolderCreateScript"); 22 | 23 | /* Create All Uploads Folder if not exists | For Uploading Images */ 24 | CreateAllFolder(); 25 | 26 | // Database Connection 27 | mongoose 28 | .connect(process.env.DATABASE, { 29 | useNewUrlParser: true, 30 | useUnifiedTopology: true, 31 | useCreateIndex: true, 32 | }) 33 | .then(() => 34 | console.log( 35 | "==============Mongodb Database Connected Successfully==============" 36 | ) 37 | ) 38 | .catch((err) => console.log("Database Not Connected !!!")); 39 | 40 | // Middleware 41 | app.use(morgan("dev")); 42 | app.use(cookieParser()); 43 | app.use(cors()); 44 | app.use(express.static("public")); 45 | app.use(express.urlencoded({ extended: false })); 46 | app.use(express.json()); 47 | 48 | // Routes 49 | app.use("/api", authRouter); 50 | app.use("/api/user", usersRouter); 51 | app.use("/api/category", categoryRouter); 52 | app.use("/api/product", productRouter); 53 | app.use("/api", brainTreeRouter); 54 | app.use("/api/order", orderRouter); 55 | app.use("/api/customize", customizeRouter); 56 | 57 | // Run Server 58 | const PORT = process.env.PORT || 8000; 59 | app.listen(PORT, () => { 60 | console.log("Server is running on ", PORT); 61 | }); 62 | -------------------------------------------------------------------------------- /server/controller/customize.js: -------------------------------------------------------------------------------- 1 | const fs = require("fs"); 2 | const categoryModel = require("../models/categories"); 3 | const productModel = require("../models/products"); 4 | const orderModel = require("../models/orders"); 5 | const userModel = require("../models/users"); 6 | const customizeModel = require("../models/customize"); 7 | 8 | class Customize { 9 | async getImages(req, res) { 10 | try { 11 | let Images = await customizeModel.find({}); 12 | if (Images) { 13 | return res.json({ Images }); 14 | } 15 | } catch (err) { 16 | console.log(err); 17 | } 18 | } 19 | 20 | async uploadSlideImage(req, res) { 21 | let image = req.file.filename; 22 | if (!image) { 23 | return res.json({ error: "All field required" }); 24 | } 25 | try { 26 | let newCustomzie = new customizeModel({ 27 | slideImage: image, 28 | }); 29 | let save = await newCustomzie.save(); 30 | if (save) { 31 | return res.json({ success: "Image upload successfully" }); 32 | } 33 | } catch (err) { 34 | console.log(err); 35 | } 36 | } 37 | 38 | async deleteSlideImage(req, res) { 39 | let { id } = req.body; 40 | if (!id) { 41 | return res.json({ error: "All field required" }); 42 | } else { 43 | try { 44 | let deletedSlideImage = await customizeModel.findById(id); 45 | const filePath = `../server/public/uploads/customize/${deletedSlideImage.slideImage}`; 46 | 47 | let deleteImage = await customizeModel.findByIdAndDelete(id); 48 | if (deleteImage) { 49 | // Delete Image from uploads -> customizes folder 50 | fs.unlink(filePath, (err) => { 51 | if (err) { 52 | console.log(err); 53 | } 54 | return res.json({ success: "Image deleted successfully" }); 55 | }); 56 | } 57 | } catch (err) { 58 | console.log(err); 59 | } 60 | } 61 | } 62 | 63 | async getAllData(req, res) { 64 | try { 65 | let Categories = await categoryModel.find({}).count(); 66 | let Products = await productModel.find({}).count(); 67 | let Orders = await orderModel.find({}).count(); 68 | let Users = await userModel.find({}).count(); 69 | if (Categories && Products && Orders) { 70 | return res.json({ Categories, Products, Orders, Users }); 71 | } 72 | } catch (err) { 73 | console.log(err); 74 | } 75 | } 76 | } 77 | 78 | const customizeController = new Customize(); 79 | module.exports = customizeController; 80 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | ## Getting Started 3 | 4 | These instructions will get you a copy of the project up and running on your local machine for development and testing purpose. 5 | 6 | ### Prerequisites 7 | 8 | NPM and Node.js should be installed 9 | 10 | ### Installing 11 | 12 | Installing NPM modules on both client and server folders 13 | 14 | Execute these commands from the project directory 15 | 16 | ``` 17 | cd client && npm install 18 | ``` 19 | 20 | ``` 21 | cd server && npm install 22 | ``` 23 | 24 | ### Running the app 25 | 26 | Open a terminal on server directory 27 | 28 | ``` 29 | npm start:dev 30 | ``` 31 | 32 | and open another terminal on client directory 33 | ``` 34 | npm start 35 | ``` 36 | 37 | 38 | ### Access the web app at http://localhost:3000/ 39 | 40 |
45 |
46 |
49 |
50 |
53 |
54 |
57 |
58 |
61 |
62 |
65 |
66 |