1 | import express, { query } from "express";
|
---|
2 | import Product from "../models/productModel.js";
|
---|
3 | import multer from "multer";
|
---|
4 | import expressAsyncHandler from "express-async-handler";
|
---|
5 | import userRouter from "./userRoutes.js";
|
---|
6 |
|
---|
7 | const productRouter = express.Router();
|
---|
8 |
|
---|
9 | const 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 |
|
---|
18 | const upload = multer({ storage: storage });
|
---|
19 | const 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 | ]);
|
---|
26 | productRouter.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 |
|
---|
56 | const PAGE_SIZE = 7;
|
---|
57 |
|
---|
58 | productRouter.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 |
|
---|
103 | productRouter.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 | /*
|
---|
164 | productRouter.get("/", async (req, res) => {
|
---|
165 | const products = await Product.find();
|
---|
166 | res.send(products);
|
---|
167 | });
|
---|
168 | */
|
---|
169 | productRouter.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 |
|
---|
178 | productRouter.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 |
|
---|
187 | productRouter.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 | );
|
---|
225 | export default productRouter;
|
---|