diff --git a/src/request-handling/standard-request-generators.ts b/src/request-handling/standard-request-generators.ts new file mode 100644 index 0000000..6933995 --- /dev/null +++ b/src/request-handling/standard-request-generators.ts @@ -0,0 +1,91 @@ +import type { RequestHandler } from "express"; +import type { ZodSchema } from "zod"; +import { clientError } from "../error/http-errors"; +import type { OrmResult } from "../error/orm-error"; +import type { QueryParameters } from "../request-handling/common"; + +type DatabaseCall = (items: Req) => Promise>; + +export function makeStandardBodyRequestHandler( + zodSchema: ZodSchema, + databaseCall: DatabaseCall, + options: { httpReturnCode: number } = { httpReturnCode: 200 }, +): RequestHandler { + return async (req, res, next) => { + const requestResult = zodSchema.safeParse(req.body); + if (!requestResult.success) { + const error = clientError( + 400, + "Invalid request format", + requestResult.error, + ); + return next(error); + } + const databaseResult = await databaseCall([requestResult.data]); + if (!databaseResult.success) { + const error = clientError( + 400, + "Failed to execute the database command", + databaseResult.error, + ); + return next(error); + } + res.status(options.httpReturnCode).json(databaseResult.data); + }; +} + +export function makeStandardQueryRequestHandler( + zodSchema: ZodSchema, + databaseCall: DatabaseCall, + options: { httpReturnCode: number } = { httpReturnCode: 200 }, +): RequestHandler { + return async (req, res, next) => { + const requestResult = zodSchema.safeParse(req.query); + if (!requestResult.success) { + const error = clientError( + 400, + "Invalid request format", + requestResult.error, + ); + return next(error); + } + const databaseResult = await databaseCall(requestResult.data); + if (!databaseResult.success) { + const error = clientError( + 400, + "Failed to execute the database command", + databaseResult.error, + ); + return next(error); + } + res.status(options.httpReturnCode).json(databaseResult.data); + }; +} + +export function makeStandardParameterHandler( + zodSchema: ZodSchema, + databaseCall: DatabaseCall, + options: { httpReturnCode: number } = { httpReturnCode: 200 }, +): RequestHandler { + return async (req, res, next) => { + const requestResult = zodSchema.safeParse(req.params); + if (!requestResult.success) { + const error = clientError( + 400, + "Invalid request format", + requestResult.error, + ); + return next(error); + } + const databaseResult = await databaseCall(requestResult.data); + if (!databaseResult.success) { + const error = clientError( + 400, + "Failed to execute the database command", + databaseResult.error, + ); + return next(error); + } + res.status(options.httpReturnCode).json(databaseResult.data); + }; +}