import bcrypt from 'bcrypt' import { SignJWT, jwtVerify } from 'jose' import { getDatabase } from './database' export interface User { id: number username: string password_hash: string created_at: string } export async function authenticateUser(username: string, password: string): Promise { 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 { 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 } } export function generateSlug(title: string, date: string): string { const formattedTitle = title .toLowerCase() .replace(/[^a-z0-9\s-]/g, '') .replace(/\s+/g, '-') .replace(/-+/g, '-') .trim() const dateObj = new Date(date) const month = String(dateObj.getMonth() + 1).padStart(2, '0') const day = String(dateObj.getDate()).padStart(2, '0') const year = dateObj.getFullYear() return `sermon-${month}${day}${year}` }