Files
nlcc-itinerary/server/utils/auth.ts

65 lines
1.7 KiB
TypeScript

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<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
}
}
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}`
}