diff --git a/food_api/food_api.py b/food_api/food_api.py index b3eaa6a..3f76137 100644 --- a/food_api/food_api.py +++ b/food_api/food_api.py @@ -12,9 +12,10 @@ app.add_middleware( ) @app.get("/") -def read_root(): +def read_root(mock: bool = False): return { - 'sladovnicka': getMenuSladovnicka(), - 'uMotliku:': getMenuUMotliku(), - 'techTower': getMenuTechTower() + 'sladovnicka': getMenuSladovnicka(mock), + # TODO opravit dvojtečku! + 'uMotliku:': getMenuUMotliku(mock), + 'techTower': getMenuTechTower(mock) } diff --git a/food_api/food_service.py b/food_api/food_service.py index 0346a55..27d5446 100755 --- a/food_api/food_service.py +++ b/food_api/food_service.py @@ -96,7 +96,14 @@ def printMenu(name: str, foodList: List[Food]): print('\n') -def getMenuSladovnicka() -> List[Food]: +def getMenuSladovnicka(mock: bool = False) -> List[Food]: + if mock: + foodList: List[Food] = [] + foodList.append(Food("Zelná polévka s klobásou", "0,25l", "35 Kč", True)) + foodList.append(Food("Hovězí na česneku s bramborovým knedlíkem", "150g", "135 Kč")) + foodList.append(Food("Přírodní holandský řízek s bramborovou kaší, rajčatový salát", "250g", "135 Kč")) + foodList.append(Food("Bagel s vinnou klobásou, cibulový konfit, kysané zelí, slanina a hořčicová mayo, hranolky, curry omáčka", "350g", "135 Kč")) + return foodList html = getOrDownloadHtml('sladovnicka', URL_SLADOVNICKA) soup = BeautifulSoup(html, "html.parser") div = soup.select_one("div.tab-pane.fade.in.active") @@ -137,7 +144,14 @@ def getMenuSladovnicka() -> List[Food]: return foodList -def getMenuUMotliku() -> List[Food]: +def getMenuUMotliku(mock: bool = False) -> List[Food]: + if mock: + foodList: List[Food] = [] + foodList.append(Food("Hovězí vývar s nudlemi", "0,33l", "35 Kč", True)) + foodList.append(Food("Opečený párek, čočka, sázené vejce, okurka", "150g", "135 Kč")) + foodList.append(Food("Hovězí líčka na červeném víně, bramborová kaše", "150g", "145 Kč")) + foodList.append(Food("Tortilla s trhaným kuřecím masem, uzeným sýrem, dipem a kukuřicí, míchaný salát", "150g", "135 Kč")) + return foodList html = getOrDownloadHtml('u_motliku', URL_MOTLICI) soup = BeautifulSoup(html, "html.parser") table = soup.find("table", {"class": "Xtable-striped"}) @@ -175,7 +189,13 @@ def getMenuUMotliku() -> List[Food]: return foodList -def getMenuTechTower() -> List[Food]: +def getMenuTechTower(mock: bool = False) -> List[Food]: + if mock: + foodList: List[Food] = [] + foodList.append(Food("Bavorská gulášová polévka s kroupami", "-", "40 Kč", True)) + foodList.append(Food("Vepřové výpečky, kedlubnové zelí, bramborový knedlík", "-", "120 Kč")) + foodList.append(Food("Hambuger Black Angus s čedarem a slaninou, cibulové kroužky", "-", "220 Kč")) + return foodList html = getOrDownloadHtml('techtower', URL_TECHTOWER) soup = BeautifulSoup(html, "html.parser") fonts = soup.find_all("font", {"class": ["wsw-41"]}) @@ -189,7 +209,7 @@ def getMenuTechTower() -> List[Food]: siblings = font.parent.parent.find_next_siblings("p") # dayNumber = date.today().strftime("%w") currentDayName = getDayNameOfDate(datetime.datetime.now()) - foodList = [] + foodList: List[Food] = [] doParse = False for i in range(0, len(siblings)): text = siblings[i].text.strip().replace('\t', '').replace('\n', ' ') diff --git a/run_dev.sh b/run_dev.sh index 4f26119..49583c3 100755 --- a/run_dev.sh +++ b/run_dev.sh @@ -1,3 +1,4 @@ +export NODE_ENV=development ./food_api/run_dev.sh & cd server && yarn install && yarn start & cd client && yarn install && yarn start & diff --git a/server/.env.development b/server/.env.development new file mode 100644 index 0000000..2c143ae --- /dev/null +++ b/server/.env.development @@ -0,0 +1 @@ +MOCK_DATA=true \ No newline at end of file diff --git a/server/package.json b/server/package.json index 4659169..d5a02ce 100644 --- a/server/package.json +++ b/server/package.json @@ -18,6 +18,7 @@ "dependencies": { "cheerio": "^1.0.0-rc.12", "cors": "^2.8.5", + "dotenv": "^16.1.3", "express": "^4.18.2", "request": "^2.88.2", "request-promise": "^4.2.6", diff --git a/server/src/chefie.ts b/server/src/chefie.ts index 3ed38fd..ebd8fc6 100644 --- a/server/src/chefie.ts +++ b/server/src/chefie.ts @@ -110,7 +110,7 @@ export const fetchPizzy = async () => { // TODO tohle sem absolutně nepatří! dát do vlastní servisky! export const fetchFood = async () => { try { - const json = await rp(foodUrl); + const json = await rp({ uri: foodUrl, qs: { "mock": process.env.MOCK_DATA } }); return JSON.parse(json); } catch (error) { console.error("Chyba při volání Food API", error); diff --git a/server/src/index.ts b/server/src/index.ts index 8b3ea50..2ef1cd2 100644 --- a/server/src/index.ts +++ b/server/src/index.ts @@ -4,6 +4,11 @@ import bodyParser from "body-parser"; import { fetchFood, fetchPizzy } from "./chefie"; import cors from 'cors'; import { getData, updateChoice } from "./service"; +import dotenv from 'dotenv'; +import path from 'path'; + +const ENVIRONMENT = process.env.NODE_ENV || 'production' +dotenv.config({ path: path.resolve(__dirname, `../.env.${ENVIRONMENT}`) }); const app = express(); const server = require("http").createServer(app); diff --git a/server/src/service.ts b/server/src/service.ts index b458ee1..6a22881 100644 --- a/server/src/service.ts +++ b/server/src/service.ts @@ -1,7 +1,7 @@ import { ClientData, Locations } from "./types"; import { db } from "./database"; import { getHumanDate, getIsWeekend } from "./utils"; -import { getDate } from "./utils"; +import { formatDate } from "./utils"; // /** Jedna konkrétní pizza */ // interface Pizza { @@ -31,17 +31,24 @@ import { getDate } from "./utils"; // orders?: Order[], // seznam objednávek, pokud není vyplněno, není založen pizza day // } +/** Vrátí dnešní datum, případně fiktivní datum pro účely vývoje a testování. */ +function getToday(): Date { + if (process.env.MOCK_DATA) { + return new Date('2023-05-31'); + } + return new Date(); +} + /** Vrátí "prázdná" (implicitní) data, pokud ještě nikdo nehlasoval. */ function getEmptyData(): ClientData { - return { date: getHumanDate(new Date()), isWeekend: getIsWeekend(new Date()), choices: {} }; + return { date: getHumanDate(getToday()), isWeekend: getIsWeekend(getToday()), choices: {} }; } /** * Vrátí veškerá klientská data pro aktuální den. */ export function getData(): ClientData { - const data = db.get(getDate()) || getEmptyData(); - console.log("Vracím data pro dnešní den", data); // TODO smazat + const data = db.get(formatDate(getToday())) || getEmptyData(); return data; } @@ -70,7 +77,7 @@ export function getData(): ClientData { // } export function initIfNeeded() { - const today = getDate(); + const today = formatDate(getToday()); if (!db.has(today)) { db.set(today, getEmptyData()); } @@ -91,7 +98,7 @@ export function removeChoice(login: string, data: ClientData) { export function updateChoice(login: string, choice: Locations | null) { initIfNeeded(); - const today = getDate(); + const today = formatDate(getToday()); let data: ClientData = db.get(today); data = removeChoice(login, data); if (choice !== null) { diff --git a/server/src/utils.ts b/server/src/utils.ts index 0868dc2..7810019 100644 --- a/server/src/utils.ts +++ b/server/src/utils.ts @@ -1,5 +1,5 @@ -export function getDate() { - const date = new Date(); +/** Vrátí datum v ISO formátu. */ +export function formatDate(date: Date) { let currentDay = String(date.getDate()).padStart(2, '0'); let currentMonth = String(date.getMonth() + 1).padStart(2, "0"); let currentYear = date.getFullYear(); diff --git a/server/yarn.lock b/server/yarn.lock index 0acfc35..7ea54e0 100644 --- a/server/yarn.lock +++ b/server/yarn.lock @@ -465,6 +465,11 @@ domutils@^3.0.1: domelementtype "^2.3.0" domhandler "^5.0.1" +dotenv@^16.1.3: + version "16.1.3" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.1.3.tgz#0c67e90d0ddb48d08c570888f709b41844928210" + integrity sha512-FYssxsmCTtKL72fGBSvb1K9dRz0/VZeWqFme/vSb7r7323x4CRaHu4LvQ5JG3+s6yt2YPbBrkpiEODktfyjI9A== + ecc-jsbn@~0.1.1: version "0.1.2" resolved "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz"