source: backend/routes/productRoutes.js

Last change on this file was a2e5735, checked in by Nace Gjorgjievski <nace.gorgievski123@…>, 19 months ago

Final Version

  • Property mode set to 100644
File size: 6.8 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 height: req.body.H,
45 width: req.body.W,
46 length: req.body.L,
47 });
48
49 const product = await newProduct.save();
50 if (product)
51 res.status(201).send({ message: "New Product Created", product });
52 else res.status(404).send({ message: "Error creating product" });
53 })
54);
55
56const PAGE_SIZE = 7;
57
58productRouter.get(
59 "/search",
60 expressAsyncHandler(async (req, res) => {
61 const { query } = req;
62 const pageSize = query.pageSize || PAGE_SIZE;
63 const page = query.page || 1;
64 const searchQuery = query.text;
65 console.log("HEEEY: " + searchQuery);
66 const queryFilter =
67 searchQuery && searchQuery !== "all"
68 ? { name: { $regex: searchQuery, $options: "i" } }
69 : {};
70 const descriptionFilter =
71 searchQuery && searchQuery !== "all"
72 ? { description: { $regex: searchQuery, $options: "i" } }
73 : {};
74 const slug =
75 searchQuery && searchQuery !== "all"
76 ? { slug: { $regex: searchQuery, $options: "i" } }
77 : {};
78 const products = await Product.find({
79 $or: [
80 { name: { $regex: searchQuery, $options: "i" } },
81 { slug: { $regex: searchQuery, $options: "i" } },
82 { description: { $regex: searchQuery, $options: "i" } },
83 ],
84 })
85 .skip(pageSize * (page - 1))
86 .limit(pageSize);
87 const countProducts = await Product.countDocuments({
88 $or: [
89 { name: { $regex: searchQuery, $options: "i" } },
90 { slug: { $regex: searchQuery, $options: "i" } },
91 { description: { $regex: searchQuery, $options: "i" } },
92 ],
93 });
94 res.send({
95 products,
96 countProducts,
97 page,
98 pages: Math.ceil(countProducts / pageSize),
99 });
100 })
101);
102
103productRouter.get(
104 "/",
105 expressAsyncHandler(async (req, res) => {
106 const { query } = req;
107 const pageSize = query.pageSize || PAGE_SIZE;
108 const page = query.page || 1;
109 const category = query.category || "";
110 const subCategory = query.subCategory || "";
111 const order = query.order || "";
112 const searchQuery = query.query || "";
113 const HF = query.HF || 0;
114 const HT = query.HT || 1000;
115 const WF = query.WF || 0;
116 const WT = query.WT || 1000;
117 const LF = query.LF || 0;
118 const LT = query.LT || 1000;
119
120 const queryFilter =
121 searchQuery && searchQuery !== "all"
122 ? { name: { $regex: searchQuery, $options: "i" } }
123 : {};
124 const categoryFilter = category && category !== "all" ? { category } : {};
125 const subCategoryFilter =
126 subCategory && subCategory !== "all" ? { subCategory } : {};
127 const sortOrder =
128 order === "lowFirst"
129 ? { price: 1 }
130 : order === "highFirst"
131 ? { price: -1 }
132 : { createdAt: -1 };
133 const products = await Product.find({
134 ...queryFilter,
135 ...categoryFilter,
136 ...subCategoryFilter,
137 $and: [
138 { height: { $gte: HF } },
139 { height: { $lte: HT } },
140 { width: { $gte: WF } },
141 { width: { $lte: WT } },
142 { length: { $gte: LF } },
143 { length: { $lte: LT } },
144 ],
145 })
146 .sort(sortOrder)
147 .skip(pageSize * (page - 1))
148 .limit(pageSize);
149
150 const countProducts = await Product.countDocuments({
151 ...queryFilter,
152 ...categoryFilter,
153 ...subCategoryFilter,
154 });
155 res.send({
156 products,
157 countProducts,
158 page,
159 pages: Math.ceil(countProducts / pageSize),
160 });
161 })
162);
163/*
164productRouter.get("/", async (req, res) => {
165 const products = await Product.find();
166 res.send(products);
167});
168*/
169productRouter.get("/slug/:slug", async (req, res) => {
170 const product = await Product.findOne({ slug: req.params.slug });
171 if (product) {
172 res.send(product);
173 } else {
174 res.status(404).send({ message: "Продуктот не е пронајден" });
175 }
176});
177
178productRouter.get("/:id", async (req, res) => {
179 const product = await Product.findById(req.params.id);
180 if (product) {
181 res.send(product);
182 } else {
183 res.status(404).send({ message: "Продуктот не е пронајден" });
184 }
185});
186
187productRouter.put(
188 "/edit",
189 expressAsyncHandler(async (req, res) => {
190 const product = await Product.updateOne(
191 { slug: req.body.slug },
192 {
193 $set: {
194 name: req.body.name,
195 category: req.body.category,
196 slug: req.body.slug,
197 subCategory: req.body.subCategory,
198 description: req.body.description,
199 price: req.body.price,
200 priceMontaza: req.body.priceMontaza,
201 countInStock: req.body.countInStock,
202 },
203 }
204 );
205 /*
206 if (product) {
207 product.name = req.body.name || product.name;
208 product.slug = req.body.slug || product.slug;
209 product.price = req.body.price || product.price;
210 product.category = req.body.category || product.category;
211 product.subCategory = req.body.subCategory || product.subCategory;
212 product.description = req.body.description || product.description;
213 product.priceMontaza = req.body.priceMontaza || product.priceMontaza;
214 product.countInStock = req.body.countInStock || product.countInStock;
215 product.image = product.image;
216 product.sideImage = product.sideImage2;
217 product.sideImage2 = product.sideImage2;
218
219 const updatedProduct = await product.save();*/
220 res.status(200).send({ message: "Succesful" });
221 //else {
222 //res.status(404).send({ message: "Product Not Found" });
223 })
224);
225export default productRouter;
Note: See TracBrowser for help on using the repository browser.