Základní funkčnost Pizza Day

This commit is contained in:
2023-06-05 22:49:37 +02:00
parent 2e80faa6b8
commit cdcd620ee5
9 changed files with 263 additions and 162 deletions

View File

@@ -3,7 +3,7 @@ import { Server } from "socket.io";
import bodyParser from "body-parser";
import { fetchPizzy } from "./chefie";
import cors from 'cors';
import { createPizzaDay, deletePizzaDay, getData, updateChoice } from "./service";
import { addPizzaOrder, createPizzaDay, deletePizzaDay, getData, removePizzaOrder, updateChoice } from "./service";
import dotenv from 'dotenv';
import path from 'path';
import { fetchMenus } from "./restaurants";
@@ -49,7 +49,6 @@ app.get("/api/pizza", (req, res) => {
/** Založí pizza day pro aktuální den, za předpokladu že dosud neexistuje. */
app.post("/api/createPizzaDay", (req, res) => {
console.log("Založení pizza day", req) // TODO smazat
if (!req.body?.creator) {
throw Error("Nebyl předán název zakládajícího");
}
@@ -86,17 +85,25 @@ app.post("/api/addPizza", (req, res) => {
if (!pizzy[pizzaIndex].sizes[pizzaSizeIndex]) {
throw Error("Neplatný index velikosti pizzy: " + pizzaSizeIndex);
}
console.log("Vybraná pizza", pizzy[pizzaIndex], pizzy[pizzaIndex].sizes[pizzaSizeIndex]);
// TODO implementovat přidání objednávky - nutno zjistit co vlastně chceme ukládat
// pravděpodobně název, velikost, cenu
const data = addPizzaOrder(req.body.login, pizzy[pizzaIndex], pizzy[pizzaIndex].sizes[pizzaSizeIndex]);
io.emit("message", data);
res.status(200).json({});
// TODO odeslat aktuální data socketem
// io.emit("message", data);
})
});
app.post("/api/removePizza", (req, res) => {
if (!req.body?.login) {
throw Error("Nebyl předán login");
}
if (!req.body?.pizzaOrder) {
throw Error("Nebyla předána objednávka");
}
const data = removePizzaOrder(req.body.login, req.body?.pizzaOrder);
io.emit("message", data);
res.status(200).json({});
});
app.post("/api/updateChoice", (req, res) => {
console.log("Změna výběru", req.body);
if (!req.body.hasOwnProperty('name')) {
res.status(400).json({});
}
@@ -105,23 +112,6 @@ app.post("/api/updateChoice", (req, res) => {
res.status(200).json(data);
});
// TODO smazat
app.post("/api/zprava", (req, res) => {
const { username, message } = req.body;
if (
typeof username !== "string" ||
typeof message !== "string" ||
username.length > 500 ||
message.length > 500
) {
return res.status(400).json({ error: "Invalid input" });
}
console.log(`posílám ${username} ${message} `);
io.emit("externalMessage", `${username} -> ${message}`);
res.status(200).json({ success: "Message sent" });
});
io.on("connection", (socket) => {
console.log(`New client connected: ${socket.id}`);
@@ -129,12 +119,6 @@ io.on("connection", (socket) => {
io.emit("message", message);
});
// TODO smazat
socket.on("jduKafe", ({ username, timeString }) => {
console.log(`Received message: ${username}`);
socket.broadcast.emit("jduKafe", `${timeString}: ${username} -> jdu Kafe`);
});
socket.on("disconnect", () => {
console.log(`Client disconnected: ${socket.id}`);
});

View File

@@ -1,4 +1,4 @@
import { ClientData, Locations, State } from "./types";
import { ClientData, Locations, Order, Pizza, PizzaDayState, PizzaOrder, PizzaSize } from "./types";
import { db } from "./database";
import { getHumanDate, getIsWeekend } from "./utils";
import { formatDate } from "./utils";
@@ -34,7 +34,7 @@ export function createPizzaDay(creator: string): ClientData {
if (clientData.pizzaDay) {
throw Error("Pizza day pro dnešní den již existuje");
}
const data: ClientData = { pizzaDay: { state: State.CREATED, creator, orders: [] }, ...clientData };
const data: ClientData = { pizzaDay: { state: PizzaDayState.CREATED, creator, orders: [] }, ...clientData };
db.set(today, data);
return data;
}
@@ -54,6 +54,70 @@ export function deletePizzaDay(login: string) {
db.delete(today);
}
/**
* Přidá objednávku pizzy uživateli.
*
* @param login login uživatele
* @param pizza zvolená pizza
* @param size zvolená velikost pizzy
*/
export function addPizzaOrder(login: string, pizza: Pizza, size: PizzaSize) {
const today = formatDate(getToday());
const clientData: ClientData = db.get(today);
if (!clientData.pizzaDay) {
throw Error("Pizza day pro dnešní den neexistuje");
}
let order: Order | undefined = clientData.pizzaDay.orders.find(o => o.customer === login);
if (!order) {
order = {
customer: login,
pizzaList: [],
totalPrice: 0,
}
clientData.pizzaDay.orders.push(order);
}
const pizzaOrder: PizzaOrder = {
name: pizza.name,
size: size.size,
price: size.price,
}
order.pizzaList.push(pizzaOrder);
order.totalPrice += pizzaOrder.price;
db.set(today, clientData);
return clientData;
}
/**
* Odstraní danou objednávku pizzy.
*
* @param login login uživatele
* @param pizzaOrder objednávka pizzy
*/
export function removePizzaOrder(login: string, pizzaOrder: PizzaOrder) {
const today = formatDate(getToday());
const clientData: ClientData = db.get(today);
if (!clientData.pizzaDay) {
throw Error("Pizza day pro dnešní den neexistuje");
}
const orderIndex = clientData.pizzaDay.orders.findIndex(o => o.customer === login);
if (orderIndex < 0) {
throw Error("Nebyly nalezeny žádné objednávky pro uživatele " + login);
}
const order = clientData.pizzaDay.orders[orderIndex];
const index = order.pizzaList.findIndex(o => o.name === pizzaOrder.name && o.size === pizzaOrder.size);
if (index < 0) {
throw Error("Objednávka s danými parametry nebyla nalezena");
}
const price = order.pizzaList[index].price;
order.pizzaList.splice(index, 1);
order.totalPrice -= price;
if (order.pizzaList.length == 0) {
clientData.pizzaDay.orders.splice(orderIndex, 1);
}
db.set(today, clientData);
return clientData;
}
export function initIfNeeded() {
const today = formatDate(getToday());
if (!db.has(today)) {

View File

@@ -2,34 +2,50 @@ export interface Choices {
[location: string]: string[],
}
// /** Jedna konkrétní pizza */
interface Pizza {
/** Velikost konkrétní pizzy */
export interface PizzaSize {
size: string, // velikost pizzy, např. "30cm"
pizzaPrice: number, // cena samotné pizzy
boxPrice: number, // cena krabice
price: number, // celková cena (pizza + krabice)
}
/** Jedna konkrétní pizza */
export interface Pizza {
name: string, // název pizzy
size: number, // velikost pizzy v cm
ingredients: string[], // seznam ingrediencí
sizes: PizzaSize[], // dostupné velikosti pizzy
}
/** Objednávka jedné konkrétní pizzy */
export interface PizzaOrder {
name: string, // název pizzy
size: string, // velikost pizzy jako string (30cm)
price: number, // cena pizzy v Kč, včetně krabice
}
// /** Objednávka jednoho člověka */
interface Order {
customer: string, // název člověka
pizzaList: Pizza[], // seznam objednaných pizz
/** Celková objednávka jednoho člověka */
export interface Order {
customer: string, // jméno objednatele
pizzaList: PizzaOrder[], // seznam objednaných pizz
totalPrice: number, // celková cena všech objednaných pizz a krabic
}
// /** Stav pizza dne. */
export enum State {
/** Stav pizza dne */
export enum PizzaDayState {
NOT_CREATED, // Pizza day nebyl založen
CREATED, // Pizza day je založen
LOCKED // Objednávky uzamčeny
}
// /** Veškerá data pro zobrazení na klientovi */
/** Informace o pizza day pro dnešní den */
interface PizzaDay {
state: State, // stav pizza dne
state: PizzaDayState, // stav pizza dne
creator: string, // jméno zakladatele
orders: Order[], // seznam objednávek, pokud není vyplněno, není založen pizza day
orders: Order[], // seznam objednávek jednotlivých lidí
}
/** Veškerá data pro zobrazení na klientovi */
export interface ClientData {
date: string, // dnešní datum pro zobrazení
isWeekend: boolean, // příznak, zda je dnes víkend