Teknis

Lihat sumber

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

DomainNilai
Roleuser, officer, admin
Accountpending, active, rejected, disabled
Facilityactive, maintenance, inactive
Reservationpending, approved, rejected, cancelled, expired
Reportpending, in_progress, resolved, rejected
Maintenancescheduled, 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

ModuleFunctionAccessPurpose
profilescurrent, register, changePasswordPublic/SessionProfile dan password
facilitieslistPublic, getPublicAvailabilityPublicKatalog dan blocked slots
facilitieslistManaged, create, update, setStatusAdminMaster fasilitas
facilitiesremoveAdminArsip fasilitas, pertahankan histori
reservationslistMine, create, cancelMineUserReservasi milik sendiri
reservationslistQueue, decide, cancelByStaffOfficer/adminAntrean dan keputusan
reportsgenerateUploadUrl, create, listMineUserUpload dan laporan sendiri
reportslistQueue, updateStatusOfficer/adminPenanganan laporan
maintenancelistManaged, agendaOfficer/adminJadwal dan slot terisi
maintenanceschedule, extend, closeOfficer/adminJadwal perbaikan
adminaccount functions, analytics, exportDataAdminAdministrasi 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._id dari 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, reservasi pending, atau jadwal perbaikan lain.
  • Kelipatan 30 menit, tidak dimulai sebelum slot sekarang, maksimal 7 hari.
  • Jam selesai wajib; scheduled function maintenance.expire menutup jadwal di endAt. close mengakhiri jadwal yang sedang berjalan atau membatalkan yang belum dimulai. extend hanya 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.

Semua dokumentasi