import express, { Request, Response, NextFunction } from "express"; import { addMeal, deleteMeal, fillSameNameMeals, getDay, getMealHistory, getMealSources, getRange, setMealMultiplier, updateMeal, } from "../meals"; import { getDayOverview } from "../dayOverview"; import { getLogin } from "../auth"; import { formatDate, getToday, parseToken, requireIsoDate } from "../utils"; const router = express.Router(); /** * Vrátí jídla přihlášeného uživatele za jeden den. Bez parametru vrací dnešek. */ router.get("/day", async (req: Request, res: Response, next: NextFunction) => { try { const login = getLogin(parseToken(req)); const date = req.query.date == null ? formatDate(getToday()) : requireIsoDate(req.query.date, 'date'); res.status(200).json(await getDay(login, date)); } catch (e) { next(e); } }); /** * Vrátí dny přihlášeného uživatele v rozsahu, které obsahují alespoň jeden záznam. */ router.get("/range", async (req: Request, res: Response, next: NextFunction) => { try { const login = getLogin(parseToken(req)); const from = requireIsoDate(req.query.from, 'from'); const to = requireIsoDate(req.query.to, 'to'); res.status(200).json(await getRange(login, from, to)); } catch (e) { next(e); } }); /** Vrátí jídla z historie, každý název jednou — pro našeptávání při zakládání jídla. */ router.get("/history", async (req: Request, res: Response, next: NextFunction) => { try { const login = getLogin(parseToken(req)); res.status(200).json(await getMealHistory(login)); } catch (e) { next(e); } }); /** Vrátí zdroje jídel, které uživatel už použil — nabídka pro pole Zdroj. */ router.get("/sources", async (req: Request, res: Response, next: NextFunction) => { try { const login = getLogin(parseToken(req)); res.status(200).json(await getMealSources(login)); } catch (e) { next(e); } }); /** Doplní energii a živiny jídla do ostatních jídel stejného názvu, která je nemají. */ router.post("/fillSameName", async (req: Request, res: Response, next: NextFunction) => { try { const login = getLogin(parseToken(req)); const { id, date, dryRun } = req.body ?? {}; res.status(200).json(await fillSameNameMeals(login, id, date, dryRun === true)); } catch (e) { next(e); } }); /** Přidá jídlo do zvoleného dne. */ router.post("/add", async (req: Request, res: Response, next: NextFunction) => { try { const login = getLogin(parseToken(req)); res.status(200).json(await addMeal(login, req.body)); } catch (e) { next(e); } }); /** Upraví existující záznam o jídle. */ router.post("/update", async (req: Request, res: Response, next: NextFunction) => { try { const login = getLogin(parseToken(req)); const { id, ...input } = req.body ?? {}; res.status(200).json(await updateMeal(login, id, input)); } catch (e) { next(e); } }); /** Smaže záznam o jídle. */ router.post("/delete", async (req: Request, res: Response, next: NextFunction) => { try { const login = getLogin(parseToken(req)); const { id, date } = req.body ?? {}; res.status(200).json(await deleteMeal(login, id, date)); } catch (e) { next(e); } }); /** Nastaví násobek porce z přehledu dne a vrátí celý přehled, protože se mění i bilance. */ router.post("/multiplier", async (req: Request, res: Response, next: NextFunction) => { try { const login = getLogin(parseToken(req)); const { id, date, multiplier } = req.body ?? {}; const day = await setMealMultiplier(login, id, date, multiplier); res.status(200).json(await getDayOverview(login, day)); } catch (e) { next(e); } }); export default router;