Data dan interface backend
Model data
erDiagram
AUTH_USER ||--|| PROFILE : maps_to
PROFILE ||--o{ RESERVATION : creates
PROFILE ||--o{ REPORT : creates
PROFILE ||--o{ AUDIT_EVENT : acts
FACILITY ||--o{ RESERVATION : receives
FACILITY ||--o{ REPORT : receives
FACILITY ||--o{ MAINTENANCE_WINDOW : closes
REPORT |o--o{ MAINTENANCE_WINDOW : triggers
RESERVATION ||--o{ RESERVATION_CHANGE : proposes
FACILITY ||--o{ FACILITY_ISSUE : has
FACILITY ||--o{ EMERGENCY_CLOSURE : has
REPORT |o--o{ FACILITY_ISSUE : triggers
REPORT |o--o{ EMERGENCY_CLOSURE : triggers
PROFILE ||--o{ NOTIFICATION : receives
RESERVATION |o--o{ NOTIFICATION : references
PROFILE {
string authUserId
string role
string status
boolean mustChangePassword
}
FACILITY {
string name
string type
string location
number capacity
string status
}
RESERVATION_CHANGE {
id reservationId
number originalStartAt
number startAt
number endAt
string status
}
FACILITY_ISSUE {
id facilityId
id reportId
string description
number startAt
number endAt
string status
number revision
}
EMERGENCY_CLOSURE {
id facilityId
id reportId
string reason
string mode
string source
string status
number estimatedEndAt
}
NOTIFICATION {
id userId
id reservationId
string type
string dedupKey
number readAt
}
RESERVATION {
id userId
id facilityId
number startAt
number endAt
string status
}
REPORT {
id reporterId
id facilityId
id photoStorageId
string status
}
MAINTENANCE_WINDOW {
id facilityId
id reportId
number startAt
number endAt
string status
}Schema aktual ada di convex/schema.ts. Better Auth menyimpan user, credential, session, dan JWKS di isolated Convex component.
Status
| Domain | Nilai |
|---|---|
| Role | user, officer, admin |
| Account | pending, active, rejected, disabled |
| Facility | active, maintenance, inactive |
| Reservation | pending, approved, rejected, cancelled, expired |
| Report | pending, in_progress, resolved, rejected |
| Maintenance | scheduled, completed, cancelled |
Status fasilitas maintenance dapat tampil sebagai status efektif karena penutupan atau laporan berdampak tertutup. Status master lama tidak dipasang kembali. Perbaikan terencana memakai maintenanceWindows; gangguan masih layak memakai facilityIssues; penutupan keselamatan memakai emergencyClosures, tanpa auto-open dari estimasi.
Public functions
| Module | Function | Access | Purpose |
|---|---|---|---|
profiles | current, register, changePassword | Public/Session | Profile dan password |
facilities | listPublic, getPublicAvailability | Public | Katalog dan blocked slots |
facilities | listManaged, create, update, setStatus | Admin | Master fasilitas |
facilities | remove | Admin | Arsip fasilitas, pertahankan histori |
reservations | listMine, create, cancelMine | User | Reservasi milik sendiri |
reservations | listQueue, decide, cancelByStaff | Officer/admin | Antrean dan keputusan |
reports | generateUploadUrl, create, listMine | User | Upload dan laporan sendiri |
reports | listQueue, updateStatus | Officer/admin | Penanganan laporan |
maintenance | listManaged, agenda | Officer/admin | Jadwal dan slot terisi |
maintenance | schedule, extend, close | Officer/admin | Jadwal perbaikan |
admin | account functions, analytics, exportData | Admin | Administrasi dan rekap |
Next.js Route Handlers hanya dipakai untuk:
/api/auth/[...all]: proxy Better Auth;/api/admin/export: file CSV dengan session/role check;/api/health: health check aplikasi.
Privacy dan authorization
- Public availability hanya berisi
startAt,endAt, dan status; tidak ada nama pemohon atau tujuan. - Query user mengambil data berdasarkan
profile._iddari session, bukan ID dari client. - Foto laporan hanya menghasilkan URL di query user milik sendiri atau antrean petugas.
- Seluruh admin/staff mutation mengulang pemeriksaan role di backend.
Aturan reservasi
- 07.00–20.00 WIB, satu hari, slot 30 menit.
- Pengajuan baru minimal 48 jam sebelum mulai. Pending lewat mulai efektif expired; tidak boleh disetujui meski cron belum berjalan.
- Pengguna dapat membatalkan minimal 1 jam sebelum mulai.
- Pengajuan baru berstatus
pending; belum memblokir slot. - Mutation approval mengecek overlap terhadap reservasi approved pada index
by_facility_status_start. - Reservasi tidak boleh beririsan dengan jadwal perbaikan
scheduled.
Aturan perbaikan
- Perbaikan hanya boleh di waktu kosong: tidak beririsan dengan reservasi
approved, reservasipending, atau jadwal perbaikan lain. - Kelipatan 30 menit, tidak dimulai sebelum slot sekarang, maksimal 7 hari.
- Jam selesai wajib; scheduled function
maintenance.expiremenutup jadwal diendAt.closemengakhiri jadwal yang sedang berjalan atau membatalkan yang belum dimulai.extendhanya memeriksa waktu tambahan. - Menyelesaikan atau menolak laporan menutup jadwal perbaikan yang terhubung dengannya.
- Diagram lengkap ada di Alur dan logika sistem.
Interface gangguan, penutupan, dan notifikasi
facilityIssues.listOpen serta emergencyClosures.listActiveForFacility hanya mengirim keterangan publik. Create/update/resolve issue dan preview/close/reopen closure wajib peran officer/admin. reports.updateStatus memulai dengan handlingImpact dan publicNotice; completion dampak closed perlu confirmSafe. notifications.listPage memakai cursor Convex dan identity pemilik, bukan userId browser. Aturan lengkap.
Upload
Client meminta upload URL, mengunggah langsung ke Convex storage, lalu mengirim storage ID ke mutation laporan. Server membaca metadata storage dan menolak file lebih dari 5 MB atau MIME selain JPEG/PNG/WebP.