spb/autoscholar
Public
1import { auditEvents, type Db, securityEvents, type Tx } from "@autoscholar/db";2import { redact } from "@autoscholar/observability";34export type Actor = { type: "admin" | "worker" | "system"; id?: string | null; ip?: string | null };56export async function audit(7 db: Db | Tx,8 actor: Actor,9 action: string,10 target?: { type: string; id: string },11 detail: Record<string, unknown> = {},12): Promise<void> {13 await db.insert(auditEvents).values({14 actorType: actor.type,15 actorId: actor.id ?? null,16 action,17 targetType: target?.type ?? null,18 targetId: target?.id ?? null,19 detail: redact(detail),20 ip: actor.ip ?? null,21 });22}2324export async function securityEvent(25 db: Db | Tx,26 kind: string,27 detail: Record<string, unknown> = {},28 userId?: string | null,29 ip?: string | null,30): Promise<void> {31 await db32 .insert(securityEvents)33 .values({ kind, detail: redact(detail), userId: userId ?? null, ip: ip ?? null });34}35