openapi: 3.0.4 info: title: Luncher API version: 1.0.0 servers: - url: /api paths: /login: post: summary: Přihlášení uživatele security: [] # Nevyžaduje autentizaci requestBody: content: application/json: schema: type: object properties: login: type: string description: Přihlašovací jméno uživatele. Vyžadováno pouze pokud není předáno pomocí hlaviček. responses: "200": description: Přihlášení bylo úspěšné content: application/json: schema: $ref: "#/components/schemas/JWTToken" /qr: get: summary: Získání QR kódu pro platbu za Pizza day security: [] # Nevyžaduje autentizaci parameters: - in: query name: login schema: type: string required: true description: Přihlašovací jméno uživatele, pro kterého bude vrácen QR kód responses: "200": description: Vygenerovaný QR kód pro platbu content: image/png: schema: type: string format: binary /data: get: summary: Načtení klientských dat pro aktuální nebo předaný den parameters: - in: query name: dayIndex description: Index dne v týdnu. Pokud není předán, je použit aktuální den. schema: type: integer minimum: 0 maximum: 4 responses: "200": $ref: "#/components/responses/ClientDataResponse" /addChoice: post: summary: Přidání či nahrazení volby uživatele pro zvolený den/podnik requestBody: required: true content: application/json: schema: required: - locationKey allOf: - locationKey: $ref: "#/components/schemas/LunchChoice" - dayIndex: $ref: "#/components/schemas/DayIndex" - foodIndex: $ref: "#/components/schemas/FoodIndex" responses: "200": $ref: "#/components/responses/ClientDataResponse" /removeChoices: post: summary: Odstranění volby uživatele pro zvolený den/podnik, včetně případných jídel requestBody: required: true content: application/json: schema: required: - locationKey allOf: - locationKey: $ref: "#/components/schemas/LunchChoice" - dayIndex: $ref: "#/components/schemas/DayIndex" responses: "200": $ref: "#/components/responses/ClientDataResponse" components: schemas: # --- OBECNÉ --- JWTToken: type: object description: Klientský JWT token pro autentizaci a autorizaci required: - login - trusted - iat properties: login: type: string description: Přihlašovací jméno uživatele trusted: type: boolean description: Příznak, zda se jedná o uživatele ověřeného doménovým přihlášením iat: type: number description: Časové razítko vydání tokenu ClientData: description: Klientská data pro jeden konkrétní den. Obsahuje menu všech načtených podniků a volby jednotlivých uživatelů. type: object additionalProperties: false required: - todayDayIndex - date - isWeekend - choices properties: todayDayIndex: description: Index dnešního dne v týdnu $ref: "#/components/schemas/DayIndex" date: description: Human-readable datum dne type: string isWeekend: description: Příznak, zda je tento den víkend type: boolean dayIndex: description: Index dne v týdnu, ke kterému se vztahují tato data $ref: "#/components/schemas/DayIndex" choices: $ref: "#/components/schemas/LunchChoices" menus: $ref: "#/components/schemas/RestaurantDayMenuMap" pizzaDay: $ref: "#/components/schemas/PizzaDay" pizzaList: description: Seznam dostupných pizz pro předaný den type: array items: $ref: "#/components/schemas/Pizza" pizzaListLastUpdate: description: Datum a čas poslední aktualizace pizz type: string format: date-time # --- OBĚDY --- UserLunchChoice: description: Konkrétní volba stravování jednoho uživatele v konkrétní den. Může se jednat jak o stravovací podnik, tak možnosti "budu objednávat", "neobědvám" apod. additionalProperties: false properties: # TODO toto je tu z dost špatného důvodu, viz použití - mělo by se místo toho z loginu zjišťovat zda je uživatel trusted trusted: description: Příznak, zda byla tato volba provedena uživatelem ověřeným doménovým přihlášením type: boolean selectedFoods: description: Pole indexů vybraných jídel v rámci dané restaurace. Index představuje pořadí jídla v menu dané restaurace. type: array items: type: integer departureTime: description: Čas preferovaného odchodu do dané restaurace v human-readable formátu (např. 12:00) type: string note: description: Volitelná, veřejně viditelná uživatelská poznámka k vybrané volbě type: string LocationLunchChoicesMap: description: Objekt, kde klíčem je možnost stravování ((#/components/schemas/LunchChoice)) a hodnotou množina uživatelů s touto volbou ((#/components/schemas/LunchChoices)). type: object additionalProperties: $ref: "#/components/schemas/UserLunchChoice" LunchChoices: description: Objekt, představující volby všech uživatelů pro konkrétní den. Klíčem je (#/components/schemas/LunchChoice). type: object properties: SLADOVNICKA: $ref: "#/components/schemas/LocationLunchChoicesMap" TECHTOWER: $ref: "#/components/schemas/LocationLunchChoicesMap" ZASTAVKAUMICHALA: $ref: "#/components/schemas/LocationLunchChoicesMap" SENKSERIKOVA: $ref: "#/components/schemas/LocationLunchChoicesMap" SPSE: $ref: "#/components/schemas/LocationLunchChoicesMap" PIZZA: $ref: "#/components/schemas/LocationLunchChoicesMap" OBJEDNAVAM: $ref: "#/components/schemas/LocationLunchChoicesMap" NEOBEDVAM: $ref: "#/components/schemas/LocationLunchChoicesMap" ROZHODUJI: $ref: "#/components/schemas/LocationLunchChoicesMap" Restaurant: description: Stravovací zařízení (restaurace, jídelna, hospoda, ...) type: string enum: - Sladovnická - TechTower - Zastávka u Michala - Šenk Šeříková x-enum-varnames: - SLADOVNICKA - TECHTOWER - ZASTAVKAUMICHALA - SENKSERIKOVA LunchChoice: description: Konkrétní možnost stravování (konkrétní restaurace, pizza day, objednání, neobědvání, rozhodování se, ...) type: string enum: - Sladovnická - TechTower - Zastávka u Michala - Šenk Šeříková - SPŠE - Pizza day - Budu objednávat - Neobědvám - Rozhoduji se x-enum-varnames: - SLADOVNICKA - TECHTOWER - ZASTAVKAUMICHALA - SENKSERIKOVA - SPSE - PIZZA - OBJEDNAVAM - NEOBEDVAM - ROZHODUJI DayIndex: description: Index dne v týdnu (0 = pondělí, 4 = pátek) type: integer minimum: 0 maximum: 4 FoodIndex: description: Pořadový index jídla v menu konkrétní restaurace type: integer minimum: 0 Food: description: Konkrétní jídlo z menu restaurace type: object additionalProperties: false required: - name - isSoup properties: amount: description: Množství standardní porce, např. 0,33l nebo 150g type: string name: description: Název/popis jídla type: string price: description: Cena ve formátu '135 Kč' type: string isSoup: description: Příznak, zda se jedná o polévku type: boolean RestaurantDayMenu: description: Menu restaurace na konkrétní den type: object additionalProperties: false properties: lastUpdate: description: UNIX timestamp poslední aktualizace menu type: integer closed: description: Příznak, zda je daný podnik v daný den zavřený type: boolean food: description: Seznam jídel pro daný den type: array items: $ref: "#/components/schemas/Food" RestaurantDayMenuMap: description: Objekt, kde klíčem je podnik ((#/components/schemas/Restaurant)) a hodnotou denní menu daného podniku ((#/components/schemas/RestaurantDayMenu)) type: object additionalProperties: false properties: SLADOVNICKA: $ref: "#/components/schemas/RestaurantDayMenu" TECHTOWER: $ref: "#/components/schemas/RestaurantDayMenu" ZASTAVKAUMICHALA: $ref: "#/components/schemas/RestaurantDayMenu" SENKSERIKOVA: $ref: "#/components/schemas/RestaurantDayMenu" WeekMenu: description: Pole týdenních menu jednotlivých podniků. Indexem je den v týdnu (0 = pondělí, 4 = pátek), hodnotou denní menu daného podniku. type: array minItems: 5 maxItems: 5 items: $ref: "#/components/schemas/RestaurantDayMenuMap" DepartureTime: description: Preferovaný čas odchodu na oběd type: string enum: - "10:00" - "10:15" - "10:30" - "10:45" - "11:00" - "11:15" - "11:30" - "11:45" - "12:00" - "12:15" - "12:30" - "12:45" - "13:00" x-enum-varnames: - T10_00 - T10_15 - T10_30 - T10_45 - T11_00 - T11_15 - T11_30 - T11_45 - T12_00 - T12_15 - T12_30 - T12_45 - T13_00 # --- HLASOVÁNÍ --- FeatureRequest: type: string enum: - Ruční generování QR kódů mimo Pizza day (např. při objednávání) - Možnost označovat si jídla jako oblíbená (taková jídla by se uživateli následně zvýrazňovala) - Možnost úhrady v podniku za všechny jednou osobou a následné generování QR ostatním - Zrušení \"užívejte víkend\", místo toho umožnit zpětně náhled na uplynulý týden - Umožnění zobrazení vygenerovaného QR kódu i po následující dny (dokud ho uživatel ručně \"nezavře\", např. tlačítkem \"Zaplatil jsem\") - Zobrazování náhledů (fotografií) pizz v rámci Pizza day - Statistiky (nejoblíbenější podnik, nejpopulárnější jídla, nejobjednávanější pizzy, nejčastější uživatelé, ...) - Vylepšení responzivního designu - Zvýšení zabezpečení aplikace - Zvýšená ochrana proti chybám uživatele (potvrzovací dialogy, překliky, ...) - Celkové vylepšení UI/UX - Zlepšení dokumentace/postupů pro ostatní vývojáře x-enum-varnames: - CUSTOM_QR - FAVORITES - SINGLE_PAYMENT - NO_WEEKENDS - QR_FOREVER - PIZZA_PICTURES - STATISTICS - RESPONSIVITY - SECURITY - SAFETY - UI - DEVELOPMENT # --- EASTER EGGS --- EasterEgg: description: Data pro zobrazení easter eggů type: object additionalProperties: false required: - path - url - startOffset - endOffset - duration properties: path: type: string url: type: string startOffset: type: number endOffset: type: number duration: type: number width: type: string zIndex: type: integer position: type: string enum: - absolute animationName: type: string animationDuration: type: string animationTimingFunction: type: string # --- STATISTIKY --- LocationStats: description: Objekt, kde klíčem je zvolená možnost a hodnotou počet uživatelů, kteří tuto možnosti zvolili type: object additionalProperties: false properties: # Bohužel OpenAPI neumí nadefinovat objekt, kde klíčem může být pouze hodnota existujícího enumu :( SLADOVNICKA: type: number TECHTOWER: type: number ZASTAVKAUMICHALA: type: number SENKSERIKOVA: type: number SPSE: type: number PIZZA: type: number OBJEDNAVAM: type: number NEOBEDVAM: type: number ROZHODUJI: type: number DailyStats: description: Statistika vybraných možností pro jeden konkrétní den type: object additionalProperties: false required: - date - locations properties: date: description: Datum v human-readable formátu type: string locations: $ref: "#/components/schemas/LocationStats" WeeklyStats: description: Pole statistik vybraných možností pro jeden konkrétní týden. Index představuje den v týdnu (0 = pondělí, 4 = pátek) type: array minItems: 5 maxItems: 5 items: $ref: "#/components/schemas/DailyStats" # --- PIZZA DAY --- PizzaDayState: description: Stav pizza day type: string enum: - Pizza day nebyl založen - Pizza day je založen - Objednávky uzamčeny - Pizzy objednány - Pizzy doručeny x-enum-varnames: - NOT_CREATED - CREATED - LOCKED - ORDERED - DELIVERED # TODO toto je jen rozšířená varianta PizzaVariant - sloučit do jednoho objektu PizzaSize: description: Údaje o konkrétní variantě pizzy type: object additionalProperties: false required: - varId - size - pizzaPrice - boxPrice - price properties: varId: description: Unikátní identifikátor varianty pizzy type: integer size: description: Velikost pizzy, např. "30cm" type: string pizzaPrice: description: Cena samotné pizzy v Kč type: number boxPrice: description: Cena krabice pizzy v Kč type: number price: description: Celková cena (pizza + krabice) type: number Pizza: description: Údaje o konkrétní pizze. type: object additionalProperties: false required: - name - ingredients - sizes properties: name: description: Název pizzy type: string ingredients: description: Seznam obsažených ingrediencí type: array items: type: string sizes: description: Dostupné velikosti pizzy type: array items: $ref: "#/components/schemas/PizzaSize" PizzaVariant: description: Konkrétní varianta (velikost) jedné pizzy. type: object additionalProperties: false required: - varId - name - size - price properties: varId: description: Unikátní identifikátor varianty pizzy type: integer name: description: Název pizzy type: string size: description: Velikost pizzy (např. "30cm") type: string price: description: Cena pizzy v Kč, včetně krabice type: number PizzaOrder: description: Údaje o objednávce pizzy jednoho uživatele. type: object additionalProperties: false required: - customer - totalPrice - hasQr properties: customer: description: Jméno objednávajícího uživatele type: string pizzaList: description: Seznam variant pizz k objednání (typicky bývá jen jedna) type: array items: $ref: "#/components/schemas/PizzaVariant" fee: description: Příplatek (např. za extra ingredience) type: object properties: text: description: Popis příplatku (např. "kuřecí maso navíc") type: string price: description: Cena příplatku v Kč type: number totalPrice: description: Celková cena všech objednaných pizz daného uživatele, včetně krabic a příplatků type: number hasQr: description: | Příznak, pokud je k této objednávce vygenerován QR kód pro platbu. To je typicky pravda, pokud: - objednávající má v nastavení vyplněno číslo účtu - pizza day je ve stavu DELIVERED (Pizzy byly doručeny) note: description: Volitelná uživatelská poznámka pro objednávajícího (např. "bez oliv") type: string PizzaDay: description: Data o Pizza day pro konkrétní den type: object additionalProperties: false properties: state: $ref: "#/components/schemas/PizzaDayState" creator: description: "Jméno zakladatele pizza day" type: string orders: description: Pole objednávek jednotlivých uživatelů type: array items: $ref: "#/components/schemas/PizzaOrder" # --- NOTIFIKACE --- UdalostEnum: type: string enum: - Zahájen pizza day - Objednána pizza - Jdeme na oběd x-enum-varnames: - ZAHAJENA_PIZZA - OBJEDNANA_PIZZA - JDEME_NA_OBED NotifikaceInput: type: object required: - udalost - user properties: udalost: $ref: "#/components/schemas/UdalostEnum" user: type: string NotifikaceData: type: object required: - input properties: input: $ref: "#/components/schemas/NotifikaceInput" gotify: type: boolean teams: type: boolean ntfy: type: boolean GotifyServer: type: object required: - server - api_keys properties: server: type: string api_keys: type: array items: type: string responses: ClientDataResponse: description: Aktuální data pro klienta content: application/json: schema: $ref: "#/components/schemas/ClientData" securitySchemes: bearerAuth: type: http scheme: bearer bearerFormat: JWT security: - bearerAuth: []