spb/datacenterindex
Public
HTML 53.9%
TypeScript 44.5%
JavaScript 0.6%
SQL 0.5%
1/** Admin claim workbench: list + status changes. */2import type { FastifyInstance } from "fastify";3import { z } from "zod";4import { envelope, notFound, parseBody, parseQuery } from "../../lib/http.js";5import { intParam, pageParam, strParam } from "../../lib/params.js";6import { listClaims, setClaimStatus } from "../../repositories/admin/claims.js";7import { invalidate } from "../../cache.js";89export async function claimAdminRoutes(app: FastifyInstance): Promise<void> {10 app.get("/claims", { schema: { summary: "Claims (ClaimDTO[]) ?subject_type=&subject_id=&status=current|superseded|rejected|review|unscoped|all&predicate=&page=&per_page=" } }, async (req) => {11 const q = parseQuery(z.object({ subject_type: strParam, subject_id: strParam, status: strParam, predicate: strParam, page: pageParam, per_page: intParam }), req.query);12 const res = await listClaims({ subjectType: q.subject_type, subjectId: q.subject_id, status: q.status, predicate: q.predicate, page: q.page, perPage: q.per_page });13 return envelope(res.items, { total: res.total, page: res.page, perPage: res.perPage });14 });1516 app.post("/claims/:id/status", { schema: { summary: "Set a claim status {status: current|rejected|review, reason?}. Never rewrites the entity column: when a rejected claim was backing a displayed facility MW value a quality flag claim_rejected_backing_value is raised for the next reconciliation" } }, async (req) => {17 const { id } = req.params as { id: string };18 const body = parseBody(z.object({ status: z.enum(["current", "rejected", "review"]), reason: z.string().max(500).optional() }), req.body);19 const res = await setClaimStatus(id, body.status, body.reason ?? null);20 if (!res) throw notFound("claim");21 await Promise.all([invalidate("/datacenters"), invalidate("/projects")]);22 return envelope(res);23 });24}25