Dokumentasi API (format Postman)

Base URL: {{baseUrl}} = http://notif.kuroichi.my.id/api ยท Auth: Authorization: Bearer <token> (token admin global atau token pegawai)

โฌ‡ Import ke Postman (1 klik isi semua request):
Download Collection (.json) Postman โ†’ Import โ†’ Link โ†’ paste โ€ฆ
โš ๏ธ Khusus testing. Endpoint /test/* menulis/menghapus data. Jangan expose token admin ke publik.

Variables (isi sekali di Postman)

VariableContohKeterangan
baseUrlhttp://notif.kuroichi.my.id/apiServer API (lokal: http://10.10.11.40:8080/api)
api_tokennotif-secret-key-2026Token admin global
employee_tokenโ€”Token pegawai (dari Admin Panel / POST /employees)
nup2211331144NUP pegawai (demo)
access_token / refresh_tokenโ€”Dari POST /auth/login (Keycloak)

Auth (Keycloak via proxy)

POST {{baseUrl}}/auth/login

Login username/password, bebas CORS WebView. Kembalikan tokens{access_token,refresh_token,expires_in} + user{nup,nama,โ€ฆ}.

{
  "username": "demo",
  "password": "ganti-password"
}

POST {{baseUrl}}/auth/refresh

Tukar refresh token โ†’ access baru. Sesi permanen via scope offline_access.

{ "refresh_token": "{{refresh_token}}" }

GET {{baseUrl}}/auth/userinfo

Auth: Bearer {{access_token}} (token Keycloak, bukan admin)

Atribut per akun (nup/unitkerja/jabatan/โ€ฆ) via Account API + fallback email-match DB.

Umum & Device

GET {{baseUrl}}/health

Publik, tanpa auth. {"status":"ok"}

GET {{baseUrl}}/apk/info

Nama, size, updated_at APK tanpa unduh.

POST {{baseUrl}}/register

Auth: Bearer {{api_token}}

{
  "device_id": "test-device-001",
  "device_name": "HP Test",
  "platform": "android"
}

Notifikasi (NUP-locked)

GET {{baseUrl}}/notifications?nup={{nup}}&employee_token={{employee_token}}

Auth: Bearer {{api_token}} ยท NUP kunci, token fallback

Hanya broadcast (is_broadcast) atau NUP dikunci untuk user. Device terima target_nups_count (bukan daftar). Retensi 6 bulan.

GET {{baseUrl}}/notifications/:id?nup={{nup}}

Detail + target_summary. 404 bila bukan target / lebih tua 6 bulan.

POST {{baseUrl}}/notifications/:id/acknowledge

{
  "device_id": "{{employee_token}}",
  "employee_token": "{{employee_token}}",
  "nup": "{{nup}}"
}

POST {{baseUrl}}/notifications/broadcast โ€” semua device

{
  "title": "Pengumuman",
  "body": "Untuk semua",
  "priority": "high"
}

POST {{baseUrl}}/notifications/broadcast โ€” NUP (Excel kolom NUPNIP)

{
  "title": "Khusus",
  "body": "Hanya NUP terpilih",
  "priority": "normal",
  "link": "https://example.com/doc.pdf",
  "target_nups": ["{{nup}}"]
}

POST {{baseUrl}}/notifications/broadcast โ€” device terpilih

{
  "title": "Personal",
  "body": "Hanya device ini",
  "device_ids": ["{{employee_token}}"]
}

DELETE {{baseUrl}}/notifications/:id โ€” soft delete (admin)

Sembunyi dari device, badge di admin. Pulihkan via POST {{baseUrl}}/notifications/:id/restore

Admin

GET {{baseUrl}}/admin/notifications

Log full (tanpa retensi): targets_count, target_summary, daftar NUP max 200 + target_nups_total.

GET {{baseUrl}}/admin/devices  ยท  GET {{baseUrl}}/admin/stats

Pegawai

GET {{baseUrl}}/employees  ยท  GET {{baseUrl}}/employees?nup={{nup}}

POST {{baseUrl}}/employees โ€” tambah (token auto)

{
  "nama": "Budi Santoso",
  "nup": "12345",
  "unit_kerja": "IT",
  "jabatan": "Staff",
  "status_pegawai": "Aktif"
}

PUT {{baseUrl}}/employees  ยท  DELETE {{baseUrl}}/employees

PUT:    { "id": 1, "jabatan": "Supervisor" }
DELETE: { "id": 1 }

POST {{baseUrl}}/employees/:id/regenerate-token

Rotate token tak memutus kiriman (fetch kunci NUP).

Absensi (view-only) & Sesi

GET {{baseUrl}}/attendance/today?nup={{nup}}

GET {{baseUrl}}/attendance?nup={{nup}}&from=2026-09-01&to=2026-09-13

POST {{baseUrl}}/attendance/upsert (admin)

{
  "nup": "{{nup}}",
  "tanggal": "2026-09-13",
  "jam_masuk": "08:00",
  "jam_pulang": "17:00"
}

POST {{baseUrl}}/session/bind

{
  "employee_token": "{{employee_token}}",
  "device_uuid": "uuid-hp-001"
}

GET {{baseUrl}}/session/check?employee_token={{employee_token}}&device_uuid=uuid-hp-001

{"valid":true} atau {"valid":false,"reason":"device_changed"}.

Test Dummy

POST {{baseUrl}}/test/attendance โ€” dummy absensi

FieldDefault
nup2211331144
tanggal / jam_masuk / jam_pulanghari ini / 08:15 / 17:05
{}

POST {{baseUrl}}/test/notification โ€” dummy broadcast

{"title":"Uji Coba","body":"Pesan dummy","priority":"high"}

POST {{baseUrl}}/test/reset โ€” bersihkan

Default 4 tabel (attendances, notifications, device_notifications, notification_nups). employees/devices aman โ€” kecuali kirim {"tables":["all"]} (semua 6 tabel, token pegawai hangus, HP wajib login ulang).

{}

# Reset SEMUA tabel (bahaya):
{"tables":["all"]}

Alur test cepat (urutan Postman)

1. POST /test/attendance {}
2. GET  /attendance/today?nup=2211331144
3. POST /test/notification {}
4. GET  /notifications?nup=2211331144&employee_token=...
5. POST /test/reset {}