diff --git a/server/src/mock.ts b/server/src/mock.ts index d825553..2fcd874 100644 --- a/server/src/mock.ts +++ b/server/src/mock.ts @@ -1,7 +1,7 @@ // Mockovací data pro podporované podniky, na jeden týden const MOCK_DATA = { - 'sladovnicka': [ - [ + 'sladovnicka': { + 'MONDAY': [ { amount: "0,25l", name: "Kulajda", @@ -27,7 +27,7 @@ const MOCK_DATA = { isSoup: false, } ], - [ + 'TUESDAY': [ { amount: "0,25l", name: "Hovězí vývar s kapáním", @@ -53,7 +53,7 @@ const MOCK_DATA = { isSoup: false, } ], - [ + 'WEDNESDAY': [ { amount: "0,25l", name: "Zelná polévka s klobásou", @@ -79,7 +79,7 @@ const MOCK_DATA = { isSoup: false, } ], - [ + 'THURSDAY': [ { amount: "0,25l", name: "Kuřecí vývar s nudlemi", @@ -105,7 +105,7 @@ const MOCK_DATA = { isSoup: false, } ], - [ + 'FRIDAY': [ { amount: "0,25l", name: "Dršťková polévka", @@ -131,7 +131,7 @@ const MOCK_DATA = { isSoup: false, } ] - ], + }, 'uMotliku': [ [ { diff --git a/server/src/restaurants.ts b/server/src/restaurants.ts index 7205035..6b975a8 100644 --- a/server/src/restaurants.ts +++ b/server/src/restaurants.ts @@ -1,6 +1,6 @@ import axios from "axios"; import { load } from 'cheerio'; -import { Food } from "../../types"; +import { DayOfWeek, DayOfWeekEnum, DayOfWeekIndex, Food, RestaurantWeeklyMenu } from "../../types"; import { getMenuSladovnickaMock, getMenuTechTowerMock, getMenuUMotlikuMock, getMenuZastavkaUmichalaMock } from "./mock"; // Fráze v názvech jídel, které naznačují že se jedná o polévku @@ -69,7 +69,7 @@ const getHtml = async (url: string): Promise => { * @param mock zda vrátit mock data * @returns seznam jídel pro daný týden */ -export const getMenuSladovnicka = async (firstDayOfWeek: Date, mock: boolean = false): Promise => { +export const getMenuSladovnicka = async (firstDayOfWeek: Date, mock: boolean = false): Promise => { if (mock) { return getMenuSladovnickaMock(); } @@ -78,7 +78,8 @@ export const getMenuSladovnicka = async (firstDayOfWeek: Date, mock: boolean = f const $ = load(html); const list = $('ul.tab-links').children(); - const result: Food[][] = []; + const result: RestaurantWeeklyMenu = {}; + // TODO upravit až bude enum for (let dayIndex = 0; dayIndex < 5; dayIndex++) { const currentDate = new Date(firstDayOfWeek); currentDate.setDate(firstDayOfWeek.getDate() + dayIndex); @@ -96,7 +97,8 @@ export const getMenuSladovnicka = async (firstDayOfWeek: Date, mock: boolean = f }) if (index === undefined) { // Pravděpodobně svátek, nebo je zavřeno - result[dayIndex] = [{ + const index: number = Object.keys(DayOfWeekEnum).indexOf('Casual'); // 1 + result[dayIndex as DayOfWeekEnum] = [{ amount: undefined, name: "Pro daný den nebyla nalezena denní nabídka", price: "", diff --git a/server/src/service.ts b/server/src/service.ts index 14a863b..7642311 100644 --- a/server/src/service.ts +++ b/server/src/service.ts @@ -1,5 +1,5 @@ import { InsufficientPermissions, formatDate, getDayOfWeekIndex, getFirstWorkDayOfWeek, getHumanDate, getIsWeekend, getWeekNumber } from "./utils"; -import { ClientData, Restaurants, RestaurantDailyMenu, DepartureTime, DayData, WeekMenu, LocationKey, DayOfWeekIndex, daysOfWeeksIndices } from "../../types"; +import { ClientData, Restaurants, RestaurantDailyMenu, DepartureTime, DayData, WeekMenu, LocationKey, DayOfWeekIndex, daysOfWeeksIndices, DayOfWeekEnum, DayOfWeek } from "../../types"; import getStorage from "./storage"; import { getMenuSladovnicka, getMenuTechTower, getMenuUMotliku, getMenuZastavkaUmichala } from "./restaurants"; import { getTodayMock } from "./mock"; @@ -136,6 +136,13 @@ export async function getRestaurantMenu(restaurant: Restaurants, date?: Date): P try { // TODO tady jsme v háji, protože z následujících metod vracíme arbitrárně dlouhé pole (musíme vracet omezené na maximálně 0-7 prvků) const sladovnickaFood = await getMenuSladovnicka(firstDay, mock); + for (const i in DayOfWeekEnum) { + menus[i][restaurant]!.food = sladovnickaFood[i]; + // Velice chatrný a nespolehlivý způsob detekce uzavření... + if (sladovnickaFood[i].length === 1 && sladovnickaFood[i][0].name.toLowerCase() === 'pro daný den nebyla nalezena denní nabídka') { + menus[i][restaurant]!.closed = true; + } + } for (let i = 0; i < sladovnickaFood.length; i++) { menus[i][restaurant]!.food = sladovnickaFood[i]; // Velice chatrný a nespolehlivý způsob detekce uzavření... diff --git a/types/Types.ts b/types/Types.ts index bb76de7..6b7409f 100644 --- a/types/Types.ts +++ b/types/Types.ts @@ -71,11 +71,13 @@ interface PizzaDay { } /** Index dne v týdnu (0 = pondělí, 6 = neděle) */ -// TODO začistit -// export type DayOfWeekIndex = 0 | 1 | 2 | 3 | 4 | 5 | 6; +// TODO tohle by měl být (seřazený) enum MONDAY-SUNDAY, ne číslo export const daysOfWeeksIndices = [0, 1, 2, 3, 4, 5, 6] as const; export type DayOfWeekIndex = typeof daysOfWeeksIndices[number] +const daysOfWeek = ['MONDAY', 'TUESDAY', 'WEDNESDAY', 'THURSDAY', 'FRIDAY', 'SATURDAY', 'SUNDAY'] as const; +export type DayOfWeek = typeof daysOfWeek[number]; + /** Denní menu všech dostupných podniků. */ export type DailyMenu = { [restaurant in Restaurants]?: RestaurantDailyMenu @@ -83,7 +85,12 @@ export type DailyMenu = { /** Týdenní menu jednotlivých restaurací. */ export type WeekMenu = { - [dayIndex in DayOfWeekIndex]?: DailyMenu + [dayIndex in DayOfWeek]?: DailyMenu +} + +/** Týdenní menu jedné restaurace. */ +export type RestaurantWeeklyMenu = { + [key in DayOfWeek]?: Food[] } /** Data vztahující se k jednomu konkrétnímu dni. */