๐Ÿ—„๏ธ Struktur Database

Tabel SQLite via migration Laravel 10 (framework/database/migrations), driver sqlite default โ€” bisa switch ke mysql lewat .env. Kunci target notifikasi: tabel notification_nups. Login memakai auth_sessions (multi-login per akun).

Diagram Relasi

erDiagram
    EMPLOYEES ||--o{ AUTH_SESSIONS : "employee_id"
    EMPLOYEES ||--o{ DEVICE_NOTIFICATIONS : "token = device_id"
    NOTIFICATIONS ||--o{ DEVICE_NOTIFICATIONS : "notification_id"
    NOTIFICATIONS ||--o{ NOTIFICATION_NUPS : "id_notification"
    NOTIFICATION_NUPS }o--o{ EMPLOYEES : "target_nup = nup"
    DEVICES ||--o{ DEVICE_NOTIFICATIONS : "device_id"
    EMPLOYEES {
        int id PK
        string nama
        string nup "unik, kunci target"
        string username "user_id server auth"
        string unit_kerja
        string jabatan
        string status_pegawai
        string device_uuid "legacy"
        string token "legacy auth per-pegawai"
    }
    AUTH_SESSIONS {
        int id PK
        int employee_id FK
        string nup "NUP pemilik sesi"
        string username "user_id"
        string access_token "SHA-256 token"
        string auth_payload "output JSON server auth"
        string auth_hash "SHA-256 payload"
        string revoked_at "null = aktif"
    }
    NOTIFICATIONS {
        int id PK
        string title
        string body
        string link "lampiran nullable"
        string data "JSON opsional nullable"
        int is_broadcast "1 = semua device"
        string deleted_at "soft delete nullable"
    }
    NOTIFICATION_NUPS {
        int id PK
        int id_notification FK
        string target_nup "NUP tujuan, kunci"
    }
    DEVICE_NOTIFICATIONS {
        int id PK
        string device_id "token pegawai / device"
        int notification_id FK
        int acknowledged "0/1"
        string acknowledged_at "nullable"
    }
    DEVICES {
        int id PK
        string device_id
        string device_name
        string platform
        datetime last_seen
    }

employees โ€” Data Pegawai

KolomTipeKeterangan
idint autoPrimary key
namastringNama lengkap (wajib)
nupstringNUP/NIP, unik โ€” kunci target notifikasi & absensi (wajib)
usernamestring|nullUser ID dari server auth (user_id), unik โ€” tanpa email
unit_kerjastringUnit kerja
jabatanstringJabatan
status_pegawaistringDari data_pegawai_sisdm.STATUS_PEGAWAI (menggantikan level_id)
device_uuidstring|nullLegacy, tidak dipakai untuk membatasi login
tokenstringLegacy auth per-pegawai (akses utama kini access token di auth_sessions)

notifications โ€” Pesan

KolomTipeKeterangan
idint autoPrimary key
title / bodystringJudul & isi (wajib)
linkstring|nullLink lampiran dokumen
dataJSON string|nullPayload opsional bebas
is_broadcast0/11 = semua device (tanpa target)
deleted_atdatetime|nullSoft delete โ€” tersembunyi dari device, tampil di admin + bisa restore

notification_nups โ€” Ikatan NOTIFICATIONS โ†” NUP

KolomTipeKeterangan
idint autoPrimary key
id_notificationintFK ke notifications โ€” kunci target
target_nupstringNUP/NIP tujuan, unik per notifikasi

Ditulis saat broadcast via Eloquent firstOrCreate per NUP (NotificationController::attachNups). Fetch bangun peta id_notification โ†’ [target_nup] 1x per request (NotifHelper::buildNupMap), sekaligus memindahkan kolom legacy target_nups bila masih ada.

device_notifications โ€” Pengiriman & status baca

KolomTipeKeterangan
device_idstringToken pegawai / ID device
notification_idintFK ke notifications
acknowledged0/11 = sudah dibaca
acknowledged_atdatetime|nullWaktu dibaca

Baris hanya dibuat untuk target device eksplisit, broadcast semua, dan ack on-demand โ€” target NUP tak dibuatkan baris di sini melainkan di notification_nups (fetch cocokkan langsung, tulis O(1)).

auth_sessions โ€” Sesi login mobile

KolomTipeKeterangan
employee_id / nup / usernameint/stringPemilik sesi (satu akun boleh punya banyak baris)
access_tokenstring(64) unikSHA-256 Bearer token server auth; token asli (format id|secret) dikirim ke client saat login dan disimpan di localStorage
auth_codestringKode login_result (informasi saja, bukan acuan sukses)
auth_payloadtextOutput JSON server auth apa adanya
auth_hashstring(64)SHA-256(auth_payload)
device_uuid, ip_address, user_agentstring|nullInfo perangkat/login
last_used_at / revoked_atdatetime|nullTerakhir dipakai; revoked_at terisi saat logout

Multi-login: setiap login membuat baris baru. Logout hanya mengisi revoked_at pada token yang dipakai, token lain tetap aktif.

devices โ€” Perangkat terdaftar

KolomTipeKeterangan
device_idstringID unik perangkat
device_name / platform / last_seenstringInfo perangkat & terakhir terlihat

Catatan

App Notifikasi ยท struktur database ยท SQLite/Laravel 10