store.ts

1.5 KB · raw

1import type { Database } from "bun:sqlite";23/** A repo row as the console edits it (§24): every repo the sync found, public or not. */4export type AdminRepo = {5	name: string;6	public: number;7	category: string;8	homepage: string;9	/** Shown languages, joined by ", "; '' shows the detected one. */10	languages: string;11	issues_paused: number;12	last_sync_at: number | null;13	last_sync_error: string | null;14};1516export type RepoEdit = Omit<AdminRepo, "name" | "last_sync_at" | "last_sync_error">;1718export function allRepos(db: Database): AdminRepo[] {19	return db.query<AdminRepo, []>("SELECT * FROM repos ORDER BY name").all();20}2122export function findRepo(db: Database, name: string): AdminRepo | null {23	return db.query<AdminRepo, [string]>("SELECT * FROM repos WHERE name = ?").get(name);24}2526export function updateRepo(db: Database, name: string, edit: RepoEdit): void {27	db.query(28		`UPDATE repos SET public = ?, category = ?, homepage = ?, languages = ?, issues_paused = ?29		WHERE name = ?`,30	).run(edit.public, edit.category, edit.homepage, edit.languages, edit.issues_paused, name);31}3233/** Writes site settings in one transaction; an empty value removes the key, so defaults apply. */34export function saveSettings(db: Database, values: Record<string, string>): void {35	db.transaction(() => {36		for (const [key, value] of Object.entries(values)) {37			if (value === "") db.query("DELETE FROM settings WHERE key = ?").run(key);38			else db.query("INSERT OR REPLACE INTO settings (key, value) VALUES (?, ?)").run(key, value);39		}40	})();41}