summaryrefslogtreecommitdiff
path: root/admin-panel/src/server/db.ts
diff options
context:
space:
mode:
authorArseney300 <Arseney300@gmail.com>2026-03-05 09:47:09 +0700
committerArseney300 <Arseney300@gmail.com>2026-03-05 09:47:09 +0700
commit0885d20ac18c252f6735cd288448d5d93e95b80f (patch)
treeedfb6814e97d4000605d9f6a918c30c6aca9e10c /admin-panel/src/server/db.ts
parent22749b796d7a5e4efa9494156a3fdcfe39028da7 (diff)
WIP: admin_panel: add featurefeature/admin_panel
Diffstat (limited to 'admin-panel/src/server/db.ts')
-rw-r--r--admin-panel/src/server/db.ts82
1 files changed, 82 insertions, 0 deletions
diff --git a/admin-panel/src/server/db.ts b/admin-panel/src/server/db.ts
new file mode 100644
index 0000000..9c83031
--- /dev/null
+++ b/admin-panel/src/server/db.ts
@@ -0,0 +1,82 @@
+import Database from 'better-sqlite3';
+import { readFileSync } from 'fs';
+import { join, dirname } from 'path';
+import { mkdirSync, existsSync } from 'fs';
+import { fileURLToPath } from 'url';
+
+const __dirname = dirname(fileURLToPath(import.meta.url));
+const DATA_DIR = join(process.cwd(), 'data');
+const SCHEMA_PATH = join(__dirname, 'schema.sql');
+
+const dbCache = new Map<string, Database.Database>();
+
+function ensureDataDir(): void {
+ if (!existsSync(DATA_DIR)) {
+ mkdirSync(DATA_DIR, { recursive: true });
+ }
+}
+
+function loadSchema(): { globalSchema: string; projectSchema: string } {
+ const full = readFileSync(SCHEMA_PATH, 'utf-8');
+ const marker = '-- === PROJECT_SCHEMA ===';
+ const idx = full.indexOf(marker);
+ if (idx === -1) {
+ return { globalSchema: full, projectSchema: '' };
+ }
+ return {
+ globalSchema: full.substring(0, idx).trim(),
+ projectSchema: full.substring(idx + marker.length).trim(),
+ };
+}
+
+export function getAdminDb(): Database.Database {
+ if (dbCache.has('admin')) {
+ return dbCache.get('admin')!;
+ }
+ ensureDataDir();
+ const db = new Database(join(DATA_DIR, 'admin.db'));
+ db.pragma('journal_mode = WAL');
+ db.pragma('foreign_keys = ON');
+
+ const { globalSchema } = loadSchema();
+ db.exec(globalSchema);
+
+ dbCache.set('admin', db);
+ return db;
+}
+
+export function getProjectDb(projectName: string): Database.Database {
+ if (dbCache.has(projectName)) {
+ return dbCache.get(projectName)!;
+ }
+ ensureDataDir();
+ const db = new Database(join(DATA_DIR, `${projectName}.db`));
+ db.pragma('journal_mode = WAL');
+ db.pragma('foreign_keys = ON');
+
+ const { projectSchema } = loadSchema();
+ db.exec(projectSchema);
+
+ dbCache.set(projectName, db);
+ return db;
+}
+
+export function closeAll(): void {
+ for (const [name, db] of dbCache) {
+ db.close();
+ dbCache.delete(name);
+ }
+}
+
+export function getSetting(key: string): string | undefined {
+ const db = getAdminDb();
+ const row = db.prepare('SELECT value FROM settings WHERE key = ?').get(key) as
+ | { value: string }
+ | undefined;
+ return row?.value;
+}
+
+export function setSetting(key: string, value: string): void {
+ const db = getAdminDb();
+ db.prepare('INSERT OR REPLACE INTO settings (key, value) VALUES (?, ?)').run(key, value);
+}