59 lines
1.7 KiB
TypeScript
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,
|
|
});
|
|
const emailSent = await sendExtensionDoneEmail(
|
|
result.maestroName,
|
|
result.maestroEmail,
|
|
formatDate(result.availableActivateDateTime)
|
|
);
|
|
return NextResponse.json({ ok: true, availableActivateDateTime: result.availableActivateDateTime, emailSent });
|
|
}
|
|
|
|
await cancelExtensionRequest(maestroExtensionID);
|
|
logger.info(CTX, "cancelled", {
|
|
id: maestroExtensionID,
|
|
duration: Date.now() - t0,
|
|
});
|
|
return NextResponse.json({ ok: true });
|
|
}
|
|
);
|