Ordify — Arhitektura¶
Detaljan tehnički opis Ordify platforme: servisi, modeli, API, obrasci i planovi.
1. Pregled servisa¶
| Servis | Port | Baza | Zaduženje |
|---|---|---|---|
| ordify-menu-service | 5006 | meni | Meni: proizvodi, kategorije, cene, dostupnost |
| ordify-order-service | 5007 | porudžbine | Biznis logika: korpa, porudžbine, pravila dostave |
| ordify-geofencing-service | 8083 | zone | Zone dostave + brza provera lokacije (keš) |
| ordify-notification-service | — | — | (planirano) WebSocket/SSE obaveštenja |
| ordify-infrastructure | — | — | (u pripremi) Docker Compose, Keycloak, monitoring |
Svi servisi: Quarkus 3.36.x, Java 21, PostgreSQL, Hibernate Panache, REST Jackson.
2. ordify-menu-service¶
Model: Product¶
| Polje | Tip | Napomena |
|---|---|---|
id |
Long | Panache auto |
name |
String | Obavezan (validacija 422) |
description |
String | |
price |
BigDecimal | Cena |
isAvailable |
boolean | Vidljivo kupcima |
isArchived |
boolean | Soft delete |
category |
String | Za sada tekst; plan: zaseban entitet |
API¶
| Metod | Putanja | Opis |
|---|---|---|
| GET | /api/products |
Svi ne-arhivirani proizvodi |
| GET | /api/products/active |
Samo dostupni kupcima |
| POST | /api/products/batch |
Proizvodi po listi ID-jeva (za order-service) |
| POST | /api/products |
Kreiranje (validacija imena) |
| PUT | /api/products/{id} |
Izmena (404 za arhivirane) |
| DELETE | /api/products/{id} |
Meko brisanje → isArchived=true |
Ključne odluke¶
- Soft delete: brisanje samo postavlja
isArchived; istorija porudžbina ostaje netaknuta. - Batch endpoint: omogućava order-service-u da povuče N proizvoda u jednom pozivu.
- Testovi: 15 integracionih testova sa REST Assured (redosled kroz
@Order).
3. ordify-order-service¶
Centralni biznis servis. Prima porudžbine, proverava zonu dostave, kontaktira menu-service za cene.
Modeli¶
Order
| Polje | Tip | Napomena |
|-------|-----|----------|
| customerName | String | |
| deliveryAddress | String | Prikaz na računu |
| latitude / longitude | Double | GPS lokacija kupca |
| note | String (500) | Napomena kupca |
| totalPrice | BigDecimal | Računa se na osnovu trenutnih cena |
| status | OrderStatus | Enumeracija |
| createdAt | LocalDateTime | |
| items | List\<OrderItem> | Cascade ALL |
OrderItem
| Polje | Tip | Napomena |
|-------|-----|----------|
| productId | Long | Link ka proizvodu |
| productName | String | Snapshot u trenutku porudžbine |
| pricePaid | BigDecimal | Snapshot cene |
| quantity | int | |
| order | Order | ManyToOne (JsonIgnore) |
OrderStatus: KREIRANO → PRIHVAĆENO → U_DOSTAVI → DOSTAVLJENO; alternativno ODBIJENO.
API¶
| Metod | Putanja | Opis |
|---|---|---|
| POST | /api/orders |
Kreiranje porudžbine (geofencing + provera dostupnosti) |
| PUT | /api/orders/{id}/status |
Promena statusa (string → enum) |
| GET | /api/orders |
Sve porudžbine |
| GET/POST/PUT/DELETE | /api/admin/zones |
CRUD zona (napomena: duplikat geofencing-servisa) |
Tok kreiranja porudžbine¶
- Validacija GPS koordinata (400 ako nedostaju)
- Geofencing provera —
GeofencingService.isLocationInDeliveryZone(lat, lng) - Batch poziv ka menu-service (
POST /api/products/batch) za cene - Provera dostupnosti svakog proizvoda (400 ako je nedostupan)
- Snapshot imena/cena u
OrderItem, računanjetotalPrice - Perzistencija sa statusom
KREIRANO
REST klijent¶
MenuServiceClient (@RegisterRestClient(configKey = "menu-api")) → POST /api/products/batch.
URL se konfiguriše: quarkus.rest-client.menu-api.url=http://localhost:5006.
Napomena o geofencingu¶
Order-service trenutno sadrži dupliranu geofencing logiku (modeli DeliveryZone, ZonePoint, LngLat + GeofencingService sa ray-casting algoritmom) koja je izdvojena u poseban ordify-geofencing-service. Plan: ukloniti duplikat iz order-servisa i pozivati geofencing-servis preko REST-a.
4. ordify-geofencing-service¶
Samostalni servis za zone dostave. Ključna prednost: in-memory keš — provere lokacije nikada ne idu u bazu.
Modeli¶
DeliveryZone—name,isActive,coordinates(List\<ZonePoint>, EAGER,@OrderBy(sequence))ZonePoint—lat,lng,sequence,zone(ManyToOne, JsonIgnore)CachedZone—name,polygon(List\<LngLat>) — keš reprezentacijaLngLat—lng,lat
API¶
| Metod | Putanja | Opis |
|---|---|---|
| GET | /api/admin/zones |
Sve zone |
| POST | /api/admin/zones |
Kreiranje (dodeljuje sequence tačkama) |
| PUT | /api/admin/zones/{id} |
Izmena (preslikavanje postojećih tačaka po ID) |
| DELETE | /api/admin/zones/{id} |
Brisanje (cascade + orphanRemoval) |
| GET | /api/internal/zones/check?lat=&lng= |
Provera lokacije → {"isInside": true/false} |
Keš mehanizam¶
zoneCache(volatile) +isDirtyflag- Double-checked locking u
ensureCacheIsFresh() - Invalidacija: CDI event
ZoneChangedEvent(fire posle svake CRUD operacije), osluškivan sa@Observes(during = AFTER_SUCCESS)→isDirty = true - Provera:
zoneCache.parallelStream().anyMatch(...)— paralelna provera kroz sve zone
GeofencingUtils¶
sortZone(DeliveryZone)— sortiranje temena poligona po uglu oko centra (centroid) — obezbeđuje ispravan redosled tačakaisPointInPolygon(LngLat, List<LngLat>)— ray-casting algoritam
Testovi¶
GeofencingUtilsTest — tačka u poligonu (uspeh/propadanje) i sortiranje zone.
5. ordify-notification-service (planirano)¶
- WebSocket/SSE veze sa frontendom (kuhinjski ekran)
- Jedini zadatak: progurati obaveštenje o novoj porudžbini u milisekundi
- Integracija: order-service šalje signal nakon kreiranja porudžbine
6. ordify-infrastructure (u pripremi)¶
Centralni repo za:
- docker-compose.yml — svi servisi + baze + Keycloak
- Keycloak realm eksporti/konfiguracije
- Prometheus (prometheus.yml) + Grafana dashboard fajlovi
- Skripte za inicijalizaciju baza
7. Sigurnost i produkcija (TODO)¶
- [ ] Keycloak autentikacija za sve servise (zaštita admin i order API-ja)
- [ ]
quarkus.hibernate-orm.database.generation→validate/nonevan DEV-a (trenutnodrop-and-create) - [ ] Servisna diskoverija umesto hardkodovanih
localhostURL-ova - [ ] HTTPS na gateway nivou