import Database from 'better-sqlite3' import { join } from 'path' import bcrypt from 'bcrypt' let db: Database.Database | null = null export interface Sermon { id?: number slug: string title: string date: string dates?: string bible_references: string personal_appliance: string pastors_challenge: string worship_songs?: string created_at?: string } export interface User { id?: number username: string password: string } export function getDatabase() { if (!db) { const dbPath = join(process.cwd(), 'data', 'sermons.db') db = new Database(dbPath) // Create tables if they don't exist db.exec(` CREATE TABLE IF NOT EXISTS sermons ( id INTEGER PRIMARY KEY AUTOINCREMENT, slug TEXT UNIQUE NOT NULL, title TEXT NOT NULL, date TEXT NOT NULL, dates TEXT, bible_references TEXT NOT NULL, personal_appliance TEXT NOT NULL, pastors_challenge TEXT NOT NULL, worship_songs TEXT, archived INTEGER DEFAULT 0, created_at DATETIME DEFAULT CURRENT_TIMESTAMP ) `) db.exec(` CREATE TABLE IF NOT EXISTS users ( id INTEGER PRIMARY KEY AUTOINCREMENT, username TEXT UNIQUE NOT NULL, password TEXT NOT NULL ) `) // Insert default admin user from environment variables with hashed password const config = useRuntimeConfig() const adminUsername = config.adminUsername const adminPassword = config.adminPassword const userExists = db.prepare('SELECT COUNT(*) as count FROM users WHERE username = ?').get(adminUsername) as { count: number } if (userExists.count === 0) { // Hash the password before storing const saltRounds = 10 const hashedPassword = bcrypt.hashSync(adminPassword, saltRounds) db.prepare('INSERT INTO users (username, password) VALUES (?, ?)').run(adminUsername, hashedPassword) } } return db } export function getAllSermons(limit?: number, includeArchived: boolean = false) { const db = getDatabase() const whereClause = includeArchived ? '' : 'WHERE archived = 0' if (limit) { return db.prepare(`SELECT * FROM sermons ${whereClause} ORDER BY date DESC LIMIT ?`).all(limit) as Sermon[] } return db.prepare(`SELECT * FROM sermons ${whereClause} ORDER BY date DESC`).all() as Sermon[] } export function getArchivedSermons() { const db = getDatabase() return db.prepare('SELECT * FROM sermons WHERE archived = 1 ORDER BY date DESC').all() as Sermon[] } export function archiveSermon(id: number) { const db = getDatabase() return db.prepare('UPDATE sermons SET archived = 1 WHERE id = ?').run(id) } export function getSermonBySlug(slug: string) { const db = getDatabase() return db.prepare('SELECT * FROM sermons WHERE slug = ?').get(slug) as Sermon | undefined } export function createSermon(sermon: Sermon) { const db = getDatabase() const stmt = db.prepare(` INSERT INTO sermons (slug, title, date, dates, bible_references, personal_appliance, pastors_challenge, worship_songs) VALUES (?, ?, ?, ?, ?, ?, ?, ?) `) return stmt.run( sermon.slug, sermon.title, sermon.date, sermon.dates || null, sermon.bible_references, sermon.personal_appliance, sermon.pastors_challenge, sermon.worship_songs || null ) } export function getUserByUsername(username: string) { const db = getDatabase() return db.prepare('SELECT * FROM users WHERE username = ?').get(username) as User | undefined }