MyKindlebox/mykindlebox/server/db/client.ts

44 lines
1.7 KiB
TypeScript

import Database from 'better-sqlite3';
import { drizzle } from 'drizzle-orm/better-sqlite3';
import { migrate } from 'drizzle-orm/better-sqlite3/migrator';
import fs from 'fs';
import path from 'path';
import { settings } from './schema';
// DATA_DIR lets the deployment point the SQLite file + uploads at a mounted
// volume (see docker-compose.yml). Falling back to ../data keeps local dev
// (server/data) unchanged. Resolved against the compiled file's location,
// which differs between `tsx` (source) and `node dist/...` (build) — hence the
// explicit env override for production rather than a path that assumes either.
export const dataDir = process.env.DATA_DIR
? path.resolve(process.env.DATA_DIR)
: path.join(__dirname, '..', 'data');
fs.mkdirSync(dataDir, { recursive: true });
export const uploadsDir = path.join(dataDir, 'uploads');
fs.mkdirSync(uploadsDir, { recursive: true });
export const dbPath = path.join(dataDir, 'mykindlebox.db');
const sqlite = new Database(dbPath);
export const db = drizzle(sqlite);
migrate(db, { migrationsFolder: path.join(__dirname, 'migrations') });
const defaultSettings = [
{ key: 'rabbitry_name', value: 'My Rabbitry' },
{ key: 'weight_unit', value: 'decimal_lbs' },
{ key: 'kit_prefix', value: '' },
{ key: 'theme', value: 'classic' },
// Global, never-resetting sequence used to name auto-generated kits
// (see routes/litters.ts) — intentionally not in settings.ts's editable
// ALLOWED_KEYS, since it's bookkeeping rather than a user preference.
{ key: 'kit_counter', value: '0' },
];
for (const setting of defaultSettings) {
sqlite
.prepare('INSERT OR IGNORE INTO settings (key, value) VALUES (?, ?)')
.run(setting.key, setting.value);
}