From d60df7fbbdc0a683c28b19d0d2a38c6a69df5394 Mon Sep 17 00:00:00 2001 From: sahilphulwani Date: Fri, 9 May 2025 11:27:37 +0530 Subject: [PATCH 1/2] Add: Correct Solution [Task3] --- controllers/menuController.js | 50 ++++++++++- routes/menuRoutes.js | 159 ++++++++++++++++++++++++++++++++++ services/menuService.js | 70 +++++++++++++++ 3 files changed, 278 insertions(+), 1 deletion(-) create mode 100644 services/menuService.js diff --git a/controllers/menuController.js b/controllers/menuController.js index 2b66920..8d25546 100644 --- a/controllers/menuController.js +++ b/controllers/menuController.js @@ -2,6 +2,7 @@ const fs = require("fs"); const path = require("path"); const dataPath = path.join(__dirname, "../data/restaurants.json"); const writePath = path.join(__dirname, "../data/updated_restaurants.json"); +const menuService = require("../services/menuService"); const readRestaurants = () => { return JSON.parse(fs.readFileSync(dataPath, "utf8")); @@ -10,7 +11,54 @@ const readRestaurants = () => { const writeRestaurants = (restaurants) => { fs.writeFileSync(writePath, JSON.stringify(restaurants, null, 2)); }; - + exports.addMenuItem = async (req, res) => { + +}; + +exports.getMenu = async (req, res) => { + try { + const menu = await menuService.getMenu(req.params.restaurantId); + res.status(200).json(menu); + } catch (error) { + res.status(error.status || 500).json({ error: error.message }); + } +}; + +exports.updateMenuItem = async (req, res) => { + const { itemId } = req.params; + const updatedData = req.body; + + const result = await menuService.updateMenuItem(itemId, updatedData); + if (result.error) { + return res.status(404).json({ error: result.error }); + } + res + .status(200) + .json({ message: "Menu item updated successfully", menu: result.menu }); +}; + +exports.updateAvailability = async (req, res) => { + const { itemId } = req.params; + const { availability } = req.body; + + const result = await menuService.updateAvailability(itemId, availability); + if (result.error) { + return res.status(404).json({ error: result.error }); + } + res + .status(200) + .json({ message: "Availability updated successfully", menu: result.menu }); +}; + +exports.deleteMenuItem = async (req, res) => { + const { itemId } = req.params; + const result = await menuService.deleteMenuItem(itemId); + if (result.error) { + return res.status(404).json({ error: result.error }); + } + res + .status(200) + .json({ message: "Menu item deleted successfully", menu: result.menu }); }; diff --git a/routes/menuRoutes.js b/routes/menuRoutes.js index f53d429..10733ad 100644 --- a/routes/menuRoutes.js +++ b/routes/menuRoutes.js @@ -6,6 +6,11 @@ const { validateMenu } = require("../middleware/validateMenu"); router.post("/:restaurantId", validateMenu, menuController.addMenuItem); +router.get("/:restaurantId", menuController.getMenu); +router.put("/item/:itemId", menuController.updateMenuItem); +router.patch("/item/:itemId", menuController.updateAvailability); +router.delete("/item/:itemId", menuController.deleteMenuItem); + /** * @swagger * tags: @@ -105,4 +110,158 @@ router.post("/:restaurantId", validateMenu, menuController.addMenuItem); * message: "Availability is required." */ +/** + * @swagger + * /menu/{restaurantId}: + * get: + * summary: Retrieve the entire menu of a specific restaurant + * tags: [Menu] + * parameters: + * - in: path + * name: restaurantId + * required: true + * description: ID of the restaurant to retrieve the menu from + * schema: + * type: string + * responses: + * 200: + * description: Successfully retrieved menu + * content: + * application/json: + * schema: + * type: array + * items: + * type: object + * properties: + * itemId: + * type: string + * name: + * type: string + * price: + * type: number + * format: float + * category: + * type: string + * availability: + * type: boolean + */ + +/** + * @swagger + * /menu/item/{itemId}: + * put: + * summary: Update one or more details of a specific menu item + * tags: [Menu] + * parameters: + * - in: path + * name: itemId + * required: true + * description: ID of the menu item to update + * schema: + * type: string + * requestBody: + * required: true + * content: + * application/json: + * schema: + * type: object + * properties: + * itemId: + * type: string + * name: + * type: string + * price: + * type: number + * format: float + * category: + * type: string + * availability: + * type: boolean + * responses: + * 200: + * description: Menu item updated successfully + * content: + * application/json: + * schema: + * type: object + * properties: + * message: + * type: string + */ + +/** + * @swagger + * /menu/item/{itemId}: + * patch: + * summary: Update the availability status of a specific menu item + * tags: [Menu] + * parameters: + * - in: path + * name: itemId + * required: true + * description: ID of the menu item to update availability + * schema: + * type: string + * requestBody: + * required: true + * content: + * application/json: + * schema: + * type: object + * properties: + * availability: + * type: boolean + * responses: + * 200: + * description: Availability updated successfully + * content: + * application/json: + * schema: + * type: object + * properties: + * message: + * type: string + */ + +/** + * @swagger + * /menu/item/{itemId}: + * delete: + * summary: Delete a specific menu item by its ID + * tags: [Menu] + * parameters: + * - in: path + * name: itemId + * required: true + * description: ID of the menu item to delete + * schema: + * type: string + * responses: + * 200: + * description: Menu item deleted successfully + * content: + * application/json: + * schema: + * type: object + * properties: + * message: + * type: string + * menu: + * type: array + * items: + * type: object + * properties: + * itemId: + * type: string + * name: + * type: string + * price: + * type: number + * format: float + * category: + * type: string + * availability: + * type: boolean + */ + module.exports = router; diff --git a/services/menuService.js b/services/menuService.js new file mode 100644 index 0000000..da2f862 --- /dev/null +++ b/services/menuService.js @@ -0,0 +1,70 @@ +const fs = require("fs").promises; +const path = require("path"); +const writePath = path.join(__dirname, "../data/updated_restaurants.json"); + +const readRestaurants = async () => { + try { + const data = await fs.readFile("data/restaurants.json", "utf-8"); + return JSON.parse(data); + } catch (error) { + throw new Error("Failed to read restaurant data."); + } +}; + +async function writeRestaurants(restaurants) { + await fs.writeFile(writePath, JSON.stringify(restaurants, null, 2)); +} + +exports.getMenu = async (restaurantId) => { + try { + const restaurants = await readRestaurants(); + + const restaurantIndex = restaurants.findIndex((r) => r.id === restaurantId); + + return restaurants[restaurantIndex].menu; + } catch (error) { + throw error; + } +}; + +exports.updateMenuItem = async (itemId, updatedData) => { + try { + const restaurants = await readRestaurants(); + let itemFound = false; + let updatedItem = null; + + for (const restaurant of restaurants) { + const menuItem = restaurant.menu.find((item) => item.itemId === itemId); + if (menuItem) { + Object.assign(menuItem, updatedData); + updatedItem = menuItem; + itemFound = true; + break; + } + } + + await writeRestaurants(restaurants); + return { + message: "Menu item updated successfully", + item: updatedItem, + }; + } catch (error) { + throw error; + } +}; + +exports.updateAvailability = async (itemId, availability) => { + return await exports.updateMenuItem(itemId, { availability }); +}; + +exports.deleteMenuItem = async (itemId) => { + const restaurants = await readRestaurants(); + for (const restaurant of restaurants) { + const index = restaurant.menu.findIndex((item) => item.itemId === itemId); + if (index !== -1) { + restaurant.menu.splice(index, 1); + await writeRestaurants(restaurants); + return { menu: restaurant.menu }; + } + } +}; From d7a35547057b2cf148efd4e9d8a663a40bbfb465 Mon Sep 17 00:00:00 2001 From: sahilphulwani Date: Fri, 9 May 2025 22:14:53 +0530 Subject: [PATCH 2/2] Add: Buggy Code --- controllers/menuController.js | 3 +-- services/menuService.js | 16 ++++++++-------- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/controllers/menuController.js b/controllers/menuController.js index 8d25546..bbc2e44 100644 --- a/controllers/menuController.js +++ b/controllers/menuController.js @@ -2,7 +2,6 @@ const fs = require("fs"); const path = require("path"); const dataPath = path.join(__dirname, "../data/restaurants.json"); const writePath = path.join(__dirname, "../data/updated_restaurants.json"); -const menuService = require("../services/menuService"); const readRestaurants = () => { return JSON.parse(fs.readFileSync(dataPath, "utf8")); @@ -59,6 +58,6 @@ exports.deleteMenuItem = async (req, res) => { return res.status(404).json({ error: result.error }); } res - .status(200) + .status(500) .json({ message: "Menu item deleted successfully", menu: result.menu }); }; diff --git a/services/menuService.js b/services/menuService.js index da2f862..61ff752 100644 --- a/services/menuService.js +++ b/services/menuService.js @@ -12,16 +12,16 @@ const readRestaurants = async () => { }; async function writeRestaurants(restaurants) { - await fs.writeFile(writePath, JSON.stringify(restaurants, null, 2)); + await fs.writeFile(writePath, restaurants); } exports.getMenu = async (restaurantId) => { try { const restaurants = await readRestaurants(); - const restaurantIndex = restaurants.findIndex((r) => r.id === restaurantId); + const restaurant = restaurants.find((r) => r.id === restaurantId); - return restaurants[restaurantIndex].menu; + return restaurants[restaurant].menu; } catch (error) { throw error; } @@ -34,9 +34,9 @@ exports.updateMenuItem = async (itemId, updatedData) => { let updatedItem = null; for (const restaurant of restaurants) { - const menuItem = restaurant.menu.find((item) => item.itemId === itemId); + const menuItem = restaurants.menu?.find((item) => item.itemId === itemId); if (menuItem) { - Object.assign(menuItem, updatedData); + Object.assign(null, updatedData); updatedItem = menuItem; itemFound = true; break; @@ -54,7 +54,7 @@ exports.updateMenuItem = async (itemId, updatedData) => { }; exports.updateAvailability = async (itemId, availability) => { - return await exports.updateMenuItem(itemId, { availability }); + return exports.updateMenuItem(itemId, { availability }); }; exports.deleteMenuItem = async (itemId) => { @@ -62,9 +62,9 @@ exports.deleteMenuItem = async (itemId) => { for (const restaurant of restaurants) { const index = restaurant.menu.findIndex((item) => item.itemId === itemId); if (index !== -1) { - restaurant.menu.splice(index, 1); + restaurant.menu.slice(index, 1); await writeRestaurants(restaurants); - return { menu: restaurant.menu }; + return; } } };