fix: guard expert review state

- Reject diagnoses not in needs_review status with badRequest
- Make update conditional on both id and status needs_review using and()
- Simplify isDiagnosisRecordOrNull type guard with type alias

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
Asep Haryana Saputra
2026-05-22 16:30:17 +00:00
co-authored by Claude Opus 4.7
parent 59204b0fde
commit d72eaffb6b
+6 -3
View File
@@ -1,14 +1,16 @@
import { Elysia } from 'elysia'; import { Elysia } from 'elysia';
import type { ReviewDiagnosisRequest } from '@zeavis/shared'; import type { ReviewDiagnosisRequest } from '@zeavis/shared';
import { isDiseaseSlug } from '@zeavis/shared'; import { isDiseaseSlug } from '@zeavis/shared';
import { desc, eq } from 'drizzle-orm'; import { and, desc, eq } from 'drizzle-orm';
import { createDbClient } from '../db/client'; import { createDbClient } from '../db/client';
import { diagnoses, expertReviews } from '../db/schema'; import { diagnoses, expertReviews } from '../db/schema';
import { badRequest, forbidden, notFound, serviceUnavailable, unauthorized } from '../lib/http-errors'; import { badRequest, forbidden, notFound, serviceUnavailable, unauthorized } from '../lib/http-errors';
import { getCurrentUser } from '../lib/auth'; import { getCurrentUser } from '../lib/auth';
import { loadDiagnosisRecord } from './diagnoses'; import { loadDiagnosisRecord } from './diagnoses';
function isDiagnosisRecordOrNull(record: unknown): record is ReturnType<typeof loadDiagnosisRecord> extends Promise<infer T> ? T : never { type DiagnosisRecord = Awaited<ReturnType<typeof loadDiagnosisRecord>>;
function isDiagnosisRecordOrNull(record: unknown): record is DiagnosisRecord {
return record !== null; return record !== null;
} }
@@ -62,6 +64,7 @@ export const expertRoutes = new Elysia({ prefix: '/api/v1/expert' })
const diagnosis = existing[0]; const diagnosis = existing[0];
if (!diagnosis) return notFound('Diagnosis not found'); if (!diagnosis) return notFound('Diagnosis not found');
if (diagnosis.status !== 'needs_review') return badRequest('Diagnosis is not pending review');
const correctedSlug = req.verdict === 'corrected' ? req.correctedDiseaseSlug : null; const correctedSlug = req.verdict === 'corrected' ? req.correctedDiseaseSlug : null;
@@ -80,7 +83,7 @@ export const expertRoutes = new Elysia({ prefix: '/api/v1/expert' })
predictedDiseaseSlug: req.verdict === 'corrected' ? correctedSlug : diagnosis.predictedDiseaseSlug, predictedDiseaseSlug: req.verdict === 'corrected' ? correctedSlug : diagnosis.predictedDiseaseSlug,
updatedAt: new Date(), updatedAt: new Date(),
}) })
.where(eq(diagnoses.id, diagnosis.id)); .where(and(eq(diagnoses.id, diagnosis.id), eq(diagnoses.status, 'needs_review')));
return await loadDiagnosisRecord(diagnosis.id, null, true); return await loadDiagnosisRecord(diagnosis.id, null, true);
} catch (error) { } catch (error) {