Иди на текст

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

  • 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

  1. CRUD operacija → fire ZoneChangedEvent (posle uspešne transakcije)
  2. Event postavlja isDirty = true
  3. Sledeća provera → double-checked locking → osvežava keš iz baze (samo aktivne zone)
  4. 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čaka
  • isPointInPolygon(LngLat, List<LngLat>)ray-casting algoritam

Testovi

./mvnw test

Ray-casting (tačka u/van poligona) + sortiranje zona.