'use strict'; const express = require('express'); const router = express.Router(); const shoppingService = require('../services/shoppingService'); const { authenticate } = require('../middleware/authenticate'); const { validate } = require('../utils/validate'); const { createShoppingListSchema, addShoppingListItemSchema, updateShoppingListItemSchema, addRecipesToListSchema, } = require('../utils/validation'); // All shopping list routes require authentication router.use(authenticate); // GET /v1/shopping-lists router.get('/', async (req, res, next) => { try { const lists = await shoppingService.getShoppingLists(req.user.sub); return res.status(200).json({ shopping_lists: lists, synced_at: new Date().toISOString(), }); } catch (err) { return next(err); } }); // POST /v1/shopping-lists router.post('/', async (req, res, next) => { try { const data = validate(createShoppingListSchema, req.body); const list = await shoppingService.createShoppingList(req.user.sub, data); return res.status(201).json({ shopping_list: list }); } catch (err) { return next(err); } }); // GET /v1/shopping-lists/:list_id router.get('/:list_id', async (req, res, next) => { try { const list = await shoppingService.getShoppingListById( req.user.sub, req.params.list_id ); return res.status(200).json({ shopping_list: list, synced_at: new Date().toISOString(), }); } catch (err) { return next(err); } }); // DELETE /v1/shopping-lists/:list_id router.delete('/:list_id', async (req, res, next) => { try { await shoppingService.deleteShoppingList(req.user.sub, req.params.list_id); return res.status(204).send(); } catch (err) { return next(err); } }); // POST /v1/shopping-lists/:list_id/items router.post('/:list_id/items', async (req, res, next) => { try { const data = validate(addShoppingListItemSchema, req.body); const result = await shoppingService.addItemToList( req.user.sub, req.params.list_id, data ); return res.status(201).json(result); } catch (err) { return next(err); } }); // POST /v1/shopping-lists/:list_id/add-recipes router.post('/:list_id/add-recipes', async (req, res, next) => { try { const data = validate(addRecipesToListSchema, req.body); const result = await shoppingService.addRecipesToList( req.user.sub, req.params.list_id, data ); return res.status(201).json(result); } catch (err) { return next(err); } }); // PUT /v1/shopping-lists/:list_id/items/:item_id router.put('/:list_id/items/:item_id', async (req, res, next) => { try { const data = validate(updateShoppingListItemSchema, req.body); const item = await shoppingService.updateListItem( req.user.sub, req.params.list_id, req.params.item_id, data ); return res.status(200).json({ item }); } catch (err) { return next(err); } }); // DELETE /v1/shopping-lists/:list_id/items/:item_id router.delete('/:list_id/items/:item_id', async (req, res, next) => { try { await shoppingService.deleteListItem( req.user.sub, req.params.list_id, req.params.item_id ); return res.status(204).send(); } catch (err) { return next(err); } }); module.exports = router;