From ee4a0387def74afca66ab75e5cb1f60aeacad86b Mon Sep 17 00:00:00 2001 From: kiwiscode Date: Tue, 4 Nov 2025 02:50:37 +0100 Subject: [PATCH 1/3] fix: move Swagger UI to /api-docs to allow errorHandler to work correctly - Changed `app.use(openAPIRouter)` to `app.use("/api-docs", openAPIRouter")` - Prevents Swagger UI from interfering with unmatched routes and error propagation - Undefined routes now correctly return "Not Found" - Global errorHandler middleware now correctly captures all propagated errors --- src/server.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/server.ts b/src/server.ts index eff5c53d..bb60553f 100644 --- a/src/server.ts +++ b/src/server.ts @@ -31,7 +31,7 @@ app.use("/health-check", healthCheckRouter); app.use("/users", userRouter); // Swagger UI -app.use(openAPIRouter); +app.use("/api-docs", openAPIRouter); // Error handlers app.use(errorHandler()); From 83fb686676ccdb7f3ab5ea53395736dd44296b5c Mon Sep 17 00:00:00 2001 From: kiwiscode Date: Tue, 4 Nov 2025 03:54:45 +0100 Subject: [PATCH 2/3] chore: replace deprecated ZodTypeAny with ZodType - ZodTypeAny is deprecated; using ZodType (without generics) instead --- src/api-docs/openAPIResponseBuilders.ts | 4 ++-- src/common/models/serviceResponse.ts | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/api-docs/openAPIResponseBuilders.ts b/src/api-docs/openAPIResponseBuilders.ts index f316ab6e..2b5c0c68 100644 --- a/src/api-docs/openAPIResponseBuilders.ts +++ b/src/api-docs/openAPIResponseBuilders.ts @@ -3,7 +3,7 @@ import type { z } from "zod"; import { ServiceResponseSchema } from "@/common/models/serviceResponse"; -export function createApiResponse(schema: z.ZodTypeAny, description: string, statusCode = StatusCodes.OK) { +export function createApiResponse(schema: z.ZodType, description: string, statusCode = StatusCodes.OK) { return { [statusCode]: { description, @@ -21,7 +21,7 @@ export function createApiResponse(schema: z.ZodTypeAny, description: string, sta // import { ResponseConfig } from '@asteasolutions/zod-to-openapi'; // import { ApiResponseConfig } from '@common/models/openAPIResponseConfig'; // export type ApiResponseConfig = { -// schema: z.ZodTypeAny; +// schema: z.ZodType; // description: string; // statusCode: StatusCodes; // }; diff --git a/src/common/models/serviceResponse.ts b/src/common/models/serviceResponse.ts index de354151..8ca93e35 100644 --- a/src/common/models/serviceResponse.ts +++ b/src/common/models/serviceResponse.ts @@ -23,7 +23,7 @@ export class ServiceResponse { } } -export const ServiceResponseSchema = (dataSchema: T) => +export const ServiceResponseSchema = (dataSchema: T) => z.object({ success: z.boolean(), message: z.string(), From c3b1536387680e3efc869b7dd41d71e4c5c176b7 Mon Sep 17 00:00:00 2001 From: kiwiscode Date: Wed, 5 Nov 2025 18:57:26 +0100 Subject: [PATCH 3/3] fix: make rateLimiter IPv6 compatible using ipKeyGenerator --- src/common/middleware/rateLimiter.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/common/middleware/rateLimiter.ts b/src/common/middleware/rateLimiter.ts index 0a939775..575ca2a7 100644 --- a/src/common/middleware/rateLimiter.ts +++ b/src/common/middleware/rateLimiter.ts @@ -1,5 +1,5 @@ import type { Request } from "express"; -import { rateLimit } from "express-rate-limit"; +import { ipKeyGenerator, rateLimit } from "express-rate-limit"; import { env } from "@/common/utils/envConfig"; @@ -9,7 +9,7 @@ const rateLimiter = rateLimit({ message: "Too many requests, please try again later.", standardHeaders: true, windowMs: 15 * 60 * env.COMMON_RATE_LIMIT_WINDOW_MS, - keyGenerator: (req: Request) => req.ip as string, + keyGenerator: (req: Request) => ipKeyGenerator(req.ip as string), // IPv6 Compatible }); export default rateLimiter;