Objednávací systém pre našu menzu.
Systém je navrhnutý na efektívnu správu a objednávanie jedál na objednávku - minútiek.
- Študent si vyberie jedlo z aktuálneho menu cez webovú aplikáciu (CanteenClient).
- Kuchyňa príjme objednávku a mení jej stav v reálnom čase (AdminClient).
- Študent je informovaný o stave svojej objednávky.
- Runtime: .NET 10
- Orchestrácia: .NET Aspire
- Autentifikácia: Keycloak
- API: Minimal Web API s využitím TypedResults
- Frontend: Blazor Server (AdminClient + CanteenClient)
- Databáza: Entity Framework Core + PostgreSQL
- Testovanie: xUnit + Aspire.Hosting.Testing
.
├── UTB.Minute.AdminClient/
├── UTB.Minute.AppHost/
├── UTB.Minute.CanteenClient/
├── UTB.Minute.Contracts/
├── UTB.Minute.Db/
├── UTB.Minute.DbManager/
├── UTB.Minute.ServiceDefaults/
├── UTB.Minute.WebApi/
├── UTB.Minute.WebApi.Tests/
├── Keycloak/
├── assets/
├── global.json
├── README.md
└── UTB.Minute.sln
Systém využíva Keycloak na správu používateľov a rolí. Pri spustení cez Aspire sa automaticky importuje realm s nasledovnými testovacími účtami:
| Používateľ | Heslo | Roly | Popis |
|---|---|---|---|
admin |
admin |
admin, cook |
Plný prístup k správe jedál a objednávok |
cook |
cook |
cook |
Prístup k správe objednávok (AdminClient) |
Študenti (CanteenClient) momentálne pristupujú k aplikácii bez prihlásenia (anonymne), ale systém je pripravený na rozšírenie.
Pre okamžitú aktualizáciu stavu objednávok v prehliadači bez nutnosti manuálneho obnovovania stránky využíva systém Server-Sent Events (SSE):
- Backend (WebApi): Pushuje udalosti cez stream
OrderCreatedaOrderUpdated. - Frontend (Blazor):
SseClientServiceudržiava spojenie a cez udalosti (Events) notifikuje UI komponenty, ktoré následne prečítajú čerstvé dáta z API.
Entity:
- Meal – jedlá v databáze (názov, cena, aktívne)
- MenuItem – ponuka v daný deň (dátum, dostupné porcie, odkaz na Meal)
- Order – objednávky študentov (stav, čas vytvorenia, odkaz na MenuItem)
Životný cyklus objednávky — systém prísne stráži prechody medzi stavmi (napr. nie je možné zrušiť objednávku, ktorá už bola vydaná):
- Preparing ➔ Ready ➔ Completed
- Preparing ➔ Cancelled
- Cancelled ➔ Completed (administrátor môže dokončiť aj zrušenú)
| Metóda | URL | Popis |
|---|---|---|
| GET | /api/meals |
Všetky jedlá |
| GET | /api/meals/{id} |
Jedlo podľa Id |
| POST | /api/meals |
Vytvorenie jedla |
| PUT | /api/meals/{id} |
Úprava jedla |
| PATCH | /api/meals/{id}/deactivate |
Deaktivácia jedla |
| Metóda | URL | Popis |
|---|---|---|
| GET | /api/menu |
Všetky položky menu (možný filter ?date=...) |
| GET | /api/menu/today |
Dnešné menu |
| POST | /api/menu |
Vytvorenie položky menu |
| PUT | /api/menu/{id} |
Úprava položky menu |
| DELETE | /api/menu/{id} |
Zmazanie položky menu |
| Metóda | URL | Popis |
|---|---|---|
| GET | /api/orders |
Aktívne objednávky (Preparing, Ready) |
| POST | /api/orders |
Vytvorenie objednávky |
| POST | /api/orders/batch |
Získanie detailov pre zoznam Id |
| PUT | /api/orders/{id}/status |
Zmena stavu objednávky |
| Metóda | URL | Popis |
|---|---|---|
| GET | /api/notifications/sse |
Server-Sent Events stream pre real-time updaty |
- Minimal API — všetky endpointy sú v jednom súbore
Program.csako pomenované statické metódy. - TypedResults — návratové typy endpointov sú explicitne definované (napr.
Results<Ok<MealDto>, NotFound>). - Record pre DTO — immutable, štrukturálna rovnosť, stručný zápis.
- Enum pre stav objednávky — typovo bezpečné, nemožno zadať neplatný stav.
- Blazor Server — interaktívne komponenty s
@rendermode InteractiveServer. - Aspire Service Discovery — automatické prepojenie klientov s API cez
http://webapi. - Aspire.Hosting.Testing — testy bežia oproti PostgreSQL databáze spustenej cez Aspire.
- .NET 10+
- Docker
dotnet run --project UTB.Minute.AppHostAspire dashboard zobrazí všetky služby.
dotnet testTesty automaticky spustia PostgreSQL kontajner cez Aspire.
1:1
