feat(labs): refuse a biomarker unit change while readings are linked

Readers label every linked reading with the marker's unit, so changing
it relabelled stored numbers without converting them. PUT
/api/biomarkers/{id} now answers 422 biomarkers.unit.locked with
meta.readingCount when the unit differs and any reading (tombstoned
ones included) is linked. The marker editor says so under the unit
field.
This commit is contained in:
Marc-André Bombeck committed 2026-10-03 18:19:50 +02:00
1 parent 7022b698e7
commit dd7636e147
6 files changed
+143 -27

No files matched your search

+22
View File
@@ -143,6 +143,28 @@ export const PUT = apiHandler(
}
}
// A marker's unit labels every reading linked to it: readers resolve the
// unit from the marker, and the stored numbers are in the old unit. A
// change while readings exist would relabel history without converting a
// single value, so it is refused. Tombstoned readings count too, since an
// undo brings them back under the new label.
if (d.unit !== undefined && d.unit !== existing.unit) {
const readingCount = await prisma.labResult.count({
where: { userId: user.id, biomarkerId: id },
});
if (readingCount > 0) {
annotate({
action: { name: "labs.biomarker.update.unit-locked" },
meta: { biomarkerId: id, readingCount },
});
return apiError(
"The unit of a biomarker with readings cannot be changed",
422,
{ errorCode: "biomarkers.unit.locked", readingCount },
);
}
}
// Build `data` field-by-field. `undefined` → leave the column untouched;
// an explicit `null` on `context` / `panel` / a bound clears it.
const data: Record<string, unknown> = {};