spb/autoscholar
Public
1import { type Db, platformSettings } from "@autoscholar/db";2import { eq } from "drizzle-orm";3import { audit } from "./audit.js";45export const SETTING_KEYS = {6 dispatchPaused: "dispatch.paused",7 publishingHalted: "publishing.halted",8 publishingHaltedModes: "publishing.haltedModes",9} as const;1011export async function getSetting<T>(db: Db, key: string, fallback: T): Promise<T> {12 const [row] = await db.select().from(platformSettings).where(eq(platformSettings.key, key)).limit(1);13 return row ? (row.value as T) : fallback;14}1516export async function setSetting(17 db: Db,18 key: string,19 value: unknown,20 actor: { id: string; ip?: string | null },21): Promise<void> {22 await db23 .insert(platformSettings)24 .values({ key, value, updatedBy: `admin:${actor.id}` })25 .onConflictDoUpdate({26 target: platformSettings.key,27 set: { value, updatedBy: `admin:${actor.id}`, updatedAt: new Date() },28 });29 await audit(30 db,31 { type: "admin", id: actor.id, ip: actor.ip },32 "settings.update",33 { type: "setting", id: key },34 { value },35 );36}3738export async function allSettings(db: Db) {39 const rows = await db.select().from(platformSettings);40 const out: Record<string, unknown> = {};41 for (const r of rows) out[r.key] = r.value;42 return out;43}44