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 | });
|
---|
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 |
|
---|
53 | const PAGE_SIZE = 7;
|
---|
54 | productRouter.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 | /*
|
---|
101 | productRouter.get("/", async (req, res) => {
|
---|
102 | const products = await Product.find();
|
---|
103 | res.send(products);
|
---|
104 | });
|
---|
105 | */
|
---|
106 | productRouter.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 |
|
---|
115 | productRouter.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 |
|
---|
124 | productRouter.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 | );
|
---|
162 | export default productRouter;
|
---|