Files
shd.build/src/lib/server/audit.ts
T
jb 57068b61cd
Validate and deploy production / validate (push) Canceled after 0s
Validate and deploy production / deploy (push) Canceled after 0s
Validate and deploy staging / validate (push) Successful in 28s
Validate and deploy staging / deploy (push) Successful in 1m3s
feat: expand ISAC content modeling
2026-08-03 01:23:20 -04:00

67 lines
1.7 KiB
TypeScript

import type { Database } from '@tursodatabase/database';
import { getDatabase } from '$lib/server/database';
import { randomUUID } from 'node:crypto';
type AuditValue = Record<string, unknown> | unknown[] | null;
export async function recordIsacAudit(input: {
actorId: string;
category: string;
action: string;
entityId: string;
before?: AuditValue;
after?: AuditValue;
database?: Database;
createdAt?: string;
}) {
const database = input.database ?? (await getDatabase());
await (
await database.prepare(`INSERT INTO audit_log
(id,actor_id,entity_type,entity_id,action,before_json,after_json,created_at)
VALUES(?,?,?,?,?,?,?,?)`)
).run(
randomUUID(),
input.actorId,
input.category,
input.entityId,
input.action,
input.before === undefined ? null : JSON.stringify(input.before),
input.after === undefined ? null : JSON.stringify(input.after),
input.createdAt ?? new Date().toISOString(),
);
}
export async function auditRecord(
table: string,
id: string,
suppliedDatabase?: Database,
): Promise<Record<string, unknown> | null> {
if (
![
'stat_attributes',
'talents',
'brand_sets',
'gear',
'weapons',
'weapon_mods',
'gear_mods',
'os_protocols',
'skill_chip_sets',
'specializations',
'specialization_focuses',
'specialization_abilities',
'specialization_combat_effects',
'specialization_tree_nodes',
'roles',
].includes(table)
) {
throw new Error('Unsupported audit table');
}
const database = suppliedDatabase ?? (await getDatabase());
return (
(await (
await database.prepare(`SELECT * FROM ${table} WHERE id=?`)
).get(id)) ?? null
);
}