forked from
rocksky.app/rocksky
A decentralized music tracking and discovery platform built on AT Protocol 馃幍
1import { drizzle } from "drizzle-orm/better-sqlite3";
2import { migrate } from "drizzle-orm/better-sqlite3/migrator";
3import Database from "better-sqlite3";
4import envpaths from "env-paths";
5import fs from "node:fs";
6import path from "node:path";
7import { fileURLToPath } from "node:url";
8
9const __filename = fileURLToPath(import.meta.url);
10const __dirname = path.dirname(__filename);
11
12fs.mkdirSync(envpaths("rocksky", { suffix: "" }).data, { recursive: true });
13const url = `${envpaths("rocksky", { suffix: "" }).data}/rocksky.sqlite`;
14
15const sqlite = new Database(url);
16const db = drizzle(sqlite);
17
18let initialized = false;
19
20/**
21 * Initialize the database and run migrations
22 * This should be called before any database operations
23 */
24export async function initializeDatabase() {
25 if (initialized) {
26 return;
27 }
28
29 try {
30 // In production (built), migrations are in ../drizzle
31 // In development (src), migrations are in ../../drizzle
32 let migrationsFolder = path.join(__dirname, "../drizzle");
33
34 if (!fs.existsSync(migrationsFolder)) {
35 // Try development path
36 migrationsFolder = path.join(__dirname, "../../drizzle");
37 }
38
39 if (fs.existsSync(migrationsFolder)) {
40 migrate(db, { migrationsFolder });
41 initialized = true;
42 } else {
43 // No migrations folder found - this might be the first run
44 // or migrations haven't been generated yet
45 initialized = true;
46 }
47 } catch (error) {
48 console.error("Failed to run migrations:", error);
49 throw error;
50 }
51}
52
53export default { db, initializeDatabase };