import { drizzle } from 'drizzle-orm/libsql'; import { migrate as drizzleMigrate } from 'drizzle-orm/libsql/migrator'; import { createClient } from '@libsql/client'; import debug from 'debug'; import * as schema from './schema'; import { ClientService } from './repositories/client/service'; import { GeneralService } from './repositories/general/service'; import { UserService } from './repositories/user/service'; import { UserConfigService } from './repositories/userConfig/service'; import { InterfaceService } from './repositories/interface/service'; import { HooksService } from './repositories/hooks/service'; import { OneTimeLinkService } from './repositories/oneTimeLink/service'; const DB_DEBUG = debug('Database'); const client = createClient({ url: 'file:/etc/wireguard/wg0.db' }); const db = drizzle({ client, schema }); export async function connect() { await migrate(); return new DBService(db); } class DBService { clients: ClientService; general: GeneralService; users: UserService; userConfigs: UserConfigService; interfaces: InterfaceService; hooks: HooksService; oneTimeLinks: OneTimeLinkService; constructor(db: DBType) { this.clients = new ClientService(db); this.general = new GeneralService(db); this.users = new UserService(db); this.userConfigs = new UserConfigService(db); this.interfaces = new InterfaceService(db); this.hooks = new HooksService(db); this.oneTimeLinks = new OneTimeLinkService(db); } } export type DBType = typeof db; export type DBServiceType = DBService; async function migrate() { try { DB_DEBUG('Migrating database...'); await drizzleMigrate(db, { migrationsFolder: './server/database/migrations', }); DB_DEBUG('Migration complete'); } catch (e) { if (e instanceof Error) { DB_DEBUG('Failed to migrate database:', e.message); } } }