fix: lazy DB initialization — useDb() called inside handlers, not at import

useRuntimeConfig() and better-sqlite3 were being called at module
top-level, which crashes during Nitro server startup. Now all DB
access is lazy via useDb(), and auth uses process.env directly.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Alejandro Martinez
2026-04-07 15:36:17 +02:00
parent 6148b5012d
commit 08846c9c63
8 changed files with 51 additions and 39 deletions

View File

@@ -1,8 +1,9 @@
import db from '../../utils/db'
import { useDb } from '../../utils/db'
import { requireAdmin } from '../../utils/auth'
export default defineEventHandler(async (event) => {
requireAdmin(event)
const db = useDb()
const ideas = db.prepare('SELECT text, category FROM ideas WHERE hidden = 0').all() as any[]
if (ideas.length < 3) {

View File

@@ -1,8 +1,9 @@
import db from '../../utils/db'
import { useDb } from '../../utils/db'
import { requireAdmin } from '../../utils/auth'
export default defineEventHandler((event) => {
requireAdmin(event)
const db = useDb()
const id = getRouterParam(event, 'id')
db.prepare('DELETE FROM ideas WHERE id = ?').run(id)
return { ok: true }

View File

@@ -1,8 +1,9 @@
import db from '../../utils/db'
import { useDb } from '../../utils/db'
import { requireAdmin } from '../../utils/auth'
export default defineEventHandler(async (event) => {
requireAdmin(event)
const db = useDb()
const id = getRouterParam(event, 'id')
const body = await readBody(event)

View File

@@ -1,7 +1,8 @@
import db from '../../utils/db'
import { useDb } from '../../utils/db'
import { isAdmin } from '../../utils/auth'
export default defineEventHandler((event) => {
const db = useDb()
const admin = isAdmin(event)
const rows = admin
? db.prepare('SELECT * FROM ideas ORDER BY created_at DESC').all()

View File

@@ -1,6 +1,7 @@
import db from '../../utils/db'
import { useDb } from '../../utils/db'
export default defineEventHandler(async (event) => {
const db = useDb()
const { text, category } = await readBody(event)
if (!text?.trim()) {
throw createError({ statusCode: 400, statusMessage: 'Text is required' })

View File

@@ -1,7 +1,8 @@
import { createHash } from 'crypto'
import db from '../../utils/db'
import { useDb } from '../../utils/db'
export default defineEventHandler((event) => {
const db = useDb()
const id = getRouterParam(event, 'id')
const ip = getRequestIP(event, { xForwardedFor: true }) || 'unknown'
const voterHash = createHash('sha256').update(ip + ':' + id).digest('hex')
@@ -10,7 +11,6 @@ export default defineEventHandler((event) => {
db.prepare('INSERT INTO vote_log (idea_id, voter_hash) VALUES (?, ?)').run(id, voterHash)
db.prepare('UPDATE ideas SET votes = votes + 1 WHERE id = ?').run(id)
} catch {
// UNIQUE constraint = already voted
throw createError({ statusCode: 409, statusMessage: 'Already voted' })
}