Starting over

This commit is contained in:
2025-10-01 22:00:32 -04:00
parent 6d0f99507a
commit 793f395795
29 changed files with 0 additions and 1542 deletions

View File

@@ -1,48 +0,0 @@
import bcrypt from 'bcryptjs'
import { SignJWT, jwtVerify } from 'jose'
import { getDatabase } from './database.server'
export interface User {
id: number
username: string
password_hash: string
created_at: string
}
export async function authenticateUser(username: string, password: string): Promise<User | null> {
const db = await getDatabase()
const user = db.prepare('SELECT * FROM users WHERE username = ?').get(username) as User | undefined
if (!user) return null
const isValid = await bcrypt.compare(password, user.password_hash)
if (!isValid) return null
return user
}
export async function createJWT(user: User): Promise<string> {
const config = useRuntimeConfig()
const secret = new TextEncoder().encode(config.jwtSecret)
return await new SignJWT({ userId: user.id, username: user.username })
.setProtectedHeader({ alg: 'HS256' })
.setIssuedAt()
.setExpirationTime('7d')
.sign(secret)
}
export async function verifyJWT(token: string): Promise<{ userId: number; username: string } | null> {
try {
const config = useRuntimeConfig()
const secret = new TextEncoder().encode(config.jwtSecret)
const { payload } = await jwtVerify(token, secret)
return {
userId: payload.userId as number,
username: payload.username as string
}
} catch {
return null
}
}

View File

@@ -1,71 +0,0 @@
import Database from 'better-sqlite3'
import { join } from 'path'
import { existsSync, mkdirSync } from 'fs'
import { dirname } from 'path'
import bcrypt from 'bcryptjs'
let db: Database.Database
export async function getDatabase() {
if (!db) {
// Use absolute path in production (Docker), relative path in development
const isProduction = process.env.NODE_ENV === 'production'
const dbPath = isProduction
? '/app/data/sermons.db'
: './data/sermons.db'
// Ensure directory exists
const dir = dirname(dbPath)
if (!existsSync(dir)) {
mkdirSync(dir, { recursive: true })
}
db = new Database(dbPath)
await initializeDatabase(db)
}
return db
}
async function initializeDatabase(db: Database.Database) {
// Create sermons table
db.exec(`
CREATE TABLE IF NOT EXISTS sermons (
id INTEGER PRIMARY KEY AUTOINCREMENT,
title TEXT NOT NULL,
date TEXT NOT NULL,
slug TEXT UNIQUE NOT NULL,
bible_references TEXT,
personal_application TEXT,
pastor_challenge TEXT,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
)
`)
// Create users table for authentication
db.exec(`
CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
username TEXT UNIQUE NOT NULL,
password_hash TEXT NOT NULL,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
)
`)
// Create default admin user if it doesn't exist
const config = useRuntimeConfig()
const saltRounds = 10
const passwordHash = await bcrypt.hash(config.adminPassword, saltRounds)
const existingAdmin = db.prepare('SELECT id FROM users WHERE username = ?').get('admin')
if (!existingAdmin) {
db.prepare('INSERT INTO users (username, password_hash) VALUES (?, ?)').run('admin', passwordHash)
}
}
export function closeDatabase() {
if (db) {
db.close()
db = null
}
}