61 lines · 1.9 KB
import { all, run } from "./db";
import { randomId } from "./crypto";

export type AdminAuditEntry = {
  id: string;
  actor_id: string | null;
  actor_name: string | null;
  action: string;
  target_kind: string;
  target_id: string;
  reason: string | null;
  created_at: number;
};

export type AdminAuditInput = {
  actorId: string;
  action: string;
  targetKind: string;
  targetId: string;
  reason?: string | null;
};

const MAX_REASON = 1000;

/** Appends one site-admin action to the audit log. */
export async function recordAdminAction(input: AdminAuditInput): Promise<void> {
  await run(
    `INSERT INTO admin_audit_log (id, actor_id, action, target_kind, target_id, reason, created_at)
     VALUES (?, ?, ?, ?, ?, ?, ?)`,
    randomId(),
    input.actorId,
    input.action,
    input.targetKind,
    input.targetId,
    input.reason?.trim().slice(0, MAX_REASON) || null,
    Date.now(),
  );
}

/** Keyset position: entries strictly after this one in (created_at DESC, id DESC) order. */