Možnost náhledu a výběru na další dny v týdnu

This commit is contained in:
2023-09-06 19:22:19 +02:00
parent 5379c21203
commit 832d3089ec
9 changed files with 766 additions and 304 deletions

View File

@@ -2,13 +2,12 @@ import express from "express";
import { Server } from "socket.io";
import bodyParser from "body-parser";
import cors from 'cors';
import { addChoice, addPizzaOrder, createPizzaDay, deletePizzaDay, finishPizzaDelivery, finishPizzaOrder, getData, getPizzaList, getRestaurantMenu, lockPizzaDay, removeChoice, removeChoices, removePizzaOrder, savePizzaList, unlockPizzaDay, updateDepartureTime, updateNote } from "./service";
import { addChoice, addPizzaOrder, createPizzaDay, deletePizzaDay, finishPizzaDelivery, finishPizzaOrder, getData, getDateForWeekIndex, getPizzaList, getToday, lockPizzaDay, removeChoice, removeChoices, removePizzaOrder, unlockPizzaDay, updateDepartureTime, updateNote } from "./service";
import dotenv from 'dotenv';
import path from 'path';
import { getQr } from "./qr";
import { generateToken, getLogin, getTrusted, verify } from "./auth";
import { Food, Locations, Restaurants } from "../../types";
import { downloadPizzy } from "./chefie";
import { getDayOfWeekIndex } from "./utils";
const ENVIRONMENT = process.env.NODE_ENV || 'production';
dotenv.config({ path: path.resolve(__dirname, `./.env.${ENVIRONMENT}`) });
@@ -51,6 +50,28 @@ const parseToken = (req: any) => {
}
}
/**
* Ověří a vrátí index dne v týdnu z požadavku, za předpokladu, že byl předán, a je zároveň
* roven nebo vyšší indexu dnešního dne.
*
* @param req request
* @returns index dne v týdnu
*/
const parseValidateFutureDayIndex = (req: any) => {
if (!req.body.dayIndex) {
throw Error(`Nebyl předán index dne v týdnu.`);
}
const todayDayIndex = getDayOfWeekIndex(getToday());
const dayIndex = parseInt(req.body.dayIndex);
if (isNaN(dayIndex)) {
throw Error(`Neplatný index dne v týdnu: ${req.body.dayIndex}`);
}
if (dayIndex < todayDayIndex) {
throw Error(`Předaný index dne v týdnu (${dayIndex}) nesmí být nižší než dnešní den (${todayDayIndex})`);
}
return dayIndex;
}
// ----------- Metody nevyžadující token --------------
app.get("/api/whoami", (req, res) => {
@@ -110,19 +131,14 @@ app.use((req, res, next) => {
/** Vrátí data pro aktuální den. */
app.get("/api/data", async (req, res) => {
res.status(200).json(await getData());
});
/** Vrátí obědové menu pro dostupné podniky. */
app.get("/api/food", async (req, res) => {
const mock = process.env.MOCK_DATA === 'true';
const date = new Date();
const data = {
[Restaurants.SLADOVNICKA]: await getRestaurantMenu(Restaurants.SLADOVNICKA, date, mock),
[Restaurants.UMOTLIKU]: await getRestaurantMenu(Restaurants.UMOTLIKU, date, mock),
[Restaurants.TECHTOWER]: await getRestaurantMenu(Restaurants.TECHTOWER, date, mock),
let date = undefined;
if (req.query.dayIndex != null && typeof req.query.dayIndex === 'string') {
const index = parseInt(req.query.dayIndex);
if (!isNaN(index)) {
date = getDateForWeekIndex(parseInt(req.query.dayIndex));
}
}
res.status(200).json(data);
res.status(200).json(await getData(date));
});
/** Založí pizza day pro aktuální den, za předpokladu že dosud neexistuje. */
@@ -207,27 +223,58 @@ app.post("/api/addChoice", async (req, res) => {
const login = getLogin(parseToken(req));
const trusted = getTrusted(parseToken(req));
if (req.body.locationIndex > -1) {
const data = await addChoice(login, trusted, req.body.locationIndex, req.body.foodIndex);
let date = undefined;
if (req.body.dayIndex != null) {
let dayIndex;
try {
dayIndex = parseValidateFutureDayIndex(req);
} catch (e: any) {
return res.status(400).json({ error: e.message });
}
date = getDateForWeekIndex(dayIndex);
}
const data = await addChoice(login, trusted, req.body.locationIndex, req.body.foodIndex, date);
io.emit("message", data);
res.status(200).json(data);
return res.status(200).json(data);
}
res.status(400); // TODO přidat popis chyby
return res.status(400); // TODO přidat popis chyby
});
app.post("/api/removeChoices", async (req, res) => {
const login = getLogin(parseToken(req));
const data = await removeChoices(login, req.body.locationIndex);
let date = undefined;
if (req.body.dayIndex != null) {
let dayIndex;
try {
dayIndex = parseValidateFutureDayIndex(req);
} catch (e: any) {
return res.status(400).json({ error: e.message });
}
date = getDateForWeekIndex(dayIndex);
}
const data = await removeChoices(login, req.body.locationIndex, date);
io.emit("message", data);
res.status(200).json(data);
});
app.post("/api/removeChoice", async (req, res) => {
const login = getLogin(parseToken(req));
const data = await removeChoice(login, req.body.locationIndex, req.body.foodIndex);
let date = undefined;
if (req.body.dayIndex != null) {
let dayIndex;
try {
dayIndex = parseValidateFutureDayIndex(req);
} catch (e: any) {
return res.status(400).json({ error: e.message });
}
date = getDateForWeekIndex(dayIndex);
}
const data = await removeChoice(login, req.body.locationIndex, req.body.foodIndex, date);
io.emit("message", data);
res.status(200).json(data);
});
// TODO přejmenovat, ať je jasné, že to patří k Pizza day
app.post("/api/updateNote", async (req, res) => {
const login = getLogin(parseToken(req));
if (req.body.note && req.body.note.length > 100) {
@@ -240,7 +287,17 @@ app.post("/api/updateNote", async (req, res) => {
app.post("/api/changeDepartureTime", async (req, res) => {
const login = getLogin(parseToken(req));
const data = await updateDepartureTime(login, req.body?.time);
let date = undefined;
if (req.body.dayIndex != null) {
let dayIndex;
try {
dayIndex = parseValidateFutureDayIndex(req);
} catch (e: any) {
return res.status(400).json({ error: e.message });
}
date = getDateForWeekIndex(dayIndex);
}
const data = await updateDepartureTime(login, req.body?.time, date);
io.emit("message", data);
res.status(200).json(data);
});