[55ed171] | 1 | import express, { query } from "express";
|
---|
[717ceae] | 2 | import Product from "../models/productModel.js";
|
---|
[55ed171] | 3 | import multer from "multer";
|
---|
| 4 | import expressAsyncHandler from "express-async-handler";
|
---|
| 5 | import userRouter from "./userRoutes.js";
|
---|
[717ceae] | 6 |
|
---|
| 7 | const productRouter = express.Router();
|
---|
| 8 |
|
---|
[55ed171] | 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 |
|
---|
[113029b] | 53 | const PAGE_SIZE = 7;
|
---|
[55ed171] | 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 | /*
|
---|
[717ceae] | 101 | productRouter.get("/", async (req, res) => {
|
---|
| 102 | const products = await Product.find();
|
---|
| 103 | res.send(products);
|
---|
| 104 | });
|
---|
[55ed171] | 105 | */
|
---|
[717ceae] | 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 |
|
---|
[55ed171] | 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 | );
|
---|
[717ceae] | 162 | export default productRouter;
|
---|