Skip to article
Documentation

src/app/api/policy/route.ts

Linked repository file from this build.

import { NextResponse } from "next/server";
import { apiRoute } from "@/lib/api-route";
import { getActor } from "@/lib/auth/server";
import { AccessError, can } from "@/lib/auth/scope";
import { listPolicies, publishPolicy } from "@/lib/db/policy-store";
import { policySchema } from "@/features/policy/schema";
export const dynamic = "force-dynamic";
export const GET = apiRoute("Unable to load policy tables.", async (request) => {
  if (!can(await getActor(request), "report")) throw new AccessError();
  return NextResponse.json(await listPolicies());
});
export const POST = apiRoute(
  "Unable to publish. Check the effective month and try again.",
  async (request) => {
    const actor = await getActor(request);
    if (!can(actor, "report")) throw new AccessError();
    const parsed = policySchema.safeParse(await request.json());
    if (!parsed.success)
      return NextResponse.json(
        {
          error: parsed.error.issues
            .map((issue) => `${issue.path.join(".")}: ${issue.message}`)
            .join(" "),
        },
        { status: 400 },
      );
    return NextResponse.json(await publishPolicy(actor, parsed.data), { status: 201 });
  },
);