From 6121548a216f14c379049b74462d92ef7f0c5411 Mon Sep 17 00:00:00 2001 From: Vegard Kyrkjedelen Hovland Date: Mon, 2 Feb 2026 18:56:02 +0100 Subject: [PATCH 1/2] Made plural api function calls for the most standard category of calls --- .../standard-request-generators.ts | 91 +++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 src/request-handling/standard-request-generators.ts diff --git a/src/request-handling/standard-request-generators.ts b/src/request-handling/standard-request-generators.ts new file mode 100644 index 0000000..b922be6 --- /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 { QueryParameters } from "./request-handling/common"; + +type DatabaseCall = (items: Req) => Promise>; + +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); + }; +} + +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); + }; +} + +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); + }; +} From 8de1e4cb4ee7b873288428719b55c733754d3a97 Mon Sep 17 00:00:00 2001 From: Vegard Kyrkjedelen Hovland Date: Mon, 9 Feb 2026 18:47:12 +0100 Subject: [PATCH 2/2] Fix biome checks --- src/request-handling/standard-request-generators.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/request-handling/standard-request-generators.ts b/src/request-handling/standard-request-generators.ts index b922be6..6933995 100644 --- a/src/request-handling/standard-request-generators.ts +++ b/src/request-handling/standard-request-generators.ts @@ -1,12 +1,12 @@ import type { RequestHandler } from "express"; import type { ZodSchema } from "zod"; -import { clientError } from "./error/http-errors"; -import type { OrmResult } from "./error/orm-error"; -import { QueryParameters } from "./request-handling/common"; +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>; -function makeStandardBodyRequestHandler( +export function makeStandardBodyRequestHandler( zodSchema: ZodSchema, databaseCall: DatabaseCall, options: { httpReturnCode: number } = { httpReturnCode: 200 }, @@ -34,7 +34,7 @@ function makeStandardBodyRequestHandler( }; } -function makeStandardQueryRequestHandler( +export function makeStandardQueryRequestHandler( zodSchema: ZodSchema, databaseCall: DatabaseCall, options: { httpReturnCode: number } = { httpReturnCode: 200 }, @@ -62,7 +62,7 @@ function makeStandardQueryRequestHandler( }; } -function makeStandardParameterHandler( +export function makeStandardParameterHandler( zodSchema: ZodSchema, databaseCall: DatabaseCall, options: { httpReturnCode: number } = { httpReturnCode: 200 },