| name | awcms-micro-audit-log |
| description | Tulis audit log untuk aksi high-risk AWCMS-Micro dengan redaction. Gunakan pada login, access assignment, profile merge, price change, transaction posted/cancel/return, stock adjustment, warehouse transfer, Coretax export, sync conflict resolution, AI tool call, dan security readiness decision. Sesuai doc 03 & 10. |
AWCMS-Micro — Audit Log (High-Risk)
Ikuti docs/awcms-micro/03_srs_detail_per_modul.md dan docs/awcms-micro/10_template_kode_coding_standard.md.
Bentuk input
type AuditEventInput = {
tenantId: string;
actorTenantUserId?: string;
moduleKey: string;
action: string;
resourceType: string;
resourceId?: string;
severity?: "info" | "warning" | "critical";
message: string;
attributes?: Record<string, unknown>;
correlationId?: string;
};
Aksi yang WAJIB diaudit
Login failed/success · access assignment · profile merge · soft delete/restore/purge · sync conflict resolution · AI tool call · security readiness decision · business-scope/SoD-exception grant/revoke · legal hold create/release (data-lifecycle/application/legal-hold-service.ts:130,200). Aksi domain aplikasi turunan (ilustratif, bukan di base): product price change · transaction posted/cancel/return · stock adjustment · warehouse transfer · Coretax export. Modul ERP upstream (workflow task decision, document void/reclassify, data-exchange export/import commit) tidak diport ke AWCMS-Micro (ADR-0025) — audit rule-nya milik aplikasi turunan ERP, bukan base ini.
Aturan
- Audit tenant-scoped (
tenant_id), tulis ke awcms_micro_audit_events.
- Redaksi dulu attributes — jangan pernah masukkan: password, token, API key,
authorization, NPWP/NIK penuh, phone/WhatsApp/email penuh, receipt token.
- Audit melengkapi, bukan menggantikan, domain event & structured log.
- Sertakan
correlationId untuk trace.
- Untuk denial high-risk, koordinasikan dengan decision log (
awcms-micro-abac-guard).
- Soft delete/restore/purge wajib menyertakan reason dan tidak boleh membawa PII mentah di attributes.
Redaction keys
password, passwordHash, token, accessToken, refreshToken, apiKey, secret, credential, authorization, npwp, nik, phone, whatsapp, email, cookie (Issue #687), plus allowlist exact-match untuk key IP address (ip, ipAddress, clientIp, remoteAddr, x-forwarded-for, dst — sengaja BUKAN substring seperti key lain di atas, lihat src/modules/_shared/redaction.ts untuk kenapa: substring "ip" akan ikut meredaksi description/shipping/recipient).
Verifikasi
- Aksi high-risk menghasilkan satu audit event.
- Soft delete, restore, dan purge menghasilkan audit event terpisah.
- Tidak ada secret/PII mentah di kolom attributes.
- Retention audit: 1–5 tahun sesuai kebutuhan — mekanisme purge nyata (
purgeExpiredAuditEvents, default 730 hari, bun run logs:audit:purge) sudah tersedia sejak Issue #447, JANGAN buat mekanisme purge baru untuk awcms_micro_audit_events, lihat awcms-micro-observability.
console.error/console.warn dengan raw exception — DILARANG (Issue #687)
redactSensitiveAttributes di atas hanya bekerja pada KEY objek — pesan
exception (.message/.stack, termasuk rantai .cause) adalah teks bebas
tanpa key, dan bisa saja mengandung secret (connection string, token) yang
lolos dari redaksi berbasis key. Jangan pernah menulis
console.error(label, error) mentah atau
error instanceof Error ? error.message : String(error) lalu mencetaknya
langsung di src/pages/admin/**, src/pages/api/v1/**, atau scripts/*.ts
— pakai logAdminPageError/logScriptFailure
(src/lib/logging/error-log.ts, dibangun di atas sanitizeErrorForLog/
safeErrorDetail di src/lib/logging/error-sanitizer.ts, yang keduanya
memanggil redactSecretsInText baru). Gate bun run logging:lint:check
(scripts/logging-lint-check.ts, bagian dari bun run check) menolak pola
lama ini secara otomatis — lihat doc 20 §Standar tambahan Issue #687 untuk
detail lengkap dan panduan troubleshooting operator-safe.
Correlation ID & extension point
Sejak Issue #447: correlationId pada AuditEventInput cukup diisi dari context.locals.correlationId (jangan generate UUID baru sendiri); dan setiap recordAuditEvent sukses otomatis memanggil extension point AuditExportHook bila terpasang (default no-op) — lihat awcms-micro-observability untuk aturan lengkap sebelum memasang/mengimplementasikan consumer di titik itu.