Lewati ke isi

Audit Log — Jejak Aktivitas Admin untuk Compliance

Purpose

Halaman ini menjelaskan cara menggunakan Audit Log untuk memantau siapa melakukan apa di dashboard HUPH. Setiap aksi admin yang penting (login, edit FAQ, upload dokumen, takeover percakapan, perubahan role, dll.) tercatat otomatis dengan konteks lengkap: pengguna, waktu, IP, device, browser.

Gunakan audit log untuk: - Investigasi incident — siapa mengubah/menghapus apa - Compliance — persyaratan regulasi pencatatan akses data - Security review — deteksi login mencurigakan atau lintasan RBAC - Training — pahami pola aktivitas counselor untuk coaching

Prerequisites

  • Role super_admin atau system_admin
  • Akses ke https://admin.huph.val.id/audit

Konsep: kategori event

Kategori Contoh action
Authentication user.login, user.logout, api.auth.pass
Content kb.upload, kb.delete, faq.update, faq.create
Conversation conversation.takeover, conversation.return_to_bot, conversation.language.override
Config cluster.create, cluster.update, cluster.delete, rule.update
Admin user.create, user.role_change, user.deactivate
RBAC rbac.deny.dashboard_counselor (tercatat saat ada pengguna tanpa izin mencoba akses)

Setiap row menyimpan: - Admin user (siapa yang melakukan) - Action (apa yang dilakukan) - Resource type + ID (objek yang disentuh) - Details (JSONB dengan payload before/after) - IP address, User-Agent, Device type, OS, Browser - Timestamp

Steps

1. Buka audit log

Sidebar: ADMIN → Audit Log (atau /audit).

Halaman menampilkan tabel terbalut filter:

Text Only
 ┌─ Audit Log ────────────────────────────────────────┐
 │ Filter: [User ▾] [Action ▾] [Date range]  [Search] │
 │                                                    │
 │ Time       User          Action          Resource  │
 │ 09:42      Siti (C-CBT)  faq.update      faq-abc   │
 │ 09:38      Budi (Admin)  kb.upload       doc-def   │
 │ 09:30      Siti (C-CBT)  conversation.   conv-xyz  │
 │                          takeover                   │
 │ ...                                                │
 └────────────────────────────────────────────────────┘

2. Filter berdasarkan use case

Filter by user → lihat semua aktivitas satu admin (misal: onboarding baru untuk coach, atau investigasi karyawan)

Filter by action → misal kb.delete untuk review penghapusan dokumen KB

Filter by date range → misal H-7 untuk weekly review

Filter by resource → klik pada row → side panel menampilkan semua action terhadap resource tersebut (contoh: seluruh history edit satu FAQ)

3. Lihat detail satu event

Klik pada row → side panel:

Text Only
 ┌─ Event Detail ─────────────────────────────────────┐
 │ Time: 2026-04-23 09:42:15 UTC                      │
 │ User: Siti Aminah (marketing_counselor / CBT)     │
 │ Action: faq.update                                 │
 │ Resource: faq-local #abc-123                       │
 │                                                    │
 │ Before:                                            │
 │   answer: "Untuk Informatika, hubungi CIST..."     │
 │ After:                                             │
 │   answer: "Untuk Informatika, hubungi CIST:       +│
 │           *085196105421* (WhatsApp)..."            │
 │                                                    │
 │ IP: 10.0.12.4  •  Device: Mobile (Android)         │
 │ Browser: Chrome 124  •  OS: Android 14             │
 │                                                    │
 │ [Copy to clipboard]  [Export JSON]                 │
 └────────────────────────────────────────────────────┘

3b. Diff Before/After — Phase 4 (SHIPPED 2026-04-24)

Row yang mengubah config (FAQ, cluster, persona, escalation rule, audience rule, guidance rule, chatbot config) sekarang punya dua snapshot JSON di expanded view:

  • Before (merah muda) — state resource sebelum aksi
  • After (hijau muda) — state resource sesudah aksi

Field yang tidak berubah akan identik di kedua panel; field yang diubah terlihat berbeda. Untuk create/delete, salah satu panel menampilkan placeholder: - — (no prior state) untuk create - — (deleted) untuk delete

Click chevron di kanan row untuk expand/collapse.

3c. Widget "Perubahan Konfigurasi Terbaru" di Dashboard

Dashboard utama (setelah login) kini menampilkan 5 aksi config terbaru di bagian bawah. Setiap entri menunjukkan aksi, actor, daftar field yang berubah, dan waktu relatif.

Gunanya: operator bisa lihat apakah ada yang aneh tanpa harus buka /audit dulu. Kalau super_admin buka dashboard pagi-pagi dan melihat "faq.bulk_deactivate oleh Budi 3 jam lalu — 47 row" — itu langsung jadi perhatian, tanpa harus proaktif investigasi.

Klik entry → pindah ke /audit dengan filter resource_id sudah aktif.

4. Export untuk laporan

Klik Download CSV di kanan atas. File berisi semua filter aktif. Cocok untuk: - Laporan bulanan ke compliance officer - Investigasi dengan security tim - Backup sebelum purge

Retention otomatis

Audit log menyimpan minimal 90 hari via retention_sweep cron job. Untuk retention lebih panjang, export CSV berkala.

4b. Coverage report — cek kelengkapan instrumentasi

Developer / ops bisa jalankan skrip cepat untuk lihat status setiap action family:

Bash
bash scripts/audit-coverage-report.sh 30  # window 30 hari

Output menunjukkan: - Row count + unique actors per family (cluster, faq, intent, dll) - Status — dormant / light / active / hot - Diff surface — berapa baris yang punya before_state/after_state (Phase 4 config history)

Gunanya: kalau page diaudit tapi muncul dormant, artinya belum ada trafik — bukan bug instrumentasi. Kalau keluar hot di kolom yang seharusnya rare (misal cluster), mungkin worth diinvestigasi.

5. RBAC denies — sinyal security

Filter action = rbac.deny.* menampilkan setiap percobaan akses tanpa izin. Normalnya rendah (< 10/bulan). Jika spike: - Mungkin user dapat link internal tanpa role yang tepat - Atau sistem RBAC sedang diperas (test masuk berulang) - Cek IP source — jika dari satu IP berulang, mungkin bot/scanner

Example scenarios

Weekly compliance review. Senior admin filter action = kb.delete untuk 7 hari terakhir. Review setiap penghapusan — apakah ada alasan yang tepat? Jika ada yang tidak jelas, tanyakan pelaku via chat.

Investigasi "FAQ hilang". Marketing complaint: "FAQ scholarship Juni kok hilang?". Admin buka audit log, filter by resource type = faq-local dan search keyword "scholarship" di details. Temukan action faq.delete oleh siapa, kapan, kenapa (detail before berisi konten lama — bisa dipulihkan manual).

Onboarding new admin quality check. Baru hire marketing_admin. Setelah 2 minggu, super_admin filter by user = "Budi Baru". Review apa yang sudah dia lakukan — bagus atau butuh coaching.

Security alert. Notifikasi menyebut 20x login gagal dari satu IP. Admin buka audit log, filter action = user.login_failed AND IP = . Verify pola — block IP di firewall kalau pattern mencurigakan.

Troubleshooting

Event tidak muncul meskipun yakin sudah dilakukan. Gejala: lakukan aksi, tapi audit log tidak mencatat. Penyebab 1: aksi yang dilakukan belum di-instrument (bukan semua action di-audit, hanya yang sensitif). Penyebab 2: async logger gagal di background. Perbaikan: cek huph-api logs (docker logs huph-api | grep audit) — escalate ke developer jika error.

CSV export error "too many rows". Gejala: export > 10k rows gagal. Perbaikan: perketat filter (date range, user) lalu export per batch.

Detail JSON tidak bisa di-parse. Gejala: event detail panel tampak kosong atau "Invalid JSON". Penyebab: resource model berubah sejak event dicatat, format lama. Perbaikan: view raw JSON dari database langsung (cek dengan developer).

See also

Feature Coverage widget (super_admin only)

Halaman Dashboard untuk super_admin sekarang menampilkan card Feature Coverage di bagian bawah. Card ini agregasi dari audit_log, menunjukkan seberapa aktif 15 fitur utama admin dipakai dalam 7 / 30 / 90 hari terakhir.

Cara membaca

  • Titik hijau di kolom Status — fitur pernah digunakan dalam window waktu yang dipilih
  • Titik merah (rose) — fitur nol aktivitas. Pertimbangan:
    • Apakah fitur memang belum pernah butuh dipakai (misal: Campaigns saat belum ada campaign aktif)?
    • Atau fitur tidak discoverable dan tim tidak tahu ada?
    • Untuk kasus kedua, update K1 PageHelp banner di halaman tersebut atau tambah nudge ke operator
  • "Other (unmapped)" — action baru yang belum dikelompokkan ke domain. Hover untuk lihat daftar action → developer perlu update DOMAIN_MAP di apps/api/src/routes/adminUsageStats.ts

Range

  • 7d — aktivitas minggu ini (good untuk weekly check-in)
  • 30d — default; aktivitas bulanan (good untuk monthly review)
  • 90d — quarter view (good untuk "fitur ini pernah dipakai minimal sekali dalam 3 bulan?")

Detail per user

Widget ini HANYA agregat per fitur. Untuk detail per user (siapa melakukan apa kapan), gunakan halaman /audit biasa dengan filter user + action.

Kenapa HANYA super_admin

Feature Coverage memperlihatkan pola usage lintas seluruh tim admin. Data ini sensitif (indirectly implicates fitur owner yang tidak aktif). Widget di-scope super_admin saja agar tidak jadi pressure alat antar-role.