Files
chocoadmin/app/api/extension-requests/[id]/route.ts
T

59 lines
1.7 KiB
TypeScript

import { NextResponse } from "next/server";
import { z } from "zod";
import {
approveExtensionRequest,
cancelExtensionRequest,
} from "@/lib/extension-requests";
import { ApiError } from "@/lib/errors";
import { withApiHandler } from "@/lib/api-handler";
import { logger } from "@/lib/logger";
import { sendExtensionDoneEmail } from "@/lib/mail";
import { formatDate } from "@/lib/utils";
const CTX = "extension-requests/[id]";
const patchBodySchema = z.object({
action: z.enum(["approve", "cancel"]),
});
export const PATCH = withApiHandler<{ id: string }>(
CTX,
async (request, { params, t0 }) => {
const { id } = await params;
const maestroExtensionID = Number(id);
if (!Number.isInteger(maestroExtensionID) || maestroExtensionID <= 0) {
throw new ApiError("Invalid extension request id", 400);
}
const body = patchBodySchema.safeParse(
await request.json().catch(() => ({}))
);
if (!body.success) {
throw new ApiError("Invalid action", 400);
}
if (body.data.action === "approve") {
const result = await approveExtensionRequest(maestroExtensionID);
logger.info(CTX, "approved", {
id: maestroExtensionID,
duration: Date.now() - t0,
});
void sendExtensionDoneEmail(
result.maestroName,
result.maestroEmail,
formatDate(result.availableActivateDateTime)
);
return NextResponse.json({ ok: true, availableActivateDateTime: result.availableActivateDateTime });
}
await cancelExtensionRequest(maestroExtensionID);
logger.info(CTX, "cancelled", {
id: maestroExtensionID,
duration: Date.now() - t0,
});
return NextResponse.json({ ok: true });
}
);