Geofencing servis¶
ordify-geofencing-service — Quarkus servis za upravljanje zonama dostave (geofencing): definisanje poligona zona i ultra-brza provera da li se lokacija nalazi u nekoj zoni.
- Port: 8083
- Status: ✅ Aktivan
- Repo:
Marinkovic-Co/ordify-geofencing-service
Funkcionalnosti¶
- CRUD zona dostave (poligoni sa tačkama
lat/lng) - In-memory keš zona — provere lokacije ne diraju bazu
- Event-driven invalidacija keša (CDI
ZoneChangedEvent) - Paralelna provera kroz sve zone (
parallelStream) - Sortiranje temena poligona po uglu oko centra (
sortZone)
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¶
- CRUD operacija → fire
ZoneChangedEvent(posle uspešne transakcije) - Event postavlja
isDirty = true - Sledeća provera → double-checked locking → osvežava keš iz baze (samo aktivne zone)
- Provera lokacije čita isključivo iz keša, paralelno kroz sve zone
private volatile List<CachedZone> zoneCache = new ArrayList<>();
private volatile boolean isDirty = true;
public void onZoneChange(@Observes(during = TransactionPhase.AFTER_SUCCESS) ZoneChangedEvent event) {
this.isDirty = true;
}
GeofencingUtils¶
sortZone(DeliveryZone)— sortiranje temena poligona po uglu oko centra (centroid) — obezbeđuje ispravan redosled tačakaisPointInPolygon(LngLat, List<LngLat>)— ray-casting algoritam
Testovi¶
Ray-casting (tačka u/van poligona) + sortiranje zona.