source: backend/routes/productRoutes.js@ 55ed171

Last change on this file since 55ed171 was 55ed171, checked in by Nace Gjorgjievski <nace.gorgievski123@…>, 21 months ago

Full Admin Functionality Added

  • Property mode set to 100644
File size: 5.0 KB
Line 
1import express, { query } from "express";
2import Product from "../models/productModel.js";
3import multer from "multer";
4import expressAsyncHandler from "express-async-handler";
5import userRouter from "./userRoutes.js";
6
7const productRouter = express.Router();
8
9const storage = multer.diskStorage({
10 destination: (req, file, callback) => {
11 callback(null, "../frontend/public/uploads/");
12 },
13 filename: (req, file, callback) => {
14 callback(null, file.originalname);
15 },
16});
17
18const upload = multer({ storage: storage });
19const multipleUpload = upload.fields([
20 { name: "image", maxCount: 1 },
21 { name: "sideImage", maxCount: 1 },
22 { name: "sideImage2", maxCount: 1 },
23 { name: "dimension", maxCount: 1 },
24 { name: "scheme", maxCount: 1 },
25]);
26productRouter.post(
27 "/add",
28 multipleUpload,
29 expressAsyncHandler(async (req, res) => {
30 const newProduct = new Product({
31 name: req.body.name,
32 slug: req.body.slug,
33 image: `/uploads/${req.files.image[0].originalname}`,
34 sideImage: `/uploads/${req.files.sideImage[0].originalname}`,
35 sideImage2: `/uploads/${req.files.sideImage2[0].originalname}`,
36 dimension: `/uploads/${req.files.dimension[0].originalname}`,
37 scheme: `/uploads/${req.files.scheme[0].originalname}`,
38 category: req.body.category,
39 subCategory: req.body.subCategory,
40 description: req.body.description,
41 price: req.body.price,
42 priceMontaza: req.body.priceMontaza,
43 countInStock: req.body.countInStock,
44 });
45
46 const product = await newProduct.save();
47 if (product)
48 res.status(201).send({ message: "New Product Created", product });
49 else res.status(404).send({ message: "Error creating product" });
50 })
51);
52
53const PAGE_SIZE = 20;
54productRouter.get(
55 "/",
56 expressAsyncHandler(async (req, res) => {
57 const { query } = req;
58 const pageSize = query.pageSize || PAGE_SIZE;
59 const page = query.page || 1;
60 const category = query.category || "";
61 const subCategory = query.subCategory || "";
62 const order = query.order || "";
63 const searchQuery = query.query || "";
64
65 const queryFilter =
66 searchQuery && searchQuery !== "all"
67 ? { name: { $regex: searchQuery, $options: "i" } }
68 : {};
69 const categoryFilter = category && category !== "all" ? { category } : {};
70 const subCategoryFilter =
71 subCategory && subCategory !== "all" ? { subCategory } : {};
72 const sortOrder =
73 order === "lowFirst"
74 ? { price: 1 }
75 : order === "highFirst"
76 ? { price: -1 }
77 : { createdAt: -1 };
78 const products = await Product.find({
79 ...queryFilter,
80 ...categoryFilter,
81 ...subCategoryFilter,
82 })
83 .sort(sortOrder)
84 .skip(pageSize * (page - 1))
85 .limit(pageSize);
86
87 const countProducts = await Product.countDocuments({
88 ...queryFilter,
89 ...categoryFilter,
90 ...subCategoryFilter,
91 });
92 res.send({
93 products,
94 countProducts,
95 page,
96 pages: Math.ceil(countProducts / pageSize),
97 });
98 })
99);
100/*
101productRouter.get("/", async (req, res) => {
102 const products = await Product.find();
103 res.send(products);
104});
105*/
106productRouter.get("/slug/:slug", async (req, res) => {
107 const product = await Product.findOne({ slug: req.params.slug });
108 if (product) {
109 res.send(product);
110 } else {
111 res.status(404).send({ message: "Продуктот не е пронајден" });
112 }
113});
114
115productRouter.get("/:id", async (req, res) => {
116 const product = await Product.findById(req.params.id);
117 if (product) {
118 res.send(product);
119 } else {
120 res.status(404).send({ message: "Продуктот не е пронајден" });
121 }
122});
123
124productRouter.put(
125 "/edit",
126 expressAsyncHandler(async (req, res) => {
127 const product = await Product.updateOne(
128 { slug: req.body.slug },
129 {
130 $set: {
131 name: req.body.name,
132 category: req.body.category,
133 slug: req.body.slug,
134 subCategory: req.body.subCategory,
135 description: req.body.description,
136 price: req.body.price,
137 priceMontaza: req.body.priceMontaza,
138 countInStock: req.body.countInStock,
139 },
140 }
141 );
142 /*
143 if (product) {
144 product.name = req.body.name || product.name;
145 product.slug = req.body.slug || product.slug;
146 product.price = req.body.price || product.price;
147 product.category = req.body.category || product.category;
148 product.subCategory = req.body.subCategory || product.subCategory;
149 product.description = req.body.description || product.description;
150 product.priceMontaza = req.body.priceMontaza || product.priceMontaza;
151 product.countInStock = req.body.countInStock || product.countInStock;
152 product.image = product.image;
153 product.sideImage = product.sideImage2;
154 product.sideImage2 = product.sideImage2;
155
156 const updatedProduct = await product.save();*/
157 res.status(200).send({ message: "Succesful" });
158 //else {
159 //res.status(404).send({ message: "Product Not Found" });
160 })
161);
162export default productRouter;
Note: See TracBrowser for help on using the repository browser.