store.ts

1.7 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	sort_order: number;10	install1: string;11	install2: string;12	install3: string;13	/** Shown languages, joined by ", "; '' shows the detected one. */14	languages: string;15	last_sync_at: number | null;16	last_sync_error: string | null;17};1819export type RepoEdit = Omit<AdminRepo, "name" | "last_sync_at" | "last_sync_error">;2021export function allRepos(db: Database): AdminRepo[] {22	return db.query<AdminRepo, []>("SELECT * FROM repos ORDER BY sort_order, name").all();23}2425export function findRepo(db: Database, name: string): AdminRepo | null {26	return db.query<AdminRepo, [string]>("SELECT * FROM repos WHERE name = ?").get(name);27}2829export function updateRepo(db: Database, name: string, edit: RepoEdit): void {30	db.query(31		`UPDATE repos SET public = ?, category = ?, homepage = ?, sort_order = ?, install1 = ?,32		install2 = ?, install3 = ?, languages = ?33		WHERE name = ?`,34	).run(35		edit.public,36		edit.category,37		edit.homepage,38		edit.sort_order,39		edit.install1,40		edit.install2,41		edit.install3,42		edit.languages,43		name,44	);45}4647/** Writes site settings in one transaction; an empty value removes the key, so defaults apply. */48export function saveSettings(db: Database, values: Record<string, string>): void {49	db.transaction(() => {50		for (const [key, value] of Object.entries(values)) {51			if (value === "") db.query("DELETE FROM settings WHERE key = ?").run(key);52			else db.query("INSERT OR REPLACE INTO settings (key, value) VALUES (?, ?)").run(key, value);53		}54	})();55}