import { EndpointsFactory, ResultHandler } from "express-zod-api";
import { z } from "zod";
const statusDependingFactory = new EndpointsFactory(
new ResultHandler({
positive: (data) => ({
statusCode: [201, 202],
schema: z.object({ status: z.literal("created"), data }),
}),
negative: [
{
statusCode: 409,
schema: z.object({ status: z.literal("exists"), id: z.number() }),
},
{
statusCode: [400, 500],
schema: z.object({ status: z.literal("error"), reason: z.string() }),
},
],
handler: ({ error, response, output }) => {
if (error) {
const httpError = ensureHttpError(error);
const doesExist =
httpError.statusCode === 409 &&
"id" in httpError &&
typeof httpError.id === "number";
return void response
.status(httpError.statusCode)
.json(
doesExist
? { status: "exists", id: httpError.id }
: { status: "error", reason: httpError.message },
);
}
response.status(201).json({ status: "created", data: output });
},
}),
);