The userRouter.ts file demonstrates how to implement a user-related API module by combining Express routing, Zod schema validation, and OpenAPI documentation registration.
To implement a new endpoint, you must:
- Create an
OpenAPIRegistry instance to track documentation. - Register the Express
Router. - Register schemas using
userRegistry.register(name, schema). - Register paths using
userRegistry.registerPath(...) to define the method, path, tags, request parameters, and responses. - Attach the actual logic to the
userRouter using Express methods (e.g., .get()), wrapping controllers with validateRequest(schema) to ensure incoming data matches the Zod schema.
import { OpenAPIRegistry } from "@asteasolutions/zod-to-openapi";
import express, { type Router } from "express";
import { z } from "zod";
import { GetUserSchema, UserSchema } from "@/api/user/userModel";
import { createApiResponse } from "@/api-docs/openAPIResponseBuilders";
import { validateRequest } from "@/common/utils/httpHandlers";
import { userController } from "./userController";
export const userRegistry = new OpenAPIRegistry();
export const userRouter: Router = express.Router();
// Registering a schema
userRegistry.register("User", UserSchema);
// Registering a path for documentation
userRegistry.registerPath({
method: "get",
path: "/users",
tags: ["User"],
responses: createApiResponse(z.array(UserSchema), "Success"),
});
// Attaching the route to Express
userRouter.get("/", userController.getUsers);
// Registering a path with request parameters
userRegistry.registerPath({
method: "get",
path: "/users/{id}",
tags: ["User"],
request: { params: GetUserSchema.shape.params },
responses: createApiResponse(UserSchema, "Success"),
});
// Attaching a validated route to Express
userRouter.get("/:id", validateRequest(GetUserSchema), userController.getUser);