# Arsitektur RIETS

```text
QR Area -> Browser/PWA -> Geolocation watchPosition -> IndexedDB offline queue
                                   |
                                   v
GPS / BLE / UWB / RFID -> Location Engine Manager -> Location Ingest Service
                                   |
                                   v
                 MySQL current_locations + location_history
                                   |
                                   v
                       SSE -> Live Map Admin
```

## Lapisan aplikasi

- `public/`: front controller, aset, PWA manifest dan service worker.
- `app/Core/`: router, PDO, session auth, RBAC, rate limit, JWT, CSRF.
- `app/Controllers/`: HTTP web dan REST API.
- `app/Views/`: UI server-rendered, AJAX/SSE hanya untuk data hidup.
- `database/`: 37 tabel operasional dan seed awal.
- `storage/`: log dan cache yang tidak dipublikasikan.

## Model posisi

`LocationEngineInterface` menormalisasi setiap sumber. GPS menghasilkan latitude/longitude dari browser; BLE mengubah RSSI menjadi estimasi jarak dan menghitung X/Y dengan inverse-square weighted centroid. UWB/RFID dapat ditambahkan sebagai adapter tanpa mengganti penyimpanan posisi utama.

Titik browser disimpan dahulu ke IndexedDB, lalu dikirim dalam batch. `client_event_id` unik menjamin retry tidak menghasilkan duplikasi dan current location hanya berubah jika timestamp yang masuk lebih baru.

## Keamanan

- Password Argon2id dan prepared statements PDO.
- Session cookie HttpOnly/SameSite, rotasi session ID, idle timeout.
- CSRF untuk mutasi web.
- JWT HS256 berumur pendek untuk aplikasi native/gateway. Browser tracking menggunakan sesi same-origin dan CSRF.
- Soft delete, audit log, role/permission schema.
- Server produksi wajib HTTPS, `secure_cookie=true`, secret acak minimal 64 karakter, dan `debug=false`.

## Skala produksi

Default pengiriman GPS adalah 15 detik. Seribu karyawan pada interval satu detik terlalu berat untuk shared hosting; gunakan batch, partisi bulanan, agregasi, queue worker, dan server khusus bila interval tersebut diwajibkan. SSE bawaan cocok untuk admin berskala awal; gunakan Redis + WebSocket untuk banyak dashboard bersamaan.

Browser memerlukan HTTPS dan izin eksplisit. PWA menjaga antrean saat koneksi hilang, tetapi Android/iOS dapat menghentikan geolocation ketika layar mati. Background tracking yang dijamin memerlukan aplikasi native/hybrid.
