Files
2026-10-01 21:32:59 +07:00

33 lines
1.8 KiB
TypeScript

import { getDb } from "@/db";
import { commissionCheckouts, commissionSettings } from "@/db/schema";
import { eq } from "drizzle-orm";
import { validateCommissionCatalog } from "@/lib/commission/catalog";
import { promptPayConfig } from "@/lib/commission/payment";
import { commissionPrice, commissionRequestSchema } from "@/lib/commission/request";
import { requireCommissionUser } from "@/lib/commission/server";
import { errorResponse, HttpError, readJson, requireSameOrigin } from "@/lib/security/http";
import { limitRequest } from "@/lib/security/rate-limit";
export async function POST(request: Request) {
try {
requireSameOrigin(request);
const user = await requireCommissionUser();
await limitRequest("commission-checkout", user.id, 15);
const parsed = commissionRequestSchema.safeParse(await readJson(request, 32 * 1024));
if (!parsed.success || !(await validateCommissionCatalog(parsed.data)))
throw new HttpError(400, "invalid-commission-request");
promptPayConfig();
const checkout = await getDb().transaction(async (tx) => {
const [settings] = await tx.select({ isOpen: commissionSettings.isOpen }).from(commissionSettings)
.where(eq(commissionSettings.id, 1)).for("update");
if (!settings) throw new Error("Commission settings are missing. Apply the database migration.");
if (!settings.isOpen) throw new HttpError(409, "commission-closed");
const [created] = await tx.insert(commissionCheckouts).values({
userId: user.id, request: parsed.data, amountBaht: commissionPrice(parsed.data),
}).returning({ id: commissionCheckouts.id });
return created;
});
return Response.json({ checkoutId: checkout.id }, { status: 201, headers: { "Cache-Control": "no-store" } });
} catch (cause) { return errorResponse(cause); }
}