async function pollAndSave() {
const { events } = await client.getWebhookEvents({ limit: 50 });
if (!events.length) return;
const processedIds: string[] = [];
for (const event of events) {
try {
await prisma.assessmentResult.upsert({
where: { eventId: event.eventId },
create: {
eventId: event.eventId,
candidateEmail: event.candidateEmail,
candidateName: event.candidateName ?? '',
assessmentId: event.assessmentId,
assessmentName: event.assessmentName ?? '',
jobTitle: event.jobTitle ?? '',
score: event.score,
totalMarks: event.totalMarks,
passMarks: event.passMarks,
passed: event.passed,
status: event.status,
submittedAt: new Date(event.submittedAt),
durationMinutes: event.durationMinutes ?? null,
aiFeedback: event.aiFeedback ?? null,
reportUrl: event.reportUrl,
proctoringScore: event.proctoring?.score ?? 0,
proctoringViolationCount: event.proctoring?.violationCount ?? 0,
storedAt: new Date(event.storedAt),
},
update: {}, // don't overwrite — idempotent
});
processedIds.push(event.eventId);
} catch (err) {
console.error('Failed to save event', event.eventId, err);
// Don't push to processedIds — will retry next poll
}
}
if (processedIds.length) {
await client.acknowledgeWebhookEvents(processedIds);
}
}