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 type MetricsSettings = { enabled: boolean; port?: number; // Port to expose metrics on (default: 9090, separate from admin API) }; export type LoggingSettings = { enabled: boolean; format?: "json" | "console"; // Log format (default: json) }; export type DnsSettings = { enabled: boolean; resolvers: string[]; // Primary DNS resolvers (e.g., "1.1.1.1", "8.8.8.8") fallbacks?: string[]; // Fallback DNS resolvers if primary fails timeout?: string; // DNS query timeout (e.g., "5s") }; 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); } export async function getMetricsSettings(): Promise { return await getSetting("metrics"); } export async function saveMetricsSettings(settings: MetricsSettings): Promise { await setSetting("metrics", settings); } export async function getLoggingSettings(): Promise { return await getSetting("logging"); } export async function saveLoggingSettings(settings: LoggingSettings): Promise { await setSetting("logging", settings); } export async function getDnsSettings(): Promise { return await getSetting("dns"); } export async function saveDnsSettings(settings: DnsSettings): Promise { await setSetting("dns", settings); }