Иди на текст

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: KREIRANOPRIHVAĆENOU_DOSTAVIDOSTAVLJENO; 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

  1. Validacija GPS koordinata (400 ako nedostaju)
  2. Geofencing proveraGeofencingService.isLocationInDeliveryZone(lat, lng)
  3. Batch poziv ka menu-service (POST /api/products/batch) za cene
  4. Provera dostupnosti svakog proizvoda (400 ako je nedostupan)
  5. Snapshot imena/cena u OrderItem, računanje totalPrice
  6. 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

  • DeliveryZonename, isActive, coordinates (List\<ZonePoint>, EAGER, @OrderBy(sequence))
  • ZonePointlat, lng, sequence, zone (ManyToOne, JsonIgnore)
  • CachedZonename, polygon (List\<LngLat>) — keš reprezentacija
  • LngLatlng, 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) + isDirty flag
  • 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čaka
  • isPointInPolygon(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.generationvalidate/none van DEV-a (trenutno drop-and-create)
  • [ ] Servisna diskoverija umesto hardkodovanih localhost URL-ova
  • [ ] HTTPS na gateway nivou