From 024961787085291d1171263b7af65754f2991f04 Mon Sep 17 00:00:00 2001 From: Lionel Kaneza Date: Mon, 11 Nov 2024 21:56:59 +0200 Subject: [PATCH] feat: create get single product endpoint --- src/controllers/admin/products.controller.ts | 31 ++++++++++++++++++++ src/routes/admin.routes.ts | 8 ++++- src/validations/admin-products.validation.ts | 9 +++++- 3 files changed, 46 insertions(+), 2 deletions(-) diff --git a/src/controllers/admin/products.controller.ts b/src/controllers/admin/products.controller.ts index 770446c..6bc5b46 100644 --- a/src/controllers/admin/products.controller.ts +++ b/src/controllers/admin/products.controller.ts @@ -106,3 +106,34 @@ export const getAllProducts = async ( next(error); } }; + +export const getSingleProduct = async ( + request: Request, + response: Response, + next: NextFunction, +) => { + try { + const validationErrors = getValidationResult(request); + + if (validationErrors) { + const error = new CustomError( + ValidationErrorMessage, + 400, + validationErrors, + ); + return next(error); + } + + const product = await Product.findOne({ _id: request.params.productId }); + + if (!product) + return response + .status(404) + .json({ message: getNotFoundMessage("Product") }); + + response.status(200).json(product.toObject()); + } catch { + const error = new CustomError(ServerErrorMessage); + next(error); + } +}; diff --git a/src/routes/admin.routes.ts b/src/routes/admin.routes.ts index 4ef94fc..39650d6 100644 --- a/src/routes/admin.routes.ts +++ b/src/routes/admin.routes.ts @@ -16,6 +16,7 @@ import { deleteCategoryChain, getAllSanitizer, getSingleCategoryChain, + getSingleProductChain, updateCategoryChain, } from "../validations"; @@ -68,6 +69,11 @@ router createProductChain(), productsController.createProduct, ) - .get("/products", getAllSanitizer(), productsController.getAllProducts); + .get("/products", getAllSanitizer(), productsController.getAllProducts) + .get( + "/products/:productId", + getSingleProductChain(), + productsController.getSingleProduct, + ); export default router; diff --git a/src/validations/admin-products.validation.ts b/src/validations/admin-products.validation.ts index 94b7642..56bc899 100644 --- a/src/validations/admin-products.validation.ts +++ b/src/validations/admin-products.validation.ts @@ -1,4 +1,4 @@ -import { body } from "express-validator"; +import { body, param } from "express-validator"; export const createProductChain = () => [ body("name", "Name is required") @@ -33,3 +33,10 @@ export const createProductChain = () => [ .isMongoId() .withMessage("Category ID must be valid."), ]; + +export const getSingleProductChain = () => + param("productId", "Invalid product id") + .isString() + .trim() + .notEmpty({ ignore_whitespace: true }) + .isMongoId();