[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,
|
---|
[a2e5735] | 44 | height: req.body.H,
|
---|
| 45 | width: req.body.W,
|
---|
| 46 | length: req.body.L,
|
---|
[55ed171] | 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 |
|
---|
[113029b] | 56 | const PAGE_SIZE = 7;
|
---|
[a2e5735] | 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 |
|
---|
[55ed171] | 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 || "";
|
---|
[a2e5735] | 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;
|
---|
[55ed171] | 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,
|
---|
[a2e5735] | 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 | ],
|
---|
[55ed171] | 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 | /*
|
---|
[717ceae] | 164 | productRouter.get("/", async (req, res) => {
|
---|
| 165 | const products = await Product.find();
|
---|
| 166 | res.send(products);
|
---|
| 167 | });
|
---|
[55ed171] | 168 | */
|
---|
[717ceae] | 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 |
|
---|
[55ed171] | 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 | );
|
---|
[717ceae] | 225 | export default productRouter;
|
---|