import db, { nowIso } from "./db"; import { settings } from "./db/schema"; import { eq } from "drizzle-orm"; export type SettingValue = T | null; export type CloudflareSettings = { apiToken: string; zoneId?: string; accountId?: string; }; export type GeneralSettings = { primaryDomain: string; acmeEmail?: string; }; export type AuthentikSettings = { outpostDomain: string; outpostUpstream: string; authEndpoint?: string; }; export async function getSetting(key: string): Promise> { const setting = await db.query.settings.findFirst({ where: (table, { eq }) => eq(table.key, key) }); if (!setting) { return null; } try { return JSON.parse(setting.value) as T; } catch (error) { console.warn(`Failed to parse setting ${key}`, error); return null; } } export async function setSetting(key: string, value: T): Promise { const payload = JSON.stringify(value); const now = nowIso(); await db .insert(settings) .values({ key, value: payload, updatedAt: now }) .onConflictDoUpdate({ target: settings.key, set: { value: payload, updatedAt: now } }); } export async function getCloudflareSettings(): Promise { return await getSetting("cloudflare"); } export async function saveCloudflareSettings(settings: CloudflareSettings): Promise { await setSetting("cloudflare", settings); } export async function getGeneralSettings(): Promise { return await getSetting("general"); } export async function saveGeneralSettings(settings: GeneralSettings): Promise { await setSetting("general", settings); } export async function getAuthentikSettings(): Promise { return await getSetting("authentik"); } export async function saveAuthentikSettings(settings: AuthentikSettings): Promise { await setSetting("authentik", settings); }