From 1e27ca98d06f90b1455eb763f60fcbc4ead3fed0 Mon Sep 17 00:00:00 2001 From: wayneleon1 Date: Fri, 19 Jul 2024 12:29:03 +0200 Subject: [PATCH] Implement API endpoint to fetch products belonging to a specific vendor --- src/__test__/product.test.ts | 8 ++++++++ src/controller/productController.ts | 30 +++++++++++++++++++++++++++-- src/docs/productDoc.ts | 17 ++++++++++++++++ src/routes/productRoutes.ts | 11 ++++++++--- 4 files changed, 61 insertions(+), 5 deletions(-) diff --git a/src/__test__/product.test.ts b/src/__test__/product.test.ts index 359707d..1e85daa 100644 --- a/src/__test__/product.test.ts +++ b/src/__test__/product.test.ts @@ -133,6 +133,14 @@ describe('Product Controller Tests', () => { expect(response.body.message).toEqual('Data retrieved successfully'); expect(Array.isArray(response.body.data)).toBeTruthy(); }); + it('should retrieve all products by Vendor', async () => { + const response = await request(app) + .get('/api/v1/product/mine') + .set('Authorization', `Bearer ${token}`); + expect(response.statusCode).toEqual(200); + expect(response.body.message).toEqual('Data retrieved successfully'); + expect(Array.isArray(response.body.data)).toBeTruthy(); + }); it('should retrieve a single product by ID', async () => { const response = await request(app) diff --git a/src/controller/productController.ts b/src/controller/productController.ts index 890255d..9e69593 100644 --- a/src/controller/productController.ts +++ b/src/controller/productController.ts @@ -506,6 +506,32 @@ export const getBestSellingProducts = async (req: Request, res: Response) => { res.json(result); }; +export const getMyProducts = errorHandler( + async (req: Request, res: Response) => { + const vendorId = req.user!.id; - - + const products = await productRepository.find({ + where: { + vendor: { + id: vendorId, + }, + }, + select: { + category: { + name: true, + }, + reviews: { + content: true, + rating: true, + user: { + firstName: true, + }, + }, + }, + relations: ['category', 'reviews'], + }); + return res + .status(200) + .json({ message: 'Data retrieved successfully', data: products }); + } +); diff --git a/src/docs/productDoc.ts b/src/docs/productDoc.ts index 0395fd5..58d3ba2 100644 --- a/src/docs/productDoc.ts +++ b/src/docs/productDoc.ts @@ -27,6 +27,23 @@ * description: Products deleted successfully * '500': * description: Failed to delete products + * + */ +/** + * @swagger + * /api/v1/product/mine: + * get: + * summary: Get all products by Vendor + * tags: [Product] + * security: + * - bearerAuth: [] + * responses: + * '200': + * description: Successful operation + * '500': + * description: Internal server error + * '401': + * description: Unauthorized */ /** diff --git a/src/routes/productRoutes.ts b/src/routes/productRoutes.ts index 1e72a21..257aa6b 100644 --- a/src/routes/productRoutes.ts +++ b/src/routes/productRoutes.ts @@ -11,6 +11,7 @@ import { updateProductAvailability, checkProductAvailability, getBestSellingProducts, + getMyProducts, } from '../controller/productController'; import { IsLoggedIn } from '../middlewares/isLoggedIn'; import { checkRole } from '../middlewares/authorize'; @@ -26,21 +27,25 @@ productRouter .get(getAllProducts) .delete(IsLoggedIn, deleteAllProduct); +productRouter + .route('/mine') + .get(IsLoggedIn, checkRole(['Vendor']), getMyProducts); + productRouter.route('/recommended').get(getRecommendedProducts); productRouter.route('/bestselling').get(getBestSellingProducts); productRouter .route('/:productId') .get(getProduct) - .put(IsLoggedIn, checkRole(['Vendor']), updateProduct) - .delete(IsLoggedIn, deleteProduct); + .put(IsLoggedIn, checkRole(['Vendor', 'Admin']), updateProduct) + .delete(IsLoggedIn, checkRole(['Vendor', 'Admin']), deleteProduct); productRouter .route('/:productId/availability') .get(IsLoggedIn, checkProductAvailability) .put( IsLoggedIn, - checkRole(['Vendor']), + checkRole(['Vendor', 'Admin']), validateAvailability, updateProductAvailability );