Files
andon/server/api/defects.post.ts
Julien Calixte 7c755740b9 feat(push): notify on defect filed without delaying the response
Send fire-and-forget via event.waitUntil after the row is created, so
filing latency is unaffected. (T11/F7)
2026-05-28 01:51:41 +02:00

36 lines
1.3 KiB
TypeScript

import { type } from 'arktype'
import { getDb } from '../db/client'
import { createDefect } from '../db/repositories/defects'
import { DefectInput } from '../utils/defectInput'
import { getReporter } from '../utils/getReporter'
import { sendPushOnDefectFiled } from '../utils/sendPush'
// File a defect against a board section (F2). Reporter comes from the seam,
// not the client; the timestamp defaults in the DB.
export default defineEventHandler(async (event) => {
const input = DefectInput(await readBody(event))
if (input instanceof type.errors) {
throw createError({ statusCode: 400, statusMessage: input.summary })
}
const db = getDb()
const defect = await createDefect(db, { ...input, reporterEmail: await getReporter(event) })
// Notify subscribed devices (F7) — fire-and-forget so filing stays fast.
// `waitUntil` keeps the runtime alive for the send without delaying the response.
const config = useRuntimeConfig(event)
event.waitUntil(
sendPushOnDefectFiled(
db,
{
subject: config.vapidSubject,
publicKey: config.public.vapidPublicKey,
privateKey: config.vapidPrivateKey,
},
{ sectionId: defect.sectionId, projectId: defect.projectId, verbatim: defect.verbatim },
),
)
return defect
})