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' }, // Pre-fills the breed field on new rabbits (most herds are a single breed). // Defaults to Holland Lop, the current dataset's breed; editable in Settings. { key: 'default_breed', value: 'Holland Lop' }, // 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); }