A decentralized music tracking and discovery platform built on AT Protocol 馃幍 rocksky.app
spotify atproto lastfm musicbrainz scrobbling listenbrainz
at main 53 lines 1.6 kB view raw
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 };