# Audit Log

## Tujuan

- Menyimpan jejak request API dan event penting service ke tabel `audit_logs`.
- Bersifat append-only.
- Tidak menyimpan secret sensitif (password, raw token).

## Desain

- Semua route di bawah `/api/*` dicatat otomatis oleh middleware `AuditMiddleware`.
- Penyimpanan ke DB dilakukan async melalui `AuditLogService` (buffered queue + worker) agar request API tetap cepat.
- Jika queue penuh, request tetap lanjut (fail-open) dan sistem menulis warning log.

## Schema Ringkas (`audit_logs`)

- `id` (BINARY(16), PK)
- `request_id` (indexed)
- `actor_user_id` (nullable, indexed)
- `layer` (`api` / `service`)
- `action` (indexed)
- `method`, `path`, `status_code`, `success`
- `ip`, `user_agent`
- `message`
- `metadata` (JSON)
- `created_at`

## Helper Pemakaian di Service

Gunakan helper yang sudah ada di `AuthService`:

```go
s.logServiceAudit(ctx, "auth.reset_password.consume", userID, true, "password_reset_success", map[string]any{
  "reason": "manual_reset",
})
```

Untuk service lain, inject `*service.AuditLogService` lalu panggil:

```go
auditSvc.Log(ctx, service.AuditLogInput{
  Layer: "service",
  Action: "your.service.action",
  ActorUserID: userID,
  Success: true,
  Message: "done",
  Metadata: map[string]any{"key": "value"},
})
```
