SPB Git forge
38commits 1branches 0releases
338.7 MBsize
maindefault branch
5 h agolast push
HTML 53.9% TypeScript 44.5% JavaScript 0.6% SQL 0.5%
1.8 KB · 25 lines typescript
Raw Blame History
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