Základní funkčnost Pizza Day
This commit is contained in:
@@ -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}`);
|
||||
});
|
||||
|
||||
@@ -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)) {
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user