CI / Generate TypeScript types (push) Successful in 21s
CI / Server unit tests (push) Successful in 22s
CI / Build server (push) Successful in 35s
CI / Build client (push) Successful in 36s
CI / Playwright E2E tests (push) Successful in 1m18s
CI / Build and push Docker image (push) Successful in 40s
CI / Notify (push) Successful in 2s
148 lines
6.3 KiB
TypeScript
148 lines
6.3 KiB
TypeScript
import express, { Request } from "express";
|
||
import { getLogin } from "../auth";
|
||
import { createPizzaDay, deletePizzaDay, getPizzaList, getSalatList, addPizzaOrder, addSalatOrder, removePizzaOrder, lockPizzaDay, unlockPizzaDay, finishPizzaOrder, finishPizzaDelivery, updatePizzaDayNote, updatePizzaFee, dismissPendingQr } from "../pizza";
|
||
import { markGroupMemberPaid } from "../groups";
|
||
import { parseToken } from "../utils";
|
||
import { getWebsocket } from "../websocket";
|
||
import { AddPizzaData, DismissQrData, FinishDeliveryData, RemovePizzaData, UpdatePizzaDayNoteData, UpdatePizzaFeeData } from "../../../types";
|
||
|
||
const router = express.Router();
|
||
|
||
/** Založí pizza day pro aktuální den, za předpokladu že dosud neexistuje. */
|
||
router.post("/create", async (req: Request<{}, any, undefined>, res) => {
|
||
const login = getLogin(parseToken(req));
|
||
const data = await createPizzaDay(login);
|
||
res.status(200).json(data);
|
||
getWebsocket().emit("message", data);
|
||
});
|
||
|
||
/** Smaže pizza day pro aktuální den, za předpokladu že existuje. */
|
||
router.post("/delete", async (req: Request<{}, any, undefined>, res) => {
|
||
const login = getLogin(parseToken(req));
|
||
const data = await deletePizzaDay(login);
|
||
getWebsocket().emit("message", data);
|
||
});
|
||
|
||
router.post("/add", async (req: Request<{}, any, AddPizzaData["body"]>, res) => {
|
||
const login = getLogin(parseToken(req));
|
||
if (req.body?.salatIndex !== undefined && !isNaN(req.body.salatIndex)) {
|
||
// Přidání salátu
|
||
const salatIndex = req.body.salatIndex;
|
||
const salaty = await getSalatList();
|
||
if (!salaty) {
|
||
throw new Error("Selhalo získání seznamu dostupných salátů.");
|
||
}
|
||
if (!salaty[salatIndex]) {
|
||
throw new Error("Neplatný index salátu: " + salatIndex);
|
||
}
|
||
const data = await addSalatOrder(login, salaty[salatIndex]);
|
||
getWebsocket().emit("message", data);
|
||
res.status(200).json({});
|
||
} else {
|
||
// Přidání pizzy
|
||
if (req.body?.pizzaIndex === undefined || isNaN(req.body.pizzaIndex)) {
|
||
throw new Error("Nebyl předán index pizzy ani salátu");
|
||
}
|
||
const pizzaIndex = req.body.pizzaIndex;
|
||
if (req.body?.pizzaSizeIndex === undefined || isNaN(req.body.pizzaSizeIndex)) {
|
||
throw new Error("Nebyl předán index velikosti pizzy");
|
||
}
|
||
const pizzaSizeIndex = req.body.pizzaSizeIndex;
|
||
let pizzy = await getPizzaList();
|
||
if (!pizzy) {
|
||
throw new Error("Selhalo získání seznamu dostupných pizz.");
|
||
}
|
||
if (!pizzy[pizzaIndex]) {
|
||
throw new Error("Neplatný index pizzy: " + pizzaIndex);
|
||
}
|
||
if (!pizzy[pizzaIndex].sizes[pizzaSizeIndex]) {
|
||
throw new Error("Neplatný index velikosti pizzy: " + pizzaSizeIndex);
|
||
}
|
||
const data = await addPizzaOrder(login, pizzy[pizzaIndex], pizzy[pizzaIndex].sizes[pizzaSizeIndex]);
|
||
getWebsocket().emit("message", data);
|
||
res.status(200).json({});
|
||
}
|
||
});
|
||
|
||
router.post("/remove", async (req: Request<{}, any, RemovePizzaData["body"]>, res) => {
|
||
const login = getLogin(parseToken(req));
|
||
if (!req.body?.pizzaOrder) {
|
||
throw new Error("Nebyla předána objednávka");
|
||
}
|
||
const data = await removePizzaOrder(login, req.body?.pizzaOrder);
|
||
getWebsocket().emit("message", data);
|
||
res.status(200).json({});
|
||
});
|
||
|
||
router.post("/lock", async (req: Request<{}, any, undefined>, res) => {
|
||
const login = getLogin(parseToken(req));
|
||
const data = await lockPizzaDay(login);
|
||
getWebsocket().emit("message", data);
|
||
res.status(200).json({});
|
||
});
|
||
|
||
router.post("/unlock", async (req: Request<{}, any, undefined>, res) => {
|
||
const login = getLogin(parseToken(req));
|
||
const data = await unlockPizzaDay(login);
|
||
getWebsocket().emit("message", data);
|
||
res.status(200).json({});
|
||
});
|
||
|
||
router.post("/finishOrder", async (req: Request<{}, any, undefined>, res) => {
|
||
const login = getLogin(parseToken(req));
|
||
const data = await finishPizzaOrder(login);
|
||
getWebsocket().emit("message", data);
|
||
res.status(200).json({});
|
||
});
|
||
|
||
router.post("/finishDelivery", async (req: Request<{}, any, FinishDeliveryData["body"]>, res) => {
|
||
const login = getLogin(parseToken(req));
|
||
const data = await finishPizzaDelivery(login, req.body.bankAccount, req.body.bankAccountHolder);
|
||
getWebsocket().emit("message", data);
|
||
res.status(200).json({});
|
||
});
|
||
|
||
router.post("/updatePizzaDayNote", async (req: Request<{}, any, UpdatePizzaDayNoteData["body"]>, res, next) => {
|
||
const login = getLogin(parseToken(req));
|
||
try {
|
||
if (req.body.note && req.body.note.length > 70) {
|
||
throw new Error("Poznámka může mít maximálně 70 znaků");
|
||
}
|
||
const data = await updatePizzaDayNote(login, req.body.note);
|
||
getWebsocket().emit("message", data);
|
||
res.status(200).json(data);
|
||
} catch (e: any) { next(e) }
|
||
});
|
||
|
||
router.post("/updatePizzaFee", async (req: Request<{}, any, UpdatePizzaFeeData["body"]>, res, next) => {
|
||
const login = getLogin(parseToken(req));
|
||
if (!req.body.login) {
|
||
return res.status(400).json({ error: "Nebyl předán login cílového uživatele" });
|
||
}
|
||
try {
|
||
const data = await updatePizzaFee(login, req.body.login, req.body.text, req.body.price);
|
||
getWebsocket().emit("message", data);
|
||
res.status(200).json(data);
|
||
} catch (e: any) { next(e) }
|
||
});
|
||
|
||
/** Označí QR kód jako uhrazený. */
|
||
router.post("/dismissQr", async (req: Request<{}, any, DismissQrData["body"]>, res, next) => {
|
||
const login = getLogin(parseToken(req));
|
||
if (!req.body.id) {
|
||
return res.status(400).json({ error: "Nebyl předán identifikátor QR kódu" });
|
||
}
|
||
try {
|
||
const dismissed = await dismissPendingQr(login, req.body.id);
|
||
if (dismissed?.groupId) {
|
||
// Platbu zapisujeme ke dni, ke kterému se QR kód vztahuje, ne k dnešnímu dni –
|
||
// jinak by se při potvrzení platby jiný den příznak zapsal do špatných dat (a zelené zatržítko by se neobjevilo).
|
||
const orderDate = new Date(`${dismissed.date}T00:00:00`);
|
||
const updatedExtra = await markGroupMemberPaid(login, dismissed.groupId, orderDate);
|
||
if (updatedExtra) getWebsocket().emit("message", updatedExtra);
|
||
}
|
||
res.status(200).json({});
|
||
} catch (e: any) { next(e) }
|
||
});
|
||
|
||
export default router; |