Refresh menu, první část

This commit is contained in:
2025-04-15 19:51:41 +02:00
parent 49b8ab5c13
commit 67758d91cf
6 changed files with 115 additions and 6 deletions

View File

@@ -1,11 +1,14 @@
import express, { Request } from "express";
import { getLogin, getTrusted } from "../auth";
import { addChoice, getDateForWeekIndex, getToday, removeChoice, removeChoices, updateDepartureTime, updateNote } from "../service";
import { addChoice, getDateForWeekIndex, getRestaurantMenu, getToday, removeChoice, removeChoices, updateDepartureTime, updateNote } from "../service";
import { getDayOfWeekIndex, parseToken } from "../utils";
import { getWebsocket } from "../websocket";
import { callNotifikace } from "../notifikace";
import { AddChoiceData, ChangeDepartureTimeData, RemoveChoiceData, RemoveChoicesData, UdalostEnum, UpdateNoteData } from "../../../types/gen/types.gen";
/** Po jak dlouhé době (v minutách) lze provést nové načtení menu. */
const MENU_REFRESH_INTERVAL = 15;
/**
* 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.
@@ -141,4 +144,25 @@ router.post("/jdemeObed", async (req, res, next) => {
} catch (e: any) { next(e) }
});
router.post("/refreshMenu", async (req, res, next) => {
if (!req.body || !Array.isArray(req.body)) {
return res.status(400).json({ error: "Neplatný požadavek" });
}
try {
const now = new Date();
for (const restaurant of req.body) {
// TODO tohle je technicky špatně, protože pokud aktuálně jídla načtená nejsou, tak je toto volání načte a následně je to načte znovu kvůli force!
const menu = await getRestaurantMenu(restaurant);
if (menu.lastUpdate != null) {
const minutes = (now.getTime() - menu.lastUpdate) / 1000 / 60;
if (minutes < MENU_REFRESH_INTERVAL) {
throw Error(`Podnik ${restaurant} byl přenačtený před ${Math.round(minutes)} minutami. Nové přenačtení lze provést nejdříve za ${Math.round(MENU_REFRESH_INTERVAL - minutes)} minut.`);
}
}
await getRestaurantMenu(restaurant, undefined, true);
}
res.status(200).json({});
} catch (e: any) { next(e) }
});
export default router;

View File

@@ -78,13 +78,13 @@ async function getMenu(date: Date): Promise<WeekMenu | undefined> {
// TODO přesun do restaurants.ts
/**
* Vrátí menu dané restaurace pro předaný den.
* Pokud neexistuje, provede stažení menu pro příslušný týden a uložení do DB.
* Pokud neexistuje nebo je nastaven příznak force, provede stažení menu pro příslušný týden a uložení do DB.
*
* @param restaurant restaurace
* @param date datum, ke kterému získat menu
* @param mock příznak, zda chceme pouze mock data
* @param force Příznak, zda znovu získat aktuální menu i v případě, že je již načteno. Pokud není předán, provede se načtení pouze v případě, že menu aktuálně nemáme. Pokud je true, provede nové načtení. Pokud je false, neprovede se nové načtení ani v případě, že menu aktuálně nemáme.
*/
export async function getRestaurantMenu(restaurant: Restaurant, date?: Date): Promise<RestaurantDayMenu> {
export async function getRestaurantMenu(restaurant: Restaurant, date?: Date, force?: boolean): Promise<RestaurantDayMenu> {
const usedDate = date ?? getToday();
const dayOfWeekIndex = getDayOfWeekIndex(usedDate);
const now = new Date().getTime();
@@ -112,7 +112,8 @@ export async function getRestaurantMenu(restaurant: Restaurant, date?: Date): Pr
};
}
}
if (!weekMenu[dayOfWeekIndex][restaurant]?.food?.length) {
if ((!weekMenu[dayOfWeekIndex][restaurant]?.food?.length && force === undefined) || force) {
const firstDay = getFirstWorkDayOfWeek(usedDate);
const mock = process.env.MOCK_DATA === 'true';
switch (restaurant) {