@exyconn/common 2.3.2 → 2.3.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/README.md +117 -12
  2. package/dist/client/http/index.d.mts +217 -49
  3. package/dist/client/http/index.d.ts +217 -49
  4. package/dist/client/http/index.js +473 -94
  5. package/dist/client/http/index.js.map +1 -1
  6. package/dist/client/http/index.mjs +441 -84
  7. package/dist/client/http/index.mjs.map +1 -1
  8. package/dist/client/index.d.mts +3 -3
  9. package/dist/client/index.d.ts +3 -3
  10. package/dist/client/index.js +481 -319
  11. package/dist/client/index.js.map +1 -1
  12. package/dist/client/index.mjs +449 -290
  13. package/dist/client/index.mjs.map +1 -1
  14. package/dist/client/utils/index.d.mts +3 -279
  15. package/dist/client/utils/index.d.ts +3 -279
  16. package/dist/{index-DuxL84IW.d.mts → index-BZf42T3R.d.mts} +39 -39
  17. package/dist/{index-D9a9oxQy.d.ts → index-CF0D8PGE.d.ts} +39 -39
  18. package/dist/{index-D3yCCjBZ.d.mts → index-Ckhm_HaX.d.mts} +21 -2
  19. package/dist/{index-01hoqibP.d.ts → index-br6POSyA.d.ts} +21 -2
  20. package/dist/index.d.mts +3 -3
  21. package/dist/index.d.ts +3 -3
  22. package/dist/index.js +1122 -329
  23. package/dist/index.js.map +1 -1
  24. package/dist/index.mjs +1134 -341
  25. package/dist/index.mjs.map +1 -1
  26. package/dist/packageCheck-B_qfsD6R.d.ts +280 -0
  27. package/dist/packageCheck-C2_FT_Rl.d.mts +280 -0
  28. package/dist/server/index.d.mts +1 -1
  29. package/dist/server/index.d.ts +1 -1
  30. package/dist/server/index.js +631 -0
  31. package/dist/server/index.js.map +1 -1
  32. package/dist/server/index.mjs +625 -2
  33. package/dist/server/index.mjs.map +1 -1
  34. package/dist/server/middleware/index.d.mts +283 -2
  35. package/dist/server/middleware/index.d.ts +283 -2
  36. package/dist/server/middleware/index.js +761 -0
  37. package/dist/server/middleware/index.js.map +1 -1
  38. package/dist/server/middleware/index.mjs +751 -1
  39. package/dist/server/middleware/index.mjs.map +1 -1
  40. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/server/enums/status.ts","../../src/server/response/response-object.ts","../../src/server/logger/winston-logger.ts","../../src/server/db/mongoose-connect.ts","../../src/server/middleware/auth.middleware.ts","../../src/server/utils/filter-builder.ts","../../src/server/utils/sanitize.ts","../../src/server/utils/packageCheck.ts","../../src/server/configs/cors.config.ts","../../src/server/configs/rate-limiter.config.ts","../../src/server/configs/server.config.ts"],"names":["StatusCode","StatusMessage","winston","DailyRotateFile","path","logger","mongoose","jwt","resolve","existsSync","readFileSync","rateLimit"],"mappings":"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","file":"index.js","sourcesContent":["/**\r\n * HTTP Status Codes\r\n * Standard HTTP status codes used across all projects\r\n */\r\nexport enum StatusCode {\r\n // Success\r\n SUCCESS = 200,\r\n CREATED = 201,\r\n ACCEPTED = 202,\r\n NO_CONTENT = 204,\r\n\r\n // Client Errors\r\n BAD_REQUEST = 400,\r\n UNAUTHORIZED = 401,\r\n FORBIDDEN = 403,\r\n NOT_FOUND = 404,\r\n CONFLICT = 409,\r\n UNPROCESSABLE_ENTITY = 422,\r\n TOO_MANY_REQUESTS = 429,\r\n\r\n // Server Errors\r\n INTERNAL_ERROR = 500,\r\n NOT_IMPLEMENTED = 501,\r\n BAD_GATEWAY = 502,\r\n SERVICE_UNAVAILABLE = 503,\r\n}\r\n\r\n/**\r\n * Status Messages\r\n * Human-readable status messages\r\n */\r\nexport enum StatusMessage {\r\n SUCCESS = 'success',\r\n CREATED = 'created',\r\n ACCEPTED = 'accepted',\r\n NO_CONTENT = 'no-data-found',\r\n BAD_REQUEST = 'bad-request',\r\n UNAUTHORIZED = 'unauthorized',\r\n FORBIDDEN = 'forbidden',\r\n NOT_FOUND = 'not-found',\r\n CONFLICT = 'conflict',\r\n UNPROCESSABLE_ENTITY = 'validation-error',\r\n TOO_MANY_REQUESTS = 'rate-limit-exceeded',\r\n INTERNAL_ERROR = 'error',\r\n NOT_IMPLEMENTED = 'not-implemented',\r\n BAD_GATEWAY = 'bad-gateway',\r\n SERVICE_UNAVAILABLE = 'service-unavailable',\r\n}\r\n\r\n// Legacy aliases for backward compatibility\r\nexport const statusCode = StatusCode;\r\nexport const statusMessage = StatusMessage;\r\n\r\nexport default {\r\n StatusCode,\r\n StatusMessage,\r\n statusCode,\r\n statusMessage,\r\n};\r\n","import type { Response } from 'express';\r\nimport { StatusCode, StatusMessage } from '../enums/status';\r\n\r\n/**\r\n * Standard API Response Interface\r\n */\r\nexport interface ApiResponse<T = unknown> {\r\n message: string;\r\n data: T | null;\r\n status: string;\r\n statusCode: number;\r\n paginationData?: PaginationData;\r\n columns?: ColumnMetadata[];\r\n}\r\n\r\n/**\r\n * Pagination Data Interface\r\n */\r\nexport interface PaginationData {\r\n total?: number;\r\n page?: number;\r\n limit?: number;\r\n totalPages?: number;\r\n hasNextPage?: boolean;\r\n hasPrevPage?: boolean;\r\n}\r\n\r\n/**\r\n * Column Metadata Interface (for dynamic tables)\r\n */\r\nexport interface ColumnMetadata {\r\n name: string;\r\n datatype: string;\r\n required: boolean;\r\n}\r\n\r\n/**\r\n * Extract column metadata from data array\r\n */\r\nexport const extractColumns = <T extends Record<string, unknown>>(\r\n data: T[]\r\n): ColumnMetadata[] => {\r\n if (!Array.isArray(data) || data.length === 0) {\r\n return [];\r\n }\r\n\r\n const sample = data[0];\r\n return Object.entries(sample).map(([key, value]) => {\r\n let datatype: string = typeof value;\r\n\r\n if (value === null) {\r\n datatype = 'null';\r\n } else if (Array.isArray(value)) {\r\n datatype = 'array';\r\n } else if (value instanceof Date) {\r\n datatype = 'date';\r\n } else if (typeof value === 'object') {\r\n datatype = 'object';\r\n }\r\n\r\n return {\r\n name: key,\r\n datatype,\r\n required: value !== null && value !== undefined,\r\n };\r\n });\r\n};\r\n\r\n/**\r\n * Success Response (200)\r\n */\r\nexport const successResponse = <T>(\r\n res: Response,\r\n data: T,\r\n message = 'Operation successful'\r\n): Response => {\r\n return res.status(StatusCode.SUCCESS).json({\r\n message,\r\n data,\r\n status: StatusMessage.SUCCESS,\r\n statusCode: StatusCode.SUCCESS,\r\n });\r\n};\r\n\r\n/**\r\n * Success Response with Array & Pagination (200)\r\n */\r\nexport const successResponseArr = <T>(\r\n res: Response,\r\n data: T[],\r\n paginationData: PaginationData = {},\r\n message = 'Operation successful'\r\n): Response => {\r\n return res.status(StatusCode.SUCCESS).json({\r\n message,\r\n data,\r\n columns: extractColumns(data as Record<string, unknown>[]),\r\n paginationData,\r\n status: StatusMessage.SUCCESS,\r\n statusCode: StatusCode.SUCCESS,\r\n });\r\n};\r\n\r\n/**\r\n * Created Response (201)\r\n */\r\nexport const createdResponse = <T>(\r\n res: Response,\r\n data: T,\r\n message = 'Resource created successfully'\r\n): Response => {\r\n return res.status(StatusCode.CREATED).json({\r\n message,\r\n data,\r\n status: StatusMessage.CREATED,\r\n statusCode: StatusCode.CREATED,\r\n });\r\n};\r\n\r\n/**\r\n * No Content Response (204 as 200 with message)\r\n */\r\nexport const noContentResponse = <T = null>(\r\n res: Response,\r\n data: T = null as T,\r\n message = 'No data found'\r\n): Response => {\r\n return res.status(StatusCode.SUCCESS).json({\r\n message,\r\n data,\r\n status: StatusMessage.NO_CONTENT,\r\n statusCode: StatusCode.NO_CONTENT,\r\n });\r\n};\r\n\r\n/**\r\n * Bad Request Response (400)\r\n */\r\nexport const badRequestResponse = (\r\n res: Response,\r\n message = 'Bad request',\r\n errors: unknown = null\r\n): Response => {\r\n return res.status(StatusCode.BAD_REQUEST).json({\r\n message,\r\n data: errors,\r\n status: StatusMessage.BAD_REQUEST,\r\n statusCode: StatusCode.BAD_REQUEST,\r\n });\r\n};\r\n\r\n/**\r\n * Unauthorized Response (401)\r\n */\r\nexport const unauthorizedResponse = (\r\n res: Response,\r\n message = 'Unauthorized access'\r\n): Response => {\r\n return res.status(StatusCode.UNAUTHORIZED).json({\r\n message,\r\n data: null,\r\n status: StatusMessage.UNAUTHORIZED,\r\n statusCode: StatusCode.UNAUTHORIZED,\r\n });\r\n};\r\n\r\n/**\r\n * Forbidden Response (403)\r\n */\r\nexport const forbiddenResponse = (\r\n res: Response,\r\n message = 'Access forbidden'\r\n): Response => {\r\n return res.status(StatusCode.FORBIDDEN).json({\r\n message,\r\n data: null,\r\n status: StatusMessage.FORBIDDEN,\r\n statusCode: StatusCode.FORBIDDEN,\r\n });\r\n};\r\n\r\n/**\r\n * Not Found Response (404)\r\n */\r\nexport const notFoundResponse = (\r\n res: Response,\r\n message = 'Resource not found'\r\n): Response => {\r\n return res.status(StatusCode.NOT_FOUND).json({\r\n message,\r\n data: null,\r\n status: StatusMessage.NOT_FOUND,\r\n statusCode: StatusCode.NOT_FOUND,\r\n });\r\n};\r\n\r\n/**\r\n * Conflict Response (409)\r\n */\r\nexport const conflictResponse = (\r\n res: Response,\r\n message = 'Resource conflict'\r\n): Response => {\r\n return res.status(StatusCode.CONFLICT).json({\r\n message,\r\n data: null,\r\n status: StatusMessage.CONFLICT,\r\n statusCode: StatusCode.CONFLICT,\r\n });\r\n};\r\n\r\n/**\r\n * Validation Error Response (422)\r\n */\r\nexport const validationErrorResponse = (\r\n res: Response,\r\n errors: unknown,\r\n message = 'Validation failed'\r\n): Response => {\r\n return res.status(StatusCode.UNPROCESSABLE_ENTITY).json({\r\n message,\r\n data: errors,\r\n status: StatusMessage.UNPROCESSABLE_ENTITY,\r\n statusCode: StatusCode.UNPROCESSABLE_ENTITY,\r\n });\r\n};\r\n\r\n/**\r\n * Error Response (500)\r\n */\r\nexport const errorResponse = (\r\n res: Response,\r\n error: unknown = null,\r\n message = 'Something went wrong'\r\n): Response => {\r\n return res.status(StatusCode.INTERNAL_ERROR).json({\r\n message,\r\n data: error,\r\n status: StatusMessage.INTERNAL_ERROR,\r\n statusCode: StatusCode.INTERNAL_ERROR,\r\n });\r\n};\r\n\r\n/**\r\n * Rate Limit Response (429)\r\n */\r\nexport const rateLimitResponse = (\r\n res: Response,\r\n message = 'Too many requests, please try again later'\r\n): Response => {\r\n return res.status(StatusCode.TOO_MANY_REQUESTS).json({\r\n message,\r\n data: null,\r\n status: StatusMessage.TOO_MANY_REQUESTS,\r\n statusCode: StatusCode.TOO_MANY_REQUESTS,\r\n });\r\n};\r\n\r\nexport default {\r\n successResponse,\r\n successResponseArr,\r\n createdResponse,\r\n noContentResponse,\r\n badRequestResponse,\r\n unauthorizedResponse,\r\n forbiddenResponse,\r\n notFoundResponse,\r\n conflictResponse,\r\n validationErrorResponse,\r\n errorResponse,\r\n rateLimitResponse,\r\n extractColumns,\r\n};\r\n","import winston from 'winston';\r\nimport DailyRotateFile from 'winston-daily-rotate-file';\r\nimport path from 'path';\r\n\r\n/**\r\n * Logger Configuration Options\r\n */\r\nexport interface LoggerConfig {\r\n level?: string;\r\n logsDir?: string;\r\n maxSize?: string;\r\n maxFiles?: string;\r\n errorMaxFiles?: string;\r\n}\r\n\r\n/**\r\n * Default logger configuration\r\n */\r\nconst defaultConfig: LoggerConfig = {\r\n level: process.env.LOG_LEVEL || 'info',\r\n logsDir: 'logs',\r\n maxSize: '20m',\r\n maxFiles: '14d',\r\n errorMaxFiles: '30d',\r\n};\r\n\r\n// Define log levels\r\nconst levels = {\r\n error: 0,\r\n warn: 1,\r\n info: 2,\r\n http: 3,\r\n debug: 4,\r\n};\r\n\r\n// Define colors for each level\r\nconst colors = {\r\n error: 'red',\r\n warn: 'yellow',\r\n info: 'green',\r\n http: 'magenta',\r\n debug: 'blue',\r\n};\r\n\r\nwinston.addColors(colors);\r\n\r\n// JSON format for file logs\r\nconst fileFormat = winston.format.combine(\r\n winston.format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }),\r\n winston.format.errors({ stack: true }),\r\n winston.format.splat(),\r\n winston.format.json()\r\n);\r\n\r\n// Colorized format for console\r\nconst consoleFormat = winston.format.combine(\r\n winston.format.colorize({ all: true }),\r\n winston.format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }),\r\n winston.format.printf((info) => {\r\n const timestamp = info.timestamp as string | undefined;\r\n const level = info.level as string;\r\n const message = info.message as string;\r\n const stack = info.stack as string | undefined;\r\n return `${timestamp} [${level}]: ${message}${stack ? '\\n' + stack : ''}`;\r\n })\r\n);\r\n\r\n/**\r\n * Create a configured Winston logger instance\r\n */\r\nexport const createLogger = (config: LoggerConfig = {}) => {\r\n const finalConfig = { ...defaultConfig, ...config };\r\n\r\n const transports: winston.transport[] = [\r\n // Console transport\r\n new winston.transports.Console({\r\n format: consoleFormat,\r\n }),\r\n\r\n // Combined logs (all levels)\r\n new DailyRotateFile({\r\n filename: path.join(finalConfig.logsDir!, 'combined-%DATE%.log'),\r\n datePattern: 'YYYY-MM-DD',\r\n maxSize: finalConfig.maxSize,\r\n maxFiles: finalConfig.maxFiles,\r\n format: fileFormat,\r\n }),\r\n\r\n // Error logs only\r\n new DailyRotateFile({\r\n filename: path.join(finalConfig.logsDir!, 'error-%DATE%.log'),\r\n datePattern: 'YYYY-MM-DD',\r\n level: 'error',\r\n maxSize: finalConfig.maxSize,\r\n maxFiles: finalConfig.errorMaxFiles,\r\n format: fileFormat,\r\n }),\r\n ];\r\n\r\n return winston.createLogger({\r\n level: finalConfig.level,\r\n levels,\r\n format: fileFormat,\r\n transports,\r\n exitOnError: false,\r\n });\r\n};\r\n\r\n// Default logger instance\r\nexport const logger = createLogger();\r\n\r\n/**\r\n * Create a stream for Morgan HTTP logger\r\n */\r\nexport const createMorganStream = (loggerInstance: winston.Logger) => ({\r\n write: (message: string) => {\r\n loggerInstance.http(message.trim());\r\n },\r\n});\r\n\r\nexport const stream = createMorganStream(logger);\r\n\r\n/**\r\n * Simple logger for development (no file output)\r\n */\r\nconst serializeMeta = (meta: unknown): string => {\r\n if (meta === undefined || meta === null) return '';\r\n if (meta instanceof Error) {\r\n return JSON.stringify({ message: meta.message, stack: meta.stack }, null, 2);\r\n }\r\n try {\r\n return JSON.stringify(meta, null, 2);\r\n } catch {\r\n return String(meta);\r\n }\r\n};\r\n\r\nexport const simpleLogger = {\r\n info: (message: string, meta?: unknown) => {\r\n console.log(`[INFO] ${message}`, serializeMeta(meta));\r\n },\r\n error: (message: string, meta?: unknown) => {\r\n console.error(`[ERROR] ${message}`, serializeMeta(meta));\r\n },\r\n warn: (message: string, meta?: unknown) => {\r\n console.warn(`[WARN] ${message}`, serializeMeta(meta));\r\n },\r\n debug: (message: string, meta?: unknown) => {\r\n console.debug(`[DEBUG] ${message}`, serializeMeta(meta));\r\n },\r\n};\r\n\r\nexport default logger;\r\n","import mongoose, { ConnectOptions } from 'mongoose';\r\n\r\n/**\r\n * Database Connection Options\r\n */\r\nexport interface DbConnectionOptions {\r\n maxPoolSize?: number;\r\n minPoolSize?: number;\r\n socketTimeoutMS?: number;\r\n serverSelectionTimeoutMS?: number;\r\n maxIdleTimeMS?: number;\r\n retryWrites?: boolean;\r\n retryReads?: boolean;\r\n w?: 'majority' | number;\r\n}\r\n\r\n/**\r\n * Default connection options\r\n */\r\nconst defaultOptions: DbConnectionOptions = {\r\n maxPoolSize: process.env.NODE_ENV === 'production' ? 50 : 10,\r\n minPoolSize: process.env.NODE_ENV === 'production' ? 10 : 5,\r\n socketTimeoutMS: 45000,\r\n serverSelectionTimeoutMS: 10000,\r\n maxIdleTimeMS: 10000,\r\n retryWrites: true,\r\n retryReads: true,\r\n w: 'majority',\r\n};\r\n\r\n/**\r\n * Connect to MongoDB with mongoose\r\n * @param mongoUri - MongoDB connection string\r\n * @param options - Connection options\r\n * @param logger - Optional logger instance\r\n */\r\nexport const connectDB = async (\r\n mongoUri: string,\r\n options: DbConnectionOptions = {},\r\n logger?: { info: (msg: string, meta?: unknown) => void; error: (msg: string, meta?: unknown) => void }\r\n): Promise<typeof mongoose> => {\r\n // Check if already connected\r\n if (mongoose.connection.readyState === 1) {\r\n logger?.info('Database already connected, reusing connection');\r\n return mongoose;\r\n }\r\n\r\n const finalOptions: ConnectOptions = { ...defaultOptions, ...options };\r\n\r\n try {\r\n await mongoose.connect(mongoUri, finalOptions);\r\n logger?.info('MongoDB connected successfully');\r\n\r\n // Handle connection events\r\n mongoose.connection.on('error', (err: Error) => {\r\n logger?.error('MongoDB connection error', err);\r\n });\r\n\r\n mongoose.connection.on('disconnected', () => {\r\n logger?.info('MongoDB disconnected');\r\n });\r\n\r\n mongoose.connection.on('reconnected', () => {\r\n logger?.info('MongoDB reconnected');\r\n });\r\n\r\n return mongoose;\r\n } catch (error) {\r\n const errorMessage = error instanceof Error ? error.message : String(error);\r\n logger?.error('MongoDB connection failed', { error: errorMessage });\r\n throw error;\r\n }\r\n};\r\n\r\n/**\r\n * Disconnect from MongoDB\r\n */\r\nexport const disconnectDB = async (\r\n logger?: { info: (msg: string) => void; error: (msg: string, meta?: unknown) => void }\r\n): Promise<void> => {\r\n try {\r\n await mongoose.disconnect();\r\n logger?.info('MongoDB disconnected successfully');\r\n } catch (error) {\r\n logger?.error('Error disconnecting from MongoDB', error);\r\n throw error;\r\n }\r\n};\r\n\r\n/**\r\n * Get connection status\r\n */\r\nexport const getConnectionStatus = (): string => {\r\n const states: Record<number, string> = {\r\n 0: 'disconnected',\r\n 1: 'connected',\r\n 2: 'connecting',\r\n 3: 'disconnecting',\r\n };\r\n return states[mongoose.connection.readyState] || 'unknown';\r\n};\r\n\r\nexport default {\r\n connectDB,\r\n disconnectDB,\r\n getConnectionStatus,\r\n};\r\n","import type { Request, Response, NextFunction } from 'express';\r\nimport jwt from 'jsonwebtoken';\r\nimport { unauthorizedResponse, forbiddenResponse } from '../response/response-object';\r\n\r\n/**\r\n * Extended Request with auth information\r\n */\r\nexport interface AuthRequest extends Request {\r\n userId?: string;\r\n organizationId?: string;\r\n apiKey?: { _id: string; name: string };\r\n user?: Record<string, unknown>;\r\n}\r\n\r\n/**\r\n * JWT Payload Interface\r\n */\r\nexport interface JWTPayload {\r\n userId: string;\r\n organizationId?: string;\r\n email?: string;\r\n role?: string;\r\n [key: string]: unknown;\r\n}\r\n\r\n/**\r\n * JWT Authentication Middleware\r\n * Validates Bearer token from Authorization header\r\n */\r\nexport const authenticateJWT = (secretKey: string) => {\r\n return (req: AuthRequest, res: Response, next: NextFunction): void => {\r\n const authHeader = req.headers.authorization;\r\n\r\n if (!authHeader || !authHeader.startsWith('Bearer ')) {\r\n unauthorizedResponse(res, 'Authorization header missing or malformed');\r\n return;\r\n }\r\n\r\n const token = authHeader.split(' ')[1];\r\n\r\n try {\r\n const decoded = jwt.verify(token, secretKey) as JWTPayload;\r\n\r\n req.userId = decoded.userId;\r\n req.organizationId = decoded.organizationId;\r\n req.user = decoded as Record<string, unknown>;\r\n\r\n if (!decoded.userId) {\r\n unauthorizedResponse(res, 'User ID not found in token');\r\n return;\r\n }\r\n\r\n next();\r\n } catch (err) {\r\n if (err instanceof jwt.TokenExpiredError) {\r\n unauthorizedResponse(res, 'Token has expired');\r\n return;\r\n }\r\n if (err instanceof jwt.JsonWebTokenError) {\r\n forbiddenResponse(res, 'Invalid token');\r\n return;\r\n }\r\n unauthorizedResponse(res, 'Token validation failed');\r\n }\r\n };\r\n};\r\n\r\n/**\r\n * Optional JWT Authentication Middleware\r\n * Validates token if present, but doesn't require it\r\n */\r\nexport const optionalAuthenticateJWT = (secretKey: string) => {\r\n return (req: AuthRequest, _res: Response, next: NextFunction): void => {\r\n const authHeader = req.headers.authorization;\r\n\r\n if (!authHeader || !authHeader.startsWith('Bearer ')) {\r\n next();\r\n return;\r\n }\r\n\r\n const token = authHeader.split(' ')[1];\r\n\r\n try {\r\n const decoded = jwt.verify(token, secretKey) as JWTPayload;\r\n req.userId = decoded.userId;\r\n req.organizationId = decoded.organizationId;\r\n req.user = decoded as Record<string, unknown>;\r\n } catch {\r\n // Token invalid, but continue without auth\r\n }\r\n\r\n next();\r\n };\r\n};\r\n\r\n/**\r\n * API Key Authentication Middleware\r\n * Validates x-api-key header\r\n */\r\nexport const authenticateApiKey = (\r\n validateKeyFn: (key: string) => Promise<{\r\n valid: boolean;\r\n organizationId?: string;\r\n keyId?: string;\r\n keyName?: string;\r\n }>\r\n) => {\r\n return async (req: AuthRequest, res: Response, next: NextFunction): Promise<void> => {\r\n try {\r\n const apiKey = req.headers['x-api-key'] as string;\r\n\r\n if (!apiKey) {\r\n unauthorizedResponse(res, 'API key is required. Please provide x-api-key header');\r\n return;\r\n }\r\n\r\n const validation = await validateKeyFn(apiKey);\r\n\r\n if (!validation.valid) {\r\n unauthorizedResponse(res, 'Invalid or inactive API key');\r\n return;\r\n }\r\n\r\n if (validation.organizationId) {\r\n req.organizationId = validation.organizationId;\r\n }\r\n if (validation.keyId && validation.keyName) {\r\n req.apiKey = {\r\n _id: validation.keyId,\r\n name: validation.keyName,\r\n };\r\n }\r\n\r\n next();\r\n } catch {\r\n unauthorizedResponse(res, 'API key validation failed');\r\n }\r\n };\r\n};\r\n\r\n/**\r\n * Organization Header Middleware\r\n * Extracts organization ID from x-organization-id header\r\n */\r\nexport const extractOrganization = (req: AuthRequest, _res: Response, next: NextFunction): void => {\r\n const orgId = req.headers['x-organization-id'] as string;\r\n\r\n if (orgId) {\r\n req.organizationId = orgId;\r\n }\r\n\r\n next();\r\n};\r\n\r\n/**\r\n * Require Organization Middleware\r\n * Ensures organizationId is present in request\r\n */\r\nexport const requireOrganization = (req: AuthRequest, res: Response, next: NextFunction): void => {\r\n if (!req.organizationId) {\r\n unauthorizedResponse(res, 'Organization ID is required');\r\n return;\r\n }\r\n next();\r\n};\r\n\r\nexport default {\r\n authenticateJWT,\r\n optionalAuthenticateJWT,\r\n authenticateApiKey,\r\n extractOrganization,\r\n requireOrganization,\r\n};\r\n","/**\r\n * Filter Builder Options\r\n */\r\nexport interface FilterOptions {\r\n organizationId?: string;\r\n search?: string;\r\n searchFields?: string[];\r\n dateField?: string;\r\n startDate?: string;\r\n endDate?: string;\r\n status?: string;\r\n isActive?: boolean;\r\n [key: string]: unknown;\r\n}\r\n\r\n/**\r\n * Pagination Options\r\n */\r\nexport interface PaginationOptions {\r\n page?: number;\r\n limit?: number;\r\n defaultLimit?: number;\r\n maxLimit?: number;\r\n}\r\n\r\n/**\r\n * Pagination Result\r\n */\r\nexport interface PaginationResult {\r\n skip: number;\r\n limit: number;\r\n page: number;\r\n}\r\n\r\n/**\r\n * Build MongoDB filter query dynamically\r\n */\r\nexport const buildFilter = (options: FilterOptions): Record<string, unknown> => {\r\n const {\r\n organizationId,\r\n search,\r\n searchFields = [],\r\n dateField = 'createdAt',\r\n startDate,\r\n endDate,\r\n status,\r\n isActive,\r\n ...additionalFilters\r\n } = options;\r\n\r\n const filter: Record<string, unknown> = {};\r\n\r\n // Add organizationId if provided\r\n if (organizationId) {\r\n filter.organizationId = organizationId;\r\n }\r\n\r\n // Handle text search with regex (min 2 characters)\r\n if (search && search.trim().length >= 2 && searchFields.length > 0) {\r\n const searchRegex = new RegExp(search.trim(), 'i');\r\n filter.$or = searchFields.map((field) => ({ [field]: searchRegex }));\r\n }\r\n\r\n // Handle date range filtering\r\n if (startDate || endDate) {\r\n filter[dateField] = {};\r\n if (startDate) {\r\n (filter[dateField] as Record<string, unknown>).$gte = new Date(startDate);\r\n }\r\n if (endDate) {\r\n (filter[dateField] as Record<string, unknown>).$lte = new Date(endDate);\r\n }\r\n }\r\n\r\n // Handle status filter\r\n if (status !== undefined) {\r\n filter.status = status;\r\n }\r\n\r\n // Handle isActive filter\r\n if (isActive !== undefined) {\r\n filter.isActive = isActive;\r\n }\r\n\r\n // Add any additional filters\r\n Object.entries(additionalFilters).forEach(([key, value]) => {\r\n if (value !== undefined && value !== null && value !== '') {\r\n filter[key] = value;\r\n }\r\n });\r\n\r\n return filter;\r\n};\r\n\r\n/**\r\n * Calculate pagination values\r\n */\r\nexport const buildPagination = (options: PaginationOptions): PaginationResult => {\r\n const { page = 1, limit, defaultLimit = 10, maxLimit = 100 } = options;\r\n\r\n const finalPage = Math.max(1, page);\r\n const finalLimit = Math.min(maxLimit, Math.max(1, limit || defaultLimit));\r\n const skip = (finalPage - 1) * finalLimit;\r\n\r\n return {\r\n skip,\r\n limit: finalLimit,\r\n page: finalPage,\r\n };\r\n};\r\n\r\n/**\r\n * Calculate pagination metadata for response\r\n */\r\nexport const buildPaginationMeta = (\r\n total: number,\r\n page: number,\r\n limit: number\r\n): {\r\n total: number;\r\n page: number;\r\n limit: number;\r\n totalPages: number;\r\n hasNextPage: boolean;\r\n hasPrevPage: boolean;\r\n} => {\r\n const totalPages = Math.ceil(total / limit);\r\n\r\n return {\r\n total,\r\n page,\r\n limit,\r\n totalPages,\r\n hasNextPage: page < totalPages,\r\n hasPrevPage: page > 1,\r\n };\r\n};\r\n\r\nexport default {\r\n buildFilter,\r\n buildPagination,\r\n buildPaginationMeta,\r\n};\r\n","/**\r\n * Sanitize user object by removing sensitive fields\r\n */\r\nexport const sanitizeUser = <T extends Record<string, unknown>>(\r\n user: T | null | undefined,\r\n additionalFieldsToRemove: string[] = []\r\n): Omit<T, 'password' | '__v' | '_id'> | null => {\r\n if (!user) return null;\r\n\r\n const fieldsToRemove = ['password', '__v', '_id', ...additionalFieldsToRemove];\r\n\r\n // Handle mongoose documents\r\n const obj = typeof (user as any).toObject === 'function' \r\n ? (user as any).toObject() \r\n : { ...user };\r\n\r\n fieldsToRemove.forEach((field) => {\r\n delete obj[field];\r\n });\r\n\r\n return obj;\r\n};\r\n\r\n/**\r\n * Sanitize document by removing specified fields\r\n */\r\nexport const sanitizeDocument = <T extends Record<string, unknown>>(\r\n doc: T | null | undefined,\r\n fieldsToRemove: string[]\r\n): Partial<T> | null => {\r\n if (!doc) return null;\r\n\r\n // Handle mongoose documents\r\n const obj = typeof (doc as any).toObject === 'function' \r\n ? (doc as any).toObject() \r\n : { ...doc };\r\n\r\n fieldsToRemove.forEach((field) => {\r\n delete obj[field];\r\n });\r\n\r\n return obj;\r\n};\r\n\r\n/**\r\n * Pick specific fields from an object\r\n */\r\nexport const pickFields = <T extends Record<string, unknown>>(\r\n obj: T | null | undefined,\r\n fieldsToPick: (keyof T)[]\r\n): Partial<T> | null => {\r\n if (!obj) return null;\r\n\r\n const result: Partial<T> = {};\r\n\r\n fieldsToPick.forEach((field) => {\r\n if (field in obj) {\r\n result[field] = obj[field];\r\n }\r\n });\r\n\r\n return result;\r\n};\r\n\r\n/**\r\n * Omit specific fields from an object\r\n */\r\nexport const omitFields = <T extends Record<string, unknown>, K extends keyof T>(\r\n obj: T | null | undefined,\r\n fieldsToOmit: K[]\r\n): Omit<T, K> | null => {\r\n if (!obj) return null;\r\n\r\n const result = { ...obj };\r\n\r\n fieldsToOmit.forEach((field) => {\r\n delete result[field];\r\n });\r\n\r\n return result as Omit<T, K>;\r\n};\r\n\r\nexport default {\r\n sanitizeUser,\r\n sanitizeDocument,\r\n pickFields,\r\n omitFields,\r\n};\r\n","/**\r\n * Package Check Utility - Server/Node.js Version\r\n * Analyzes package.json dependencies and checks for updates\r\n * \r\n * This version supports reading from file paths using Node.js fs\r\n */\r\nimport { readFileSync, existsSync } from 'fs';\r\nimport { resolve } from 'path';\r\n\r\nexport interface PackageVersion {\r\n name: string;\r\n current: string;\r\n latest: string;\r\n hasUpdate: boolean;\r\n updateType: 'major' | 'minor' | 'patch' | 'prerelease' | 'none';\r\n dependencyType: 'dependencies' | 'devDependencies' | 'peerDependencies' | 'optionalDependencies';\r\n}\r\n\r\nexport interface PackageCheckResult {\r\n packageName: string;\r\n packageVersion: string;\r\n totalDependencies: number;\r\n outdatedCount: number;\r\n dependencies: PackageVersion[];\r\n byType: {\r\n dependencies: PackageVersion[];\r\n devDependencies: PackageVersion[];\r\n peerDependencies: PackageVersion[];\r\n optionalDependencies: PackageVersion[];\r\n };\r\n byUpdateType: {\r\n major: PackageVersion[];\r\n minor: PackageVersion[];\r\n patch: PackageVersion[];\r\n prerelease: PackageVersion[];\r\n };\r\n checkedAt: Date;\r\n errors: string[];\r\n}\r\n\r\nexport interface PackageJson {\r\n name?: string;\r\n version?: string;\r\n dependencies?: Record<string, string>;\r\n devDependencies?: Record<string, string>;\r\n peerDependencies?: Record<string, string>;\r\n optionalDependencies?: Record<string, string>;\r\n}\r\n\r\n/**\r\n * Parse version string, removing range operators\r\n */\r\nfunction parseVersion(version: string): string {\r\n return version.replace(/[\\^~>=<|*x\\s]/g, '').split(' ')[0] || '0.0.0';\r\n}\r\n\r\n/**\r\n * Compare two semver versions\r\n */\r\nfunction compareVersions(current: string, latest: string): 'major' | 'minor' | 'patch' | 'prerelease' | 'none' {\r\n const currentClean = parseVersion(current);\r\n const latestClean = parseVersion(latest);\r\n\r\n if (currentClean === latestClean) return 'none';\r\n\r\n const [curMajor, curMinor, curPatch] = currentClean.split('.').map(Number);\r\n const [latMajor, latMinor, latPatch] = latestClean.split('.').map(Number);\r\n\r\n if (latest.includes('-')) return 'prerelease';\r\n if (latMajor > curMajor) return 'major';\r\n if (latMinor > curMinor) return 'minor';\r\n if (latPatch > curPatch) return 'patch';\r\n\r\n return 'none';\r\n}\r\n\r\n/**\r\n * Fetch latest version from npm registry\r\n */\r\nasync function fetchLatestVersion(packageName: string): Promise<string | null> {\r\n try {\r\n const encodedName = packageName.startsWith('@')\r\n ? `@${encodeURIComponent(packageName.slice(1))}`\r\n : encodeURIComponent(packageName);\r\n\r\n const response = await fetch(`https://registry.npmjs.org/${encodedName}`);\r\n\r\n if (!response.ok) return null;\r\n\r\n const data = await response.json();\r\n return data['dist-tags']?.latest || null;\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\n/**\r\n * Load package.json from file path, URL, or object\r\n */\r\nasync function loadPackageJson(source: string | PackageJson): Promise<PackageJson> {\r\n if (typeof source === 'object') {\r\n return source;\r\n }\r\n\r\n // URL\r\n if (source.startsWith('http://') || source.startsWith('https://')) {\r\n const response = await fetch(source);\r\n if (!response.ok) {\r\n throw new Error(`Failed to fetch: ${response.status}`);\r\n }\r\n return response.json() as Promise<PackageJson>;\r\n }\r\n\r\n // File path\r\n const filePath = resolve(source);\r\n if (!existsSync(filePath)) {\r\n throw new Error(`File not found: ${filePath}`);\r\n }\r\n\r\n const content = readFileSync(filePath, 'utf-8');\r\n return JSON.parse(content) as PackageJson;\r\n}\r\n\r\n/**\r\n * Check dependencies\r\n */\r\nasync function checkDeps(\r\n deps: Record<string, string> | undefined,\r\n type: PackageVersion['dependencyType'],\r\n errors: string[]\r\n): Promise<PackageVersion[]> {\r\n if (!deps) return [];\r\n\r\n const results: PackageVersion[] = [];\r\n const entries = Object.entries(deps);\r\n\r\n const concurrencyLimit = 10;\r\n for (let i = 0; i < entries.length; i += concurrencyLimit) {\r\n const batch = entries.slice(i, i + concurrencyLimit);\r\n const batchResults = await Promise.all(\r\n batch.map(async ([name, currentVersion]) => {\r\n try {\r\n const latest = await fetchLatestVersion(name);\r\n\r\n if (!latest) {\r\n errors.push(`Could not fetch: ${name}`);\r\n return {\r\n name,\r\n current: currentVersion,\r\n latest: 'unknown',\r\n hasUpdate: false,\r\n updateType: 'none' as const,\r\n dependencyType: type,\r\n };\r\n }\r\n\r\n const updateType = compareVersions(currentVersion, latest);\r\n\r\n return {\r\n name,\r\n current: currentVersion,\r\n latest,\r\n hasUpdate: updateType !== 'none',\r\n updateType,\r\n dependencyType: type,\r\n };\r\n } catch (err) {\r\n errors.push(`Error: ${name} - ${err}`);\r\n return {\r\n name,\r\n current: currentVersion,\r\n latest: 'error',\r\n hasUpdate: false,\r\n updateType: 'none' as const,\r\n dependencyType: type,\r\n };\r\n }\r\n })\r\n );\r\n results.push(...batchResults);\r\n }\r\n\r\n return results;\r\n}\r\n\r\n/**\r\n * Check package.json for outdated dependencies\r\n * \r\n * @example\r\n * // From file path\r\n * const result = await checkPackageServer('./package.json');\r\n * \r\n * @example\r\n * // From URL\r\n * const result = await checkPackageServer('https://raw.githubusercontent.com/user/repo/main/package.json');\r\n */\r\nexport async function checkPackageServer(\r\n source: string | PackageJson\r\n): Promise<PackageCheckResult> {\r\n const errors: string[] = [];\r\n const pkg = await loadPackageJson(source);\r\n\r\n const [dependencies, devDependencies, peerDependencies, optionalDependencies] =\r\n await Promise.all([\r\n checkDeps(pkg.dependencies, 'dependencies', errors),\r\n checkDeps(pkg.devDependencies, 'devDependencies', errors),\r\n checkDeps(pkg.peerDependencies, 'peerDependencies', errors),\r\n checkDeps(pkg.optionalDependencies, 'optionalDependencies', errors),\r\n ]);\r\n\r\n const allDeps = [...dependencies, ...devDependencies, ...peerDependencies, ...optionalDependencies];\r\n\r\n return {\r\n packageName: pkg.name || 'unknown',\r\n packageVersion: pkg.version || '0.0.0',\r\n totalDependencies: allDeps.length,\r\n outdatedCount: allDeps.filter((d) => d.hasUpdate).length,\r\n dependencies: allDeps,\r\n byType: { dependencies, devDependencies, peerDependencies, optionalDependencies },\r\n byUpdateType: {\r\n major: allDeps.filter((d) => d.updateType === 'major'),\r\n minor: allDeps.filter((d) => d.updateType === 'minor'),\r\n patch: allDeps.filter((d) => d.updateType === 'patch'),\r\n prerelease: allDeps.filter((d) => d.updateType === 'prerelease'),\r\n },\r\n checkedAt: new Date(),\r\n errors,\r\n };\r\n}\r\n\r\n/**\r\n * Format result as colored console output\r\n */\r\nexport function formatPackageCheckResult(result: PackageCheckResult): string {\r\n const lines: string[] = [];\r\n\r\n lines.push(`\\n📦 Package: ${result.packageName}@${result.packageVersion}`);\r\n lines.push(`📅 Checked: ${result.checkedAt.toISOString()}`);\r\n lines.push(`📊 Total: ${result.totalDependencies} | Outdated: ${result.outdatedCount}\\n`);\r\n\r\n const formatDep = (d: PackageVersion) => ` ${d.name.padEnd(35)} ${d.current.padEnd(15)} → ${d.latest}`;\r\n\r\n if (result.byUpdateType.major.length > 0) {\r\n lines.push('🔴 MAJOR Updates:');\r\n result.byUpdateType.major.forEach((d) => lines.push(formatDep(d)));\r\n lines.push('');\r\n }\r\n\r\n if (result.byUpdateType.minor.length > 0) {\r\n lines.push('🟡 MINOR Updates:');\r\n result.byUpdateType.minor.forEach((d) => lines.push(formatDep(d)));\r\n lines.push('');\r\n }\r\n\r\n if (result.byUpdateType.patch.length > 0) {\r\n lines.push('🟢 PATCH Updates:');\r\n result.byUpdateType.patch.forEach((d) => lines.push(formatDep(d)));\r\n lines.push('');\r\n }\r\n\r\n if (result.errors.length > 0) {\r\n lines.push('⚠️ Errors:');\r\n result.errors.forEach((e) => lines.push(` ${e}`));\r\n }\r\n\r\n return lines.join('\\n');\r\n}\r\n\r\n/**\r\n * Generate ncu command\r\n */\r\nexport function generateNcuCommand(\r\n result: PackageCheckResult,\r\n options: { updateType?: 'major' | 'minor' | 'patch' | 'all'; interactive?: boolean; upgrade?: boolean } = {}\r\n): string {\r\n const { updateType = 'all', interactive = false, upgrade = false } = options;\r\n\r\n let packages: string[] = [];\r\n\r\n switch (updateType) {\r\n case 'major':\r\n packages = result.byUpdateType.major.map((d) => d.name);\r\n break;\r\n case 'minor':\r\n packages = result.byUpdateType.minor.map((d) => d.name);\r\n break;\r\n case 'patch':\r\n packages = result.byUpdateType.patch.map((d) => d.name);\r\n break;\r\n default:\r\n packages = result.dependencies.filter((d) => d.hasUpdate).map((d) => d.name);\r\n }\r\n\r\n if (packages.length === 0) return '# No updates available';\r\n\r\n let cmd = 'npx npm-check-updates';\r\n\r\n if (packages.length < result.dependencies.length) {\r\n cmd += ` --filter \"${packages.join(',')}\"`;\r\n }\r\n\r\n if (interactive) cmd += ' --interactive';\r\n if (upgrade) cmd += ' --upgrade';\r\n\r\n return cmd;\r\n}\r\n\r\n/**\r\n * Print summary to console\r\n */\r\nexport function printPackageCheckSummary(result: PackageCheckResult): void {\r\n console.log(formatPackageCheckResult(result));\r\n\r\n if (result.outdatedCount > 0) {\r\n console.log('\\n📝 Quick Commands:');\r\n console.log(' Check all: npx npm-check-updates');\r\n console.log(' Interactive: npx npm-check-updates --interactive');\r\n console.log(' Update all: npx npm-check-updates --upgrade && npm install');\r\n\r\n if (result.byUpdateType.patch.length > 0) {\r\n console.log(` Patch only: ${generateNcuCommand(result, { updateType: 'patch', upgrade: true })}`);\r\n }\r\n }\r\n}\r\n\r\nexport const packageCheckServer = {\r\n check: checkPackageServer,\r\n format: formatPackageCheckResult,\r\n generateNcuCommand,\r\n print: printPackageCheckSummary,\r\n} as const;\r\n\r\nexport default packageCheckServer;\r\n","// =============================================================================\r\n// Dynamic CORS Configuration\r\n// Configurable for multiple projects\r\n// =============================================================================\r\n\r\nimport type { CorsOptions } from 'cors';\r\n\r\n// =============================================================================\r\n// TYPES\r\n// =============================================================================\r\n\r\n/**\r\n * CORS configuration options\r\n */\r\nexport interface CorsConfig {\r\n /** Allowed production origins */\r\n productionOrigins?: string[];\r\n /** Allowed development origins */\r\n developmentOrigins?: string[];\r\n /** Subdomain patterns to allow (e.g., '.exyconn.com') */\r\n allowedSubdomains?: string[];\r\n /** Regex patterns for origin matching */\r\n originPatterns?: RegExp[];\r\n /** Allow requests with no origin (mobile apps, curl) */\r\n allowNoOrigin?: boolean;\r\n /** Allow all origins in development */\r\n allowAllInDev?: boolean;\r\n /** Custom origin validator */\r\n customValidator?: (origin: string) => boolean;\r\n /** Enable credentials */\r\n credentials?: boolean;\r\n /** Allowed HTTP methods */\r\n methods?: string[];\r\n /** Allowed headers */\r\n allowedHeaders?: string[];\r\n /** Exposed headers */\r\n exposedHeaders?: string[];\r\n /** Preflight cache duration in seconds */\r\n maxAge?: number;\r\n}\r\n\r\n// =============================================================================\r\n// DEFAULT CONFIG\r\n// =============================================================================\r\n\r\n/**\r\n * Default CORS configuration\r\n */\r\nexport const DEFAULT_CORS_CONFIG: Required<Omit<CorsConfig, 'customValidator'>> & { customValidator?: (origin: string) => boolean } = {\r\n productionOrigins: [],\r\n developmentOrigins: [\r\n 'http://localhost:3000',\r\n 'http://localhost:4000',\r\n 'http://localhost:5000',\r\n 'http://localhost:5173',\r\n 'http://localhost:8080',\r\n 'http://127.0.0.1:3000',\r\n 'http://127.0.0.1:4000',\r\n 'http://127.0.0.1:5000',\r\n 'http://127.0.0.1:5173',\r\n 'http://127.0.0.1:8080',\r\n ],\r\n allowedSubdomains: [],\r\n originPatterns: [],\r\n allowNoOrigin: true,\r\n allowAllInDev: true,\r\n credentials: true,\r\n methods: ['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'OPTIONS', 'HEAD'],\r\n allowedHeaders: [\r\n 'Content-Type',\r\n 'Authorization',\r\n 'X-Requested-With',\r\n 'Accept',\r\n 'Origin',\r\n 'X-API-Key',\r\n 'X-Organization-Id',\r\n 'X-Request-Id',\r\n ],\r\n exposedHeaders: [\r\n 'Content-Range',\r\n 'X-Content-Range',\r\n 'X-Total-Count',\r\n 'X-Request-Id',\r\n ],\r\n maxAge: 86400, // 24 hours\r\n};\r\n\r\n// =============================================================================\r\n// CORS BUILDER\r\n// =============================================================================\r\n\r\n/**\r\n * Create CORS options with custom configuration\r\n * @param config - CORS configuration options\r\n * @returns Express CORS options object\r\n * \r\n * @example\r\n * ```typescript\r\n * // Basic usage with production origins\r\n * const cors = createCorsOptions({\r\n * productionOrigins: ['https://example.com'],\r\n * allowedSubdomains: ['.example.com'],\r\n * });\r\n * \r\n * // With custom validator\r\n * const cors = createCorsOptions({\r\n * customValidator: (origin) => origin.includes('trusted'),\r\n * });\r\n * ```\r\n */\r\nexport const createCorsOptions = (config: CorsConfig = {}): CorsOptions => {\r\n const finalConfig = { ...DEFAULT_CORS_CONFIG, ...config };\r\n \r\n const {\r\n productionOrigins,\r\n developmentOrigins,\r\n allowedSubdomains,\r\n originPatterns,\r\n allowNoOrigin,\r\n allowAllInDev,\r\n customValidator,\r\n credentials,\r\n methods,\r\n allowedHeaders,\r\n exposedHeaders,\r\n maxAge,\r\n } = finalConfig;\r\n\r\n // Combine all static origins\r\n const allOrigins = new Set([...productionOrigins, ...developmentOrigins]);\r\n\r\n const originHandler = (\r\n origin: string | undefined,\r\n callback: (err: Error | null, allow?: boolean) => void\r\n ): void => {\r\n // Allow requests with no origin (mobile apps, curl, server-to-server)\r\n if (!origin) {\r\n callback(null, allowNoOrigin);\r\n return;\r\n }\r\n\r\n // Check static allowed origins\r\n if (allOrigins.has(origin)) {\r\n callback(null, true);\r\n return;\r\n }\r\n\r\n // Check subdomain patterns\r\n if (allowedSubdomains.some((subdomain) => origin.endsWith(subdomain))) {\r\n callback(null, true);\r\n return;\r\n }\r\n\r\n // Check regex patterns\r\n if (originPatterns.some((pattern) => pattern.test(origin))) {\r\n callback(null, true);\r\n return;\r\n }\r\n\r\n // Check custom validator\r\n if (customValidator && customValidator(origin)) {\r\n callback(null, true);\r\n return;\r\n }\r\n\r\n // In development, allow all if configured\r\n if (process.env.NODE_ENV !== 'production' && allowAllInDev) {\r\n callback(null, true);\r\n return;\r\n }\r\n\r\n // Reject in production\r\n if (process.env.NODE_ENV === 'production') {\r\n callback(new Error(`Origin ${origin} not allowed by CORS`));\r\n return;\r\n }\r\n\r\n // Default allow in non-production\r\n callback(null, true);\r\n };\r\n\r\n return {\r\n origin: originHandler,\r\n credentials,\r\n methods,\r\n allowedHeaders,\r\n exposedHeaders,\r\n maxAge,\r\n };\r\n};\r\n\r\n/**\r\n * Create CORS options for a specific project/brand\r\n * @param brandDomain - Primary domain (e.g., 'exyconn.com')\r\n * @param additionalConfig - Additional configuration\r\n */\r\nexport const createBrandCorsOptions = (\r\n brandDomain: string,\r\n additionalConfig: Partial<CorsConfig> = {}\r\n): CorsOptions => {\r\n const productionOrigins = [\r\n `https://${brandDomain}`,\r\n `https://www.${brandDomain}`,\r\n ];\r\n\r\n const allowedSubdomains = [`.${brandDomain}`];\r\n\r\n return createCorsOptions({\r\n productionOrigins,\r\n allowedSubdomains,\r\n ...additionalConfig,\r\n });\r\n};\r\n\r\n/**\r\n * Create CORS options for multiple projects\r\n * @param domains - Array of primary domains\r\n * @param additionalConfig - Additional configuration\r\n */\r\nexport const createMultiBrandCorsOptions = (\r\n domains: string[],\r\n additionalConfig: Partial<CorsConfig> = {}\r\n): CorsOptions => {\r\n const productionOrigins = domains.flatMap((domain) => [\r\n `https://${domain}`,\r\n `https://www.${domain}`,\r\n ]);\r\n\r\n const allowedSubdomains = domains.map((domain) => `.${domain}`);\r\n\r\n return createCorsOptions({\r\n productionOrigins,\r\n allowedSubdomains,\r\n ...additionalConfig,\r\n });\r\n};\r\n\r\n// =============================================================================\r\n// PRESET CONFIGURATIONS\r\n// =============================================================================\r\n\r\n/**\r\n * Exyconn preset CORS configuration\r\n */\r\nexport const EXYCONN_CORS_CONFIG: CorsConfig = {\r\n productionOrigins: [\r\n 'https://exyconn.com',\r\n 'https://www.exyconn.com',\r\n 'https://botify.life',\r\n 'https://www.botify.life',\r\n 'https://partywings.fun',\r\n 'https://www.partywings.fun',\r\n 'https://sibera.work',\r\n 'https://www.sibera.work',\r\n 'https://spentiva.com',\r\n 'https://www.spentiva.com',\r\n ],\r\n allowedSubdomains: [\r\n '.exyconn.com',\r\n '.botify.life',\r\n '.partywings.fun',\r\n '.sibera.work',\r\n '.spentiva.com',\r\n ],\r\n developmentOrigins: [\r\n 'http://localhost:3000',\r\n 'http://localhost:4000',\r\n 'http://localhost:4001',\r\n 'http://localhost:4002',\r\n 'http://localhost:4003',\r\n 'http://localhost:4004',\r\n 'http://localhost:4005',\r\n 'http://localhost:5173',\r\n 'http://127.0.0.1:3000',\r\n 'http://127.0.0.1:4000',\r\n 'http://127.0.0.1:5173',\r\n ],\r\n};\r\n\r\n/**\r\n * Strict CORS configuration (production only)\r\n */\r\nexport const STRICT_CORS_CONFIG: CorsConfig = {\r\n allowNoOrigin: false,\r\n allowAllInDev: false,\r\n methods: ['GET', 'POST', 'PUT', 'DELETE'],\r\n};\r\n\r\n/**\r\n * Permissive CORS configuration (development/testing)\r\n */\r\nexport const PERMISSIVE_CORS_CONFIG: CorsConfig = {\r\n allowNoOrigin: true,\r\n allowAllInDev: true,\r\n originPatterns: [/localhost/, /127\\.0\\.0\\.1/],\r\n};\r\n\r\n// =============================================================================\r\n// LEGACY EXPORTS (backward compatibility)\r\n// =============================================================================\r\n\r\n/**\r\n * @deprecated Use createCorsOptions() instead\r\n */\r\nexport const corsOptions: CorsOptions = createCorsOptions(EXYCONN_CORS_CONFIG);\r\n\r\nexport default {\r\n createCorsOptions,\r\n createBrandCorsOptions,\r\n createMultiBrandCorsOptions,\r\n DEFAULT_CORS_CONFIG,\r\n EXYCONN_CORS_CONFIG,\r\n STRICT_CORS_CONFIG,\r\n PERMISSIVE_CORS_CONFIG,\r\n corsOptions,\r\n};\r\n","// =============================================================================\r\n// Dynamic Rate Limiter Configuration\r\n// Configurable for multiple projects\r\n// =============================================================================\r\n\r\nimport rateLimit from 'express-rate-limit';\r\nimport type { Options, RateLimitRequestHandler } from 'express-rate-limit';\r\nimport type { Request } from 'express';\r\n\r\n// =============================================================================\r\n// TYPES\r\n// =============================================================================\r\n\r\n/**\r\n * Rate limit tier configuration\r\n */\r\nexport interface RateLimitTierConfig {\r\n /** Window duration in milliseconds */\r\n windowMs: number;\r\n /** Maximum requests allowed in window */\r\n maxRequests: number;\r\n /** Error message to return */\r\n message: string;\r\n /** Skip successful requests */\r\n skipSuccessfulRequests?: boolean;\r\n /** Skip failed requests */\r\n skipFailedRequests?: boolean;\r\n}\r\n\r\n/**\r\n * Rate limiter configuration options\r\n */\r\nexport interface RateLimiterConfig {\r\n /** Standard tier - general API endpoints */\r\n standard?: Partial<RateLimitTierConfig>;\r\n /** Strict tier - sensitive endpoints (login, signup) */\r\n strict?: Partial<RateLimitTierConfig>;\r\n /** DDoS tier - global protection */\r\n ddos?: Partial<RateLimitTierConfig>;\r\n /** Custom tiers */\r\n custom?: Record<string, RateLimitTierConfig>;\r\n /** Use standard headers */\r\n standardHeaders?: boolean;\r\n /** Use legacy headers */\r\n legacyHeaders?: boolean;\r\n /** Custom key generator */\r\n keyGenerator?: (req: Request) => string;\r\n /** Skip certain requests */\r\n skip?: (req: Request) => boolean;\r\n /** Handler for when rate limit is exceeded */\r\n handler?: Options['handler'];\r\n}\r\n\r\n/**\r\n * Rate limit response format\r\n */\r\nexport interface RateLimitResponse {\r\n status: string;\r\n statusCode: number;\r\n message: string;\r\n retryAfter?: number;\r\n}\r\n\r\n// =============================================================================\r\n// DEFAULT CONFIGURATIONS\r\n// =============================================================================\r\n\r\n/**\r\n * Default rate limit tier configurations\r\n */\r\nexport const DEFAULT_RATE_LIMIT_TIERS = {\r\n STANDARD: {\r\n windowMs: 15 * 60 * 1000, // 15 minutes\r\n maxRequests: 100,\r\n message: 'Too many requests, please try again later.',\r\n skipSuccessfulRequests: false,\r\n skipFailedRequests: false,\r\n },\r\n STRICT: {\r\n windowMs: 15 * 60 * 1000, // 15 minutes\r\n maxRequests: 20,\r\n message: 'Too many requests, please try again later.',\r\n skipSuccessfulRequests: false,\r\n skipFailedRequests: false,\r\n },\r\n DDOS: {\r\n windowMs: 60 * 1000, // 1 minute\r\n maxRequests: 60,\r\n message: 'Rate limit exceeded. Please slow down.',\r\n skipSuccessfulRequests: false,\r\n skipFailedRequests: false,\r\n },\r\n // Additional presets\r\n VERY_STRICT: {\r\n windowMs: 60 * 60 * 1000, // 1 hour\r\n maxRequests: 5,\r\n message: 'Too many attempts. Please try again in an hour.',\r\n skipSuccessfulRequests: false,\r\n skipFailedRequests: false,\r\n },\r\n RELAXED: {\r\n windowMs: 15 * 60 * 1000, // 15 minutes\r\n maxRequests: 500,\r\n message: 'Rate limit exceeded.',\r\n skipSuccessfulRequests: false,\r\n skipFailedRequests: false,\r\n },\r\n API: {\r\n windowMs: 60 * 1000, // 1 minute\r\n maxRequests: 30,\r\n message: 'API rate limit exceeded.',\r\n skipSuccessfulRequests: false,\r\n skipFailedRequests: false,\r\n },\r\n} as const;\r\n\r\n// =============================================================================\r\n// KEY GENERATORS\r\n// =============================================================================\r\n\r\n/**\r\n * Default IP-based key generator\r\n */\r\nexport const defaultKeyGenerator = (req: Request): string => {\r\n const forwarded = req.headers['x-forwarded-for'];\r\n const ip = forwarded \r\n ? (Array.isArray(forwarded) ? forwarded[0] : forwarded.split(',')[0].trim())\r\n : req.ip || req.socket.remoteAddress || 'unknown';\r\n return ip;\r\n};\r\n\r\n/**\r\n * Create key generator with custom prefix\r\n */\r\nexport const createPrefixedKeyGenerator = (prefix: string) => (req: Request): string => {\r\n return `${prefix}:${defaultKeyGenerator(req)}`;\r\n};\r\n\r\n/**\r\n * Create key generator based on user ID (for authenticated routes)\r\n */\r\nexport const createUserKeyGenerator = (getUserId: (req: Request) => string | undefined) => (req: Request): string => {\r\n const userId = getUserId(req);\r\n return userId || defaultKeyGenerator(req);\r\n};\r\n\r\n/**\r\n * Create key generator based on API key\r\n */\r\nexport const createApiKeyGenerator = (headerName: string = 'x-api-key') => (req: Request): string => {\r\n const apiKey = req.headers[headerName.toLowerCase()] as string | undefined;\r\n return apiKey || defaultKeyGenerator(req);\r\n};\r\n\r\n// =============================================================================\r\n// RATE LIMITER FACTORY\r\n// =============================================================================\r\n\r\n/**\r\n * Create rate limiter response object\r\n */\r\nconst createRateLimitResponse = (message: string, retryAfter?: number): RateLimitResponse => ({\r\n status: 'error',\r\n statusCode: 429,\r\n message,\r\n ...(retryAfter && { retryAfter }),\r\n});\r\n\r\n/**\r\n * Create a rate limiter with custom configuration\r\n * @param tierConfig - Tier configuration\r\n * @param options - Additional options\r\n * @returns Express rate limit middleware\r\n * \r\n * @example\r\n * ```typescript\r\n * // Create custom rate limiter\r\n * const apiLimiter = createRateLimiter({\r\n * windowMs: 60 * 1000, // 1 minute\r\n * maxRequests: 30,\r\n * message: 'API rate limit exceeded',\r\n * });\r\n * \r\n * // Use with user-based limiting\r\n * const userLimiter = createRateLimiter(\r\n * { windowMs: 60000, maxRequests: 10, message: 'Slow down!' },\r\n * { keyGenerator: createUserKeyGenerator((req) => req.userId) }\r\n * );\r\n * ```\r\n */\r\nexport const createRateLimiter = (\r\n tierConfig: RateLimitTierConfig,\r\n options: Partial<Omit<RateLimiterConfig, 'standard' | 'strict' | 'ddos' | 'custom'>> = {}\r\n): RateLimitRequestHandler => {\r\n const {\r\n standardHeaders = true,\r\n legacyHeaders = false,\r\n keyGenerator = defaultKeyGenerator,\r\n skip,\r\n handler,\r\n } = options;\r\n\r\n return rateLimit({\r\n windowMs: tierConfig.windowMs,\r\n max: tierConfig.maxRequests,\r\n message: createRateLimitResponse(tierConfig.message),\r\n standardHeaders,\r\n legacyHeaders,\r\n keyGenerator,\r\n skip,\r\n handler,\r\n skipSuccessfulRequests: tierConfig.skipSuccessfulRequests,\r\n skipFailedRequests: tierConfig.skipFailedRequests,\r\n });\r\n};\r\n\r\n/**\r\n * Create standard rate limiter\r\n * @param config - Optional custom configuration\r\n */\r\nexport const createStandardRateLimiter = (\r\n config: Partial<RateLimitTierConfig> = {},\r\n options: Partial<Omit<RateLimiterConfig, 'standard' | 'strict' | 'ddos' | 'custom'>> = {}\r\n): RateLimitRequestHandler => {\r\n const tierConfig = { ...DEFAULT_RATE_LIMIT_TIERS.STANDARD, ...config };\r\n return createRateLimiter(tierConfig, options);\r\n};\r\n\r\n/**\r\n * Create strict rate limiter (for sensitive endpoints)\r\n * @param config - Optional custom configuration\r\n */\r\nexport const createStrictRateLimiter = (\r\n config: Partial<RateLimitTierConfig> = {},\r\n options: Partial<Omit<RateLimiterConfig, 'standard' | 'strict' | 'ddos' | 'custom'>> = {}\r\n): RateLimitRequestHandler => {\r\n const tierConfig = { ...DEFAULT_RATE_LIMIT_TIERS.STRICT, ...config };\r\n return createRateLimiter(tierConfig, options);\r\n};\r\n\r\n/**\r\n * Create DDoS protection rate limiter\r\n * @param config - Optional custom configuration\r\n */\r\nexport const createDdosRateLimiter = (\r\n config: Partial<RateLimitTierConfig> = {},\r\n options: Partial<Omit<RateLimiterConfig, 'standard' | 'strict' | 'ddos' | 'custom'>> = {}\r\n): RateLimitRequestHandler => {\r\n const tierConfig = { ...DEFAULT_RATE_LIMIT_TIERS.DDOS, ...config };\r\n return createRateLimiter(tierConfig, options);\r\n};\r\n\r\n/**\r\n * Create API rate limiter\r\n * @param config - Optional custom configuration\r\n */\r\nexport const createApiRateLimiter = (\r\n config: Partial<RateLimitTierConfig> = {},\r\n options: Partial<Omit<RateLimiterConfig, 'standard' | 'strict' | 'ddos' | 'custom'>> = {}\r\n): RateLimitRequestHandler => {\r\n const tierConfig = { ...DEFAULT_RATE_LIMIT_TIERS.API, ...config };\r\n return createRateLimiter(tierConfig, {\r\n keyGenerator: createApiKeyGenerator(),\r\n ...options,\r\n });\r\n};\r\n\r\n// =============================================================================\r\n// RATE LIMITER BUILDER CLASS\r\n// =============================================================================\r\n\r\n/**\r\n * Rate limiter builder for complex configurations\r\n */\r\nexport class RateLimiterBuilder {\r\n private config: RateLimitTierConfig;\r\n private options: Partial<Omit<RateLimiterConfig, 'standard' | 'strict' | 'ddos' | 'custom'>>;\r\n\r\n constructor(preset: keyof typeof DEFAULT_RATE_LIMIT_TIERS = 'STANDARD') {\r\n const presetConfig = DEFAULT_RATE_LIMIT_TIERS[preset];\r\n this.config = {\r\n windowMs: presetConfig.windowMs,\r\n maxRequests: presetConfig.maxRequests,\r\n message: presetConfig.message,\r\n skipSuccessfulRequests: presetConfig.skipSuccessfulRequests ?? false,\r\n skipFailedRequests: presetConfig.skipFailedRequests ?? false,\r\n };\r\n this.options = {};\r\n }\r\n\r\n /**\r\n * Set window duration\r\n */\r\n windowMs(ms: number): this {\r\n this.config.windowMs = ms;\r\n return this;\r\n }\r\n\r\n /**\r\n * Set window duration in minutes\r\n */\r\n windowMinutes(minutes: number): this {\r\n this.config.windowMs = minutes * 60 * 1000;\r\n return this;\r\n }\r\n\r\n /**\r\n * Set window duration in hours\r\n */\r\n windowHours(hours: number): this {\r\n this.config.windowMs = hours * 60 * 60 * 1000;\r\n return this;\r\n }\r\n\r\n /**\r\n * Set maximum requests\r\n */\r\n max(requests: number): this {\r\n this.config.maxRequests = requests;\r\n return this;\r\n }\r\n\r\n /**\r\n * Set error message\r\n */\r\n message(msg: string): this {\r\n this.config.message = msg;\r\n return this;\r\n }\r\n\r\n /**\r\n * Skip successful requests\r\n */\r\n skipSuccessful(skip: boolean = true): this {\r\n this.config.skipSuccessfulRequests = skip;\r\n return this;\r\n }\r\n\r\n /**\r\n * Skip failed requests\r\n */\r\n skipFailed(skip: boolean = true): this {\r\n this.config.skipFailedRequests = skip;\r\n return this;\r\n }\r\n\r\n /**\r\n * Set key generator\r\n */\r\n keyBy(generator: (req: Request) => string): this {\r\n this.options.keyGenerator = generator;\r\n return this;\r\n }\r\n\r\n /**\r\n * Key by IP (default)\r\n */\r\n keyByIp(): this {\r\n this.options.keyGenerator = defaultKeyGenerator;\r\n return this;\r\n }\r\n\r\n /**\r\n * Key by API key\r\n */\r\n keyByApiKey(headerName?: string): this {\r\n this.options.keyGenerator = createApiKeyGenerator(headerName);\r\n return this;\r\n }\r\n\r\n /**\r\n * Skip certain requests\r\n */\r\n skipWhen(predicate: (req: Request) => boolean): this {\r\n this.options.skip = predicate;\r\n return this;\r\n }\r\n\r\n /**\r\n * Build the rate limiter\r\n */\r\n build(): RateLimitRequestHandler {\r\n return createRateLimiter(this.config, this.options);\r\n }\r\n}\r\n\r\n/**\r\n * Create a new rate limiter builder\r\n */\r\nexport const rateLimiter = (preset?: keyof typeof DEFAULT_RATE_LIMIT_TIERS): RateLimiterBuilder => {\r\n return new RateLimiterBuilder(preset);\r\n};\r\n\r\n// =============================================================================\r\n// LEGACY EXPORTS (backward compatibility)\r\n// =============================================================================\r\n\r\n/**\r\n * @deprecated Use DEFAULT_RATE_LIMIT_TIERS instead\r\n */\r\nexport const RATE_LIMIT_CONFIG = {\r\n STANDARD: DEFAULT_RATE_LIMIT_TIERS.STANDARD,\r\n STRICT: DEFAULT_RATE_LIMIT_TIERS.STRICT,\r\n DDOS: DEFAULT_RATE_LIMIT_TIERS.DDOS,\r\n} as const;\r\n\r\n/**\r\n * @deprecated Use createStandardRateLimiter() instead\r\n */\r\nexport const standardRateLimiter = createStandardRateLimiter();\r\n\r\n/**\r\n * @deprecated Use createStrictRateLimiter() instead\r\n */\r\nexport const strictRateLimiter = createStrictRateLimiter();\r\n\r\n/**\r\n * @deprecated Use createDdosRateLimiter() instead\r\n */\r\nexport const ddosProtectionLimiter = createDdosRateLimiter();\r\n\r\nexport default {\r\n // Factory functions\r\n createRateLimiter,\r\n createStandardRateLimiter,\r\n createStrictRateLimiter,\r\n createDdosRateLimiter,\r\n createApiRateLimiter,\r\n // Builder\r\n rateLimiter,\r\n RateLimiterBuilder,\r\n // Key generators\r\n defaultKeyGenerator,\r\n createPrefixedKeyGenerator,\r\n createUserKeyGenerator,\r\n createApiKeyGenerator,\r\n // Constants\r\n DEFAULT_RATE_LIMIT_TIERS,\r\n RATE_LIMIT_CONFIG,\r\n // Legacy\r\n standardRateLimiter,\r\n strictRateLimiter,\r\n ddosProtectionLimiter,\r\n};\r\n","// =============================================================================\r\n// Dynamic Server Configuration\r\n// Use this to create project-specific server configs\r\n// =============================================================================\r\n\r\n// =============================================================================\r\n// TYPES\r\n// =============================================================================\r\n\r\n/**\r\n * Environment type\r\n */\r\nexport type Environment = 'development' | 'production' | 'test' | 'staging';\r\n\r\n/**\r\n * Log level type\r\n */\r\nexport type LogLevel = 'error' | 'warn' | 'info' | 'http' | 'debug';\r\n\r\n/**\r\n * Server configuration interface\r\n */\r\nexport interface ServerConfig {\r\n /** Server name/identifier */\r\n name: string;\r\n /** Server version */\r\n version: string;\r\n /** Current environment */\r\n environment: Environment;\r\n /** Server port */\r\n port: number;\r\n /** Host binding */\r\n host: string;\r\n /** Base API path */\r\n basePath: string;\r\n /** Enable debug mode */\r\n debug: boolean;\r\n /** Trusted proxy settings */\r\n trustProxy: boolean | string | number;\r\n}\r\n\r\n/**\r\n * Database configuration interface\r\n */\r\nexport interface DatabaseConfig {\r\n /** MongoDB connection URI */\r\n uri: string;\r\n /** Database name */\r\n name: string;\r\n /** Max connection pool size */\r\n maxPoolSize: number;\r\n /** Min connection pool size */\r\n minPoolSize: number;\r\n /** Socket timeout in ms */\r\n socketTimeoutMS: number;\r\n /** Server selection timeout in ms */\r\n serverSelectionTimeoutMS: number;\r\n /** Max idle time in ms */\r\n maxIdleTimeMS: number;\r\n /** Enable retry writes */\r\n retryWrites: boolean;\r\n /** Enable retry reads */\r\n retryReads: boolean;\r\n /** Write concern */\r\n writeConcern: 'majority' | number;\r\n}\r\n\r\n/**\r\n * JWT/Auth configuration interface\r\n */\r\nexport interface AuthConfig {\r\n /** JWT secret key */\r\n jwtSecret: string;\r\n /** JWT expiration (e.g., '7d', '24h', '30m') */\r\n jwtExpiresIn: string;\r\n /** Refresh token expiration */\r\n refreshTokenExpiresIn: string;\r\n /** Enable refresh tokens */\r\n enableRefreshTokens: boolean;\r\n /** API key header name */\r\n apiKeyHeader: string;\r\n /** Organization header name */\r\n orgHeader: string;\r\n}\r\n\r\n/**\r\n * Logging configuration interface\r\n */\r\nexport interface LoggingConfig {\r\n /** Log level */\r\n level: LogLevel;\r\n /** Logs directory */\r\n logsDir: string;\r\n /** Max log file size */\r\n maxSize: string;\r\n /** Max days to keep logs */\r\n maxFiles: string;\r\n /** Max days to keep error logs */\r\n errorMaxFiles: string;\r\n /** Enable console logging */\r\n console: boolean;\r\n /** Enable file logging */\r\n file: boolean;\r\n /** Enable JSON format */\r\n json: boolean;\r\n}\r\n\r\n/**\r\n * CORS origins configuration\r\n */\r\nexport interface CorsOriginsConfig {\r\n /** Production domains */\r\n production: string[];\r\n /** Development domains */\r\n development: string[];\r\n /** Custom domain patterns (regex strings) */\r\n patterns: string[];\r\n}\r\n\r\n/**\r\n * Rate limit tier configuration\r\n */\r\nexport interface RateLimitTier {\r\n /** Window duration in ms */\r\n windowMs: number;\r\n /** Max requests in window */\r\n maxRequests: number;\r\n /** Error message */\r\n message: string;\r\n /** Skip successful requests */\r\n skipSuccessfulRequests?: boolean;\r\n /** Skip failed requests */\r\n skipFailedRequests?: boolean;\r\n}\r\n\r\n/**\r\n * Rate limiting configuration\r\n */\r\nexport interface RateLimitConfig {\r\n /** Enable rate limiting */\r\n enabled: boolean;\r\n /** Standard tier */\r\n standard: RateLimitTier;\r\n /** Strict tier (auth endpoints) */\r\n strict: RateLimitTier;\r\n /** DDoS protection tier */\r\n ddos: RateLimitTier;\r\n /** Custom tiers */\r\n custom?: Record<string, RateLimitTier>;\r\n}\r\n\r\n/**\r\n * Complete application configuration\r\n */\r\nexport interface AppConfig {\r\n server: ServerConfig;\r\n database: DatabaseConfig;\r\n auth: AuthConfig;\r\n logging: LoggingConfig;\r\n cors: CorsOriginsConfig;\r\n rateLimit: RateLimitConfig;\r\n /** Custom configuration */\r\n custom?: Record<string, unknown>;\r\n}\r\n\r\n// =============================================================================\r\n// DEFAULT CONFIGURATIONS\r\n// =============================================================================\r\n\r\n/**\r\n * Default server configuration\r\n */\r\nexport const DEFAULT_SERVER_CONFIG: ServerConfig = {\r\n name: 'app-server',\r\n version: '1.0.0',\r\n environment: (process.env.NODE_ENV as Environment) || 'development',\r\n port: parseInt(process.env.PORT || '3000', 10),\r\n host: process.env.HOST || '0.0.0.0',\r\n basePath: '/api',\r\n debug: process.env.DEBUG === 'true',\r\n trustProxy: true,\r\n};\r\n\r\n/**\r\n * Default database configuration\r\n */\r\nexport const DEFAULT_DATABASE_CONFIG: DatabaseConfig = {\r\n uri: process.env.DATABASE_URL || process.env.MONGODB_URI || '',\r\n name: process.env.DATABASE_NAME || 'app_db',\r\n maxPoolSize: process.env.NODE_ENV === 'production' ? 50 : 10,\r\n minPoolSize: process.env.NODE_ENV === 'production' ? 10 : 5,\r\n socketTimeoutMS: 45000,\r\n serverSelectionTimeoutMS: 10000,\r\n maxIdleTimeMS: 10000,\r\n retryWrites: true,\r\n retryReads: true,\r\n writeConcern: 'majority',\r\n};\r\n\r\n/**\r\n * Default auth configuration\r\n */\r\nexport const DEFAULT_AUTH_CONFIG: AuthConfig = {\r\n jwtSecret: process.env.JWT_SECRET || '',\r\n jwtExpiresIn: process.env.JWT_EXPIRES_IN || '7d',\r\n refreshTokenExpiresIn: process.env.REFRESH_TOKEN_EXPIRES_IN || '30d',\r\n enableRefreshTokens: true,\r\n apiKeyHeader: 'x-api-key',\r\n orgHeader: 'x-organization-id',\r\n};\r\n\r\n/**\r\n * Default logging configuration\r\n */\r\nexport const DEFAULT_LOGGING_CONFIG: LoggingConfig = {\r\n level: (process.env.LOG_LEVEL as LogLevel) || 'info',\r\n logsDir: process.env.LOGS_DIR || 'logs',\r\n maxSize: '20m',\r\n maxFiles: '14d',\r\n errorMaxFiles: '30d',\r\n console: true,\r\n file: process.env.NODE_ENV === 'production',\r\n json: process.env.NODE_ENV === 'production',\r\n};\r\n\r\n/**\r\n * Default CORS origins configuration\r\n */\r\nexport const DEFAULT_CORS_ORIGINS: CorsOriginsConfig = {\r\n production: [],\r\n development: [\r\n 'http://localhost:3000',\r\n 'http://localhost:4000',\r\n 'http://localhost:5173',\r\n 'http://127.0.0.1:3000',\r\n 'http://127.0.0.1:4000',\r\n 'http://127.0.0.1:5173',\r\n ],\r\n patterns: [],\r\n};\r\n\r\n/**\r\n * Default rate limit configuration\r\n */\r\nexport const DEFAULT_RATE_LIMIT_CONFIG: RateLimitConfig = {\r\n enabled: true,\r\n standard: {\r\n windowMs: 15 * 60 * 1000, // 15 minutes\r\n maxRequests: 100,\r\n message: 'Too many requests, please try again later.',\r\n },\r\n strict: {\r\n windowMs: 15 * 60 * 1000, // 15 minutes\r\n maxRequests: 20,\r\n message: 'Too many requests, please try again later.',\r\n },\r\n ddos: {\r\n windowMs: 60 * 1000, // 1 minute\r\n maxRequests: 60,\r\n message: 'Rate limit exceeded. Please slow down.',\r\n skipSuccessfulRequests: false,\r\n },\r\n};\r\n\r\n// =============================================================================\r\n// CONFIG BUILDER\r\n// =============================================================================\r\n\r\n/**\r\n * Create a deep merge of two objects\r\n */\r\nfunction deepMerge<T extends object>(target: T, source: Partial<T>): T {\r\n const result = { ...target } as T;\r\n \r\n for (const key in source) {\r\n if (Object.prototype.hasOwnProperty.call(source, key)) {\r\n const sourceValue = source[key as keyof T];\r\n const targetValue = target[key as keyof T];\r\n \r\n if (\r\n sourceValue !== undefined &&\r\n typeof sourceValue === 'object' &&\r\n sourceValue !== null &&\r\n !Array.isArray(sourceValue) &&\r\n typeof targetValue === 'object' &&\r\n targetValue !== null &&\r\n !Array.isArray(targetValue)\r\n ) {\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n (result as any)[key] = deepMerge(\r\n targetValue as object,\r\n sourceValue as object\r\n );\r\n } else if (sourceValue !== undefined) {\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n (result as any)[key] = sourceValue;\r\n }\r\n }\r\n }\r\n \r\n return result;\r\n}\r\n\r\n/**\r\n * Configuration builder for creating project-specific configs\r\n */\r\nexport class ConfigBuilder {\r\n private config: AppConfig;\r\n\r\n constructor() {\r\n this.config = {\r\n server: { ...DEFAULT_SERVER_CONFIG },\r\n database: { ...DEFAULT_DATABASE_CONFIG },\r\n auth: { ...DEFAULT_AUTH_CONFIG },\r\n logging: { ...DEFAULT_LOGGING_CONFIG },\r\n cors: { ...DEFAULT_CORS_ORIGINS },\r\n rateLimit: { ...DEFAULT_RATE_LIMIT_CONFIG },\r\n };\r\n }\r\n\r\n /**\r\n * Set server configuration\r\n */\r\n setServer(config: Partial<ServerConfig>): this {\r\n this.config.server = deepMerge(this.config.server, config);\r\n return this;\r\n }\r\n\r\n /**\r\n * Set database configuration\r\n */\r\n setDatabase(config: Partial<DatabaseConfig>): this {\r\n this.config.database = deepMerge(this.config.database, config);\r\n return this;\r\n }\r\n\r\n /**\r\n * Set auth configuration\r\n */\r\n setAuth(config: Partial<AuthConfig>): this {\r\n this.config.auth = deepMerge(this.config.auth, config);\r\n return this;\r\n }\r\n\r\n /**\r\n * Set logging configuration\r\n */\r\n setLogging(config: Partial<LoggingConfig>): this {\r\n this.config.logging = deepMerge(this.config.logging, config);\r\n return this;\r\n }\r\n\r\n /**\r\n * Set CORS origins\r\n */\r\n setCorsOrigins(config: Partial<CorsOriginsConfig>): this {\r\n this.config.cors = deepMerge(this.config.cors, config);\r\n return this;\r\n }\r\n\r\n /**\r\n * Add CORS production origin\r\n */\r\n addProductionOrigin(origin: string): this {\r\n if (!this.config.cors.production.includes(origin)) {\r\n this.config.cors.production.push(origin);\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Add CORS development origin\r\n */\r\n addDevelopmentOrigin(origin: string): this {\r\n if (!this.config.cors.development.includes(origin)) {\r\n this.config.cors.development.push(origin);\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Add CORS pattern\r\n */\r\n addCorsPattern(pattern: string): this {\r\n if (!this.config.cors.patterns.includes(pattern)) {\r\n this.config.cors.patterns.push(pattern);\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Set rate limit configuration\r\n */\r\n setRateLimit(config: Partial<RateLimitConfig>): this {\r\n this.config.rateLimit = deepMerge(this.config.rateLimit, config);\r\n return this;\r\n }\r\n\r\n /**\r\n * Add custom rate limit tier\r\n */\r\n addRateLimitTier(name: string, tier: RateLimitTier): this {\r\n if (!this.config.rateLimit.custom) {\r\n this.config.rateLimit.custom = {};\r\n }\r\n this.config.rateLimit.custom[name] = tier;\r\n return this;\r\n }\r\n\r\n /**\r\n * Set custom configuration\r\n */\r\n setCustom(key: string, value: unknown): this {\r\n if (!this.config.custom) {\r\n this.config.custom = {};\r\n }\r\n this.config.custom[key] = value;\r\n return this;\r\n }\r\n\r\n /**\r\n * Load configuration from environment variables\r\n */\r\n loadFromEnv(): this {\r\n // Server\r\n if (process.env.SERVER_NAME) this.config.server.name = process.env.SERVER_NAME;\r\n if (process.env.SERVER_VERSION) this.config.server.version = process.env.SERVER_VERSION;\r\n if (process.env.PORT) this.config.server.port = parseInt(process.env.PORT, 10);\r\n if (process.env.HOST) this.config.server.host = process.env.HOST;\r\n if (process.env.BASE_PATH) this.config.server.basePath = process.env.BASE_PATH;\r\n \r\n // Database\r\n if (process.env.DATABASE_URL) this.config.database.uri = process.env.DATABASE_URL;\r\n if (process.env.MONGODB_URI) this.config.database.uri = process.env.MONGODB_URI;\r\n if (process.env.DATABASE_NAME) this.config.database.name = process.env.DATABASE_NAME;\r\n \r\n // Auth\r\n if (process.env.JWT_SECRET) this.config.auth.jwtSecret = process.env.JWT_SECRET;\r\n if (process.env.JWT_EXPIRES_IN) this.config.auth.jwtExpiresIn = process.env.JWT_EXPIRES_IN;\r\n \r\n // Logging\r\n if (process.env.LOG_LEVEL) this.config.logging.level = process.env.LOG_LEVEL as LogLevel;\r\n if (process.env.LOGS_DIR) this.config.logging.logsDir = process.env.LOGS_DIR;\r\n \r\n // CORS origins from env (comma-separated)\r\n if (process.env.CORS_ORIGINS) {\r\n const origins = process.env.CORS_ORIGINS.split(',').map(o => o.trim());\r\n this.config.cors.production.push(...origins);\r\n }\r\n \r\n return this;\r\n }\r\n\r\n /**\r\n * Validate configuration\r\n */\r\n validate(): { valid: boolean; errors: string[] } {\r\n const errors: string[] = [];\r\n \r\n // Validate server config\r\n if (!this.config.server.name) errors.push('Server name is required');\r\n if (this.config.server.port < 1 || this.config.server.port > 65535) {\r\n errors.push('Server port must be between 1 and 65535');\r\n }\r\n \r\n // Validate auth config in production\r\n if (this.config.server.environment === 'production') {\r\n if (!this.config.auth.jwtSecret || this.config.auth.jwtSecret.length < 32) {\r\n errors.push('JWT secret must be at least 32 characters in production');\r\n }\r\n }\r\n \r\n return { valid: errors.length === 0, errors };\r\n }\r\n\r\n /**\r\n * Build the final configuration\r\n */\r\n build(): AppConfig {\r\n return { ...this.config };\r\n }\r\n}\r\n\r\n/**\r\n * Create a new configuration builder\r\n */\r\nexport const createConfig = (): ConfigBuilder => {\r\n return new ConfigBuilder();\r\n};\r\n\r\n/**\r\n * Create config from partial object\r\n */\r\nexport const buildConfig = (partial: Partial<AppConfig> = {}): AppConfig => {\r\n const builder = createConfig().loadFromEnv();\r\n \r\n if (partial.server) builder.setServer(partial.server);\r\n if (partial.database) builder.setDatabase(partial.database);\r\n if (partial.auth) builder.setAuth(partial.auth);\r\n if (partial.logging) builder.setLogging(partial.logging);\r\n if (partial.cors) builder.setCorsOrigins(partial.cors);\r\n if (partial.rateLimit) builder.setRateLimit(partial.rateLimit);\r\n \r\n return builder.build();\r\n};\r\n\r\n// =============================================================================\r\n// HELPERS\r\n// =============================================================================\r\n\r\n/**\r\n * Check if current environment is production\r\n */\r\nexport const isProduction = (config?: ServerConfig): boolean => {\r\n return (config?.environment || process.env.NODE_ENV) === 'production';\r\n};\r\n\r\n/**\r\n * Check if current environment is development\r\n */\r\nexport const isDevelopment = (config?: ServerConfig): boolean => {\r\n return (config?.environment || process.env.NODE_ENV) === 'development';\r\n};\r\n\r\n/**\r\n * Check if current environment is test\r\n */\r\nexport const isTest = (config?: ServerConfig): boolean => {\r\n return (config?.environment || process.env.NODE_ENV) === 'test';\r\n};\r\n\r\n/**\r\n * Get database options for mongoose connect\r\n */\r\nexport const getDatabaseOptions = (config: DatabaseConfig): Record<string, unknown> => {\r\n return {\r\n maxPoolSize: config.maxPoolSize,\r\n minPoolSize: config.minPoolSize,\r\n socketTimeoutMS: config.socketTimeoutMS,\r\n serverSelectionTimeoutMS: config.serverSelectionTimeoutMS,\r\n maxIdleTimeMS: config.maxIdleTimeMS,\r\n retryWrites: config.retryWrites,\r\n retryReads: config.retryReads,\r\n w: config.writeConcern,\r\n };\r\n};\r\n\r\nexport default {\r\n ConfigBuilder,\r\n createConfig,\r\n buildConfig,\r\n isProduction,\r\n isDevelopment,\r\n isTest,\r\n getDatabaseOptions,\r\n DEFAULT_SERVER_CONFIG,\r\n DEFAULT_DATABASE_CONFIG,\r\n DEFAULT_AUTH_CONFIG,\r\n DEFAULT_LOGGING_CONFIG,\r\n DEFAULT_CORS_ORIGINS,\r\n DEFAULT_RATE_LIMIT_CONFIG,\r\n};\r\n"]}
1
+ {"version":3,"sources":["../../src/server/enums/status.ts","../../src/server/response/response-object.ts","../../src/server/logger/winston-logger.ts","../../src/server/db/mongoose-connect.ts","../../src/server/middleware/auth.middleware.ts","../../src/server/middleware/queryParser.middleware.ts","../../src/server/middleware/utils/schemaMeta.util.ts","../../src/server/middleware/pagination.middleware.ts","../../src/server/middleware/crud.middleware.ts","../../src/server/middleware/bulkDelete.middleware.ts","../../src/server/utils/filter-builder.ts","../../src/server/utils/sanitize.ts","../../src/server/utils/packageCheck.ts","../../src/server/configs/cors.config.ts","../../src/server/configs/rate-limiter.config.ts","../../src/server/configs/server.config.ts"],"names":["StatusCode","StatusMessage","winston","DailyRotateFile","path","logger","mongoose","jwt","Types","Model","resolve","existsSync","readFileSync","rateLimit"],"mappings":"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","file":"index.js","sourcesContent":["/**\r\n * HTTP Status Codes\r\n * Standard HTTP status codes used across all projects\r\n */\r\nexport enum StatusCode {\r\n // Success\r\n SUCCESS = 200,\r\n CREATED = 201,\r\n ACCEPTED = 202,\r\n NO_CONTENT = 204,\r\n\r\n // Client Errors\r\n BAD_REQUEST = 400,\r\n UNAUTHORIZED = 401,\r\n FORBIDDEN = 403,\r\n NOT_FOUND = 404,\r\n CONFLICT = 409,\r\n UNPROCESSABLE_ENTITY = 422,\r\n TOO_MANY_REQUESTS = 429,\r\n\r\n // Server Errors\r\n INTERNAL_ERROR = 500,\r\n NOT_IMPLEMENTED = 501,\r\n BAD_GATEWAY = 502,\r\n SERVICE_UNAVAILABLE = 503,\r\n}\r\n\r\n/**\r\n * Status Messages\r\n * Human-readable status messages\r\n */\r\nexport enum StatusMessage {\r\n SUCCESS = 'success',\r\n CREATED = 'created',\r\n ACCEPTED = 'accepted',\r\n NO_CONTENT = 'no-data-found',\r\n BAD_REQUEST = 'bad-request',\r\n UNAUTHORIZED = 'unauthorized',\r\n FORBIDDEN = 'forbidden',\r\n NOT_FOUND = 'not-found',\r\n CONFLICT = 'conflict',\r\n UNPROCESSABLE_ENTITY = 'validation-error',\r\n TOO_MANY_REQUESTS = 'rate-limit-exceeded',\r\n INTERNAL_ERROR = 'error',\r\n NOT_IMPLEMENTED = 'not-implemented',\r\n BAD_GATEWAY = 'bad-gateway',\r\n SERVICE_UNAVAILABLE = 'service-unavailable',\r\n}\r\n\r\n// Legacy aliases for backward compatibility\r\nexport const statusCode = StatusCode;\r\nexport const statusMessage = StatusMessage;\r\n\r\nexport default {\r\n StatusCode,\r\n StatusMessage,\r\n statusCode,\r\n statusMessage,\r\n};\r\n","import type { Response } from 'express';\r\nimport { StatusCode, StatusMessage } from '../enums/status';\r\n\r\n/**\r\n * Standard API Response Interface\r\n */\r\nexport interface ApiResponse<T = unknown> {\r\n message: string;\r\n data: T | null;\r\n status: string;\r\n statusCode: number;\r\n paginationData?: PaginationData;\r\n columns?: ColumnMetadata[];\r\n}\r\n\r\n/**\r\n * Pagination Data Interface\r\n */\r\nexport interface PaginationData {\r\n total?: number;\r\n page?: number;\r\n limit?: number;\r\n totalPages?: number;\r\n hasNextPage?: boolean;\r\n hasPrevPage?: boolean;\r\n}\r\n\r\n/**\r\n * Column Metadata Interface (for dynamic tables)\r\n */\r\nexport interface ColumnMetadata {\r\n name: string;\r\n datatype: string;\r\n required: boolean;\r\n}\r\n\r\n/**\r\n * Extract column metadata from data array\r\n */\r\nexport const extractColumns = <T extends Record<string, unknown>>(\r\n data: T[]\r\n): ColumnMetadata[] => {\r\n if (!Array.isArray(data) || data.length === 0) {\r\n return [];\r\n }\r\n\r\n const sample = data[0];\r\n return Object.entries(sample).map(([key, value]) => {\r\n let datatype: string = typeof value;\r\n\r\n if (value === null) {\r\n datatype = 'null';\r\n } else if (Array.isArray(value)) {\r\n datatype = 'array';\r\n } else if (value instanceof Date) {\r\n datatype = 'date';\r\n } else if (typeof value === 'object') {\r\n datatype = 'object';\r\n }\r\n\r\n return {\r\n name: key,\r\n datatype,\r\n required: value !== null && value !== undefined,\r\n };\r\n });\r\n};\r\n\r\n/**\r\n * Success Response (200)\r\n */\r\nexport const successResponse = <T>(\r\n res: Response,\r\n data: T,\r\n message = 'Operation successful'\r\n): Response => {\r\n return res.status(StatusCode.SUCCESS).json({\r\n message,\r\n data,\r\n status: StatusMessage.SUCCESS,\r\n statusCode: StatusCode.SUCCESS,\r\n });\r\n};\r\n\r\n/**\r\n * Success Response with Array & Pagination (200)\r\n */\r\nexport const successResponseArr = <T>(\r\n res: Response,\r\n data: T[],\r\n paginationData: PaginationData = {},\r\n message = 'Operation successful'\r\n): Response => {\r\n return res.status(StatusCode.SUCCESS).json({\r\n message,\r\n data,\r\n columns: extractColumns(data as Record<string, unknown>[]),\r\n paginationData,\r\n status: StatusMessage.SUCCESS,\r\n statusCode: StatusCode.SUCCESS,\r\n });\r\n};\r\n\r\n/**\r\n * Created Response (201)\r\n */\r\nexport const createdResponse = <T>(\r\n res: Response,\r\n data: T,\r\n message = 'Resource created successfully'\r\n): Response => {\r\n return res.status(StatusCode.CREATED).json({\r\n message,\r\n data,\r\n status: StatusMessage.CREATED,\r\n statusCode: StatusCode.CREATED,\r\n });\r\n};\r\n\r\n/**\r\n * No Content Response (204 as 200 with message)\r\n */\r\nexport const noContentResponse = <T = null>(\r\n res: Response,\r\n data: T = null as T,\r\n message = 'No data found'\r\n): Response => {\r\n return res.status(StatusCode.SUCCESS).json({\r\n message,\r\n data,\r\n status: StatusMessage.NO_CONTENT,\r\n statusCode: StatusCode.NO_CONTENT,\r\n });\r\n};\r\n\r\n/**\r\n * Bad Request Response (400)\r\n */\r\nexport const badRequestResponse = (\r\n res: Response,\r\n message = 'Bad request',\r\n errors: unknown = null\r\n): Response => {\r\n return res.status(StatusCode.BAD_REQUEST).json({\r\n message,\r\n data: errors,\r\n status: StatusMessage.BAD_REQUEST,\r\n statusCode: StatusCode.BAD_REQUEST,\r\n });\r\n};\r\n\r\n/**\r\n * Unauthorized Response (401)\r\n */\r\nexport const unauthorizedResponse = (\r\n res: Response,\r\n message = 'Unauthorized access'\r\n): Response => {\r\n return res.status(StatusCode.UNAUTHORIZED).json({\r\n message,\r\n data: null,\r\n status: StatusMessage.UNAUTHORIZED,\r\n statusCode: StatusCode.UNAUTHORIZED,\r\n });\r\n};\r\n\r\n/**\r\n * Forbidden Response (403)\r\n */\r\nexport const forbiddenResponse = (\r\n res: Response,\r\n message = 'Access forbidden'\r\n): Response => {\r\n return res.status(StatusCode.FORBIDDEN).json({\r\n message,\r\n data: null,\r\n status: StatusMessage.FORBIDDEN,\r\n statusCode: StatusCode.FORBIDDEN,\r\n });\r\n};\r\n\r\n/**\r\n * Not Found Response (404)\r\n */\r\nexport const notFoundResponse = (\r\n res: Response,\r\n message = 'Resource not found'\r\n): Response => {\r\n return res.status(StatusCode.NOT_FOUND).json({\r\n message,\r\n data: null,\r\n status: StatusMessage.NOT_FOUND,\r\n statusCode: StatusCode.NOT_FOUND,\r\n });\r\n};\r\n\r\n/**\r\n * Conflict Response (409)\r\n */\r\nexport const conflictResponse = (\r\n res: Response,\r\n message = 'Resource conflict'\r\n): Response => {\r\n return res.status(StatusCode.CONFLICT).json({\r\n message,\r\n data: null,\r\n status: StatusMessage.CONFLICT,\r\n statusCode: StatusCode.CONFLICT,\r\n });\r\n};\r\n\r\n/**\r\n * Validation Error Response (422)\r\n */\r\nexport const validationErrorResponse = (\r\n res: Response,\r\n errors: unknown,\r\n message = 'Validation failed'\r\n): Response => {\r\n return res.status(StatusCode.UNPROCESSABLE_ENTITY).json({\r\n message,\r\n data: errors,\r\n status: StatusMessage.UNPROCESSABLE_ENTITY,\r\n statusCode: StatusCode.UNPROCESSABLE_ENTITY,\r\n });\r\n};\r\n\r\n/**\r\n * Error Response (500)\r\n */\r\nexport const errorResponse = (\r\n res: Response,\r\n error: unknown = null,\r\n message = 'Something went wrong'\r\n): Response => {\r\n return res.status(StatusCode.INTERNAL_ERROR).json({\r\n message,\r\n data: error,\r\n status: StatusMessage.INTERNAL_ERROR,\r\n statusCode: StatusCode.INTERNAL_ERROR,\r\n });\r\n};\r\n\r\n/**\r\n * Rate Limit Response (429)\r\n */\r\nexport const rateLimitResponse = (\r\n res: Response,\r\n message = 'Too many requests, please try again later'\r\n): Response => {\r\n return res.status(StatusCode.TOO_MANY_REQUESTS).json({\r\n message,\r\n data: null,\r\n status: StatusMessage.TOO_MANY_REQUESTS,\r\n statusCode: StatusCode.TOO_MANY_REQUESTS,\r\n });\r\n};\r\n\r\nexport default {\r\n successResponse,\r\n successResponseArr,\r\n createdResponse,\r\n noContentResponse,\r\n badRequestResponse,\r\n unauthorizedResponse,\r\n forbiddenResponse,\r\n notFoundResponse,\r\n conflictResponse,\r\n validationErrorResponse,\r\n errorResponse,\r\n rateLimitResponse,\r\n extractColumns,\r\n};\r\n","import winston from 'winston';\r\nimport DailyRotateFile from 'winston-daily-rotate-file';\r\nimport path from 'path';\r\n\r\n/**\r\n * Logger Configuration Options\r\n */\r\nexport interface LoggerConfig {\r\n level?: string;\r\n logsDir?: string;\r\n maxSize?: string;\r\n maxFiles?: string;\r\n errorMaxFiles?: string;\r\n}\r\n\r\n/**\r\n * Default logger configuration\r\n */\r\nconst defaultConfig: LoggerConfig = {\r\n level: process.env.LOG_LEVEL || 'info',\r\n logsDir: 'logs',\r\n maxSize: '20m',\r\n maxFiles: '14d',\r\n errorMaxFiles: '30d',\r\n};\r\n\r\n// Define log levels\r\nconst levels = {\r\n error: 0,\r\n warn: 1,\r\n info: 2,\r\n http: 3,\r\n debug: 4,\r\n};\r\n\r\n// Define colors for each level\r\nconst colors = {\r\n error: 'red',\r\n warn: 'yellow',\r\n info: 'green',\r\n http: 'magenta',\r\n debug: 'blue',\r\n};\r\n\r\nwinston.addColors(colors);\r\n\r\n// JSON format for file logs\r\nconst fileFormat = winston.format.combine(\r\n winston.format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }),\r\n winston.format.errors({ stack: true }),\r\n winston.format.splat(),\r\n winston.format.json()\r\n);\r\n\r\n// Colorized format for console\r\nconst consoleFormat = winston.format.combine(\r\n winston.format.colorize({ all: true }),\r\n winston.format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }),\r\n winston.format.printf((info) => {\r\n const timestamp = info.timestamp as string | undefined;\r\n const level = info.level as string;\r\n const message = info.message as string;\r\n const stack = info.stack as string | undefined;\r\n return `${timestamp} [${level}]: ${message}${stack ? '\\n' + stack : ''}`;\r\n })\r\n);\r\n\r\n/**\r\n * Create a configured Winston logger instance\r\n */\r\nexport const createLogger = (config: LoggerConfig = {}) => {\r\n const finalConfig = { ...defaultConfig, ...config };\r\n\r\n const transports: winston.transport[] = [\r\n // Console transport\r\n new winston.transports.Console({\r\n format: consoleFormat,\r\n }),\r\n\r\n // Combined logs (all levels)\r\n new DailyRotateFile({\r\n filename: path.join(finalConfig.logsDir!, 'combined-%DATE%.log'),\r\n datePattern: 'YYYY-MM-DD',\r\n maxSize: finalConfig.maxSize,\r\n maxFiles: finalConfig.maxFiles,\r\n format: fileFormat,\r\n }),\r\n\r\n // Error logs only\r\n new DailyRotateFile({\r\n filename: path.join(finalConfig.logsDir!, 'error-%DATE%.log'),\r\n datePattern: 'YYYY-MM-DD',\r\n level: 'error',\r\n maxSize: finalConfig.maxSize,\r\n maxFiles: finalConfig.errorMaxFiles,\r\n format: fileFormat,\r\n }),\r\n ];\r\n\r\n return winston.createLogger({\r\n level: finalConfig.level,\r\n levels,\r\n format: fileFormat,\r\n transports,\r\n exitOnError: false,\r\n });\r\n};\r\n\r\n// Default logger instance\r\nexport const logger = createLogger();\r\n\r\n/**\r\n * Create a stream for Morgan HTTP logger\r\n */\r\nexport const createMorganStream = (loggerInstance: winston.Logger) => ({\r\n write: (message: string) => {\r\n loggerInstance.http(message.trim());\r\n },\r\n});\r\n\r\nexport const stream = createMorganStream(logger);\r\n\r\n/**\r\n * Simple logger for development (no file output)\r\n */\r\nconst serializeMeta = (meta: unknown): string => {\r\n if (meta === undefined || meta === null) return '';\r\n if (meta instanceof Error) {\r\n return JSON.stringify({ message: meta.message, stack: meta.stack }, null, 2);\r\n }\r\n try {\r\n return JSON.stringify(meta, null, 2);\r\n } catch {\r\n return String(meta);\r\n }\r\n};\r\n\r\nexport const simpleLogger = {\r\n info: (message: string, meta?: unknown) => {\r\n console.log(`[INFO] ${message}`, serializeMeta(meta));\r\n },\r\n error: (message: string, meta?: unknown) => {\r\n console.error(`[ERROR] ${message}`, serializeMeta(meta));\r\n },\r\n warn: (message: string, meta?: unknown) => {\r\n console.warn(`[WARN] ${message}`, serializeMeta(meta));\r\n },\r\n debug: (message: string, meta?: unknown) => {\r\n console.debug(`[DEBUG] ${message}`, serializeMeta(meta));\r\n },\r\n};\r\n\r\nexport default logger;\r\n","import mongoose, { ConnectOptions } from 'mongoose';\r\n\r\n/**\r\n * Database Connection Options\r\n */\r\nexport interface DbConnectionOptions {\r\n maxPoolSize?: number;\r\n minPoolSize?: number;\r\n socketTimeoutMS?: number;\r\n serverSelectionTimeoutMS?: number;\r\n maxIdleTimeMS?: number;\r\n retryWrites?: boolean;\r\n retryReads?: boolean;\r\n w?: 'majority' | number;\r\n}\r\n\r\n/**\r\n * Default connection options\r\n */\r\nconst defaultOptions: DbConnectionOptions = {\r\n maxPoolSize: process.env.NODE_ENV === 'production' ? 50 : 10,\r\n minPoolSize: process.env.NODE_ENV === 'production' ? 10 : 5,\r\n socketTimeoutMS: 45000,\r\n serverSelectionTimeoutMS: 10000,\r\n maxIdleTimeMS: 10000,\r\n retryWrites: true,\r\n retryReads: true,\r\n w: 'majority',\r\n};\r\n\r\n/**\r\n * Connect to MongoDB with mongoose\r\n * @param mongoUri - MongoDB connection string\r\n * @param options - Connection options\r\n * @param logger - Optional logger instance\r\n */\r\nexport const connectDB = async (\r\n mongoUri: string,\r\n options: DbConnectionOptions = {},\r\n logger?: { info: (msg: string, meta?: unknown) => void; error: (msg: string, meta?: unknown) => void }\r\n): Promise<typeof mongoose> => {\r\n // Check if already connected\r\n if (mongoose.connection.readyState === 1) {\r\n logger?.info('Database already connected, reusing connection');\r\n return mongoose;\r\n }\r\n\r\n const finalOptions: ConnectOptions = { ...defaultOptions, ...options };\r\n\r\n try {\r\n await mongoose.connect(mongoUri, finalOptions);\r\n logger?.info('MongoDB connected successfully');\r\n\r\n // Handle connection events\r\n mongoose.connection.on('error', (err: Error) => {\r\n logger?.error('MongoDB connection error', err);\r\n });\r\n\r\n mongoose.connection.on('disconnected', () => {\r\n logger?.info('MongoDB disconnected');\r\n });\r\n\r\n mongoose.connection.on('reconnected', () => {\r\n logger?.info('MongoDB reconnected');\r\n });\r\n\r\n return mongoose;\r\n } catch (error) {\r\n const errorMessage = error instanceof Error ? error.message : String(error);\r\n logger?.error('MongoDB connection failed', { error: errorMessage });\r\n throw error;\r\n }\r\n};\r\n\r\n/**\r\n * Disconnect from MongoDB\r\n */\r\nexport const disconnectDB = async (\r\n logger?: { info: (msg: string) => void; error: (msg: string, meta?: unknown) => void }\r\n): Promise<void> => {\r\n try {\r\n await mongoose.disconnect();\r\n logger?.info('MongoDB disconnected successfully');\r\n } catch (error) {\r\n logger?.error('Error disconnecting from MongoDB', error);\r\n throw error;\r\n }\r\n};\r\n\r\n/**\r\n * Get connection status\r\n */\r\nexport const getConnectionStatus = (): string => {\r\n const states: Record<number, string> = {\r\n 0: 'disconnected',\r\n 1: 'connected',\r\n 2: 'connecting',\r\n 3: 'disconnecting',\r\n };\r\n return states[mongoose.connection.readyState] || 'unknown';\r\n};\r\n\r\nexport default {\r\n connectDB,\r\n disconnectDB,\r\n getConnectionStatus,\r\n};\r\n","import type { Request, Response, NextFunction } from 'express';\r\nimport jwt from 'jsonwebtoken';\r\nimport { unauthorizedResponse, forbiddenResponse } from '../response/response-object';\r\n\r\n/**\r\n * Extended Request with auth information\r\n */\r\nexport interface AuthRequest extends Request {\r\n userId?: string;\r\n organizationId?: string;\r\n apiKey?: { _id: string; name: string };\r\n user?: Record<string, unknown>;\r\n}\r\n\r\n/**\r\n * JWT Payload Interface\r\n */\r\nexport interface JWTPayload {\r\n userId: string;\r\n organizationId?: string;\r\n email?: string;\r\n role?: string;\r\n [key: string]: unknown;\r\n}\r\n\r\n/**\r\n * JWT Authentication Middleware\r\n * Validates Bearer token from Authorization header\r\n */\r\nexport const authenticateJWT = (secretKey: string) => {\r\n return (req: AuthRequest, res: Response, next: NextFunction): void => {\r\n const authHeader = req.headers.authorization;\r\n\r\n if (!authHeader || !authHeader.startsWith('Bearer ')) {\r\n unauthorizedResponse(res, 'Authorization header missing or malformed');\r\n return;\r\n }\r\n\r\n const token = authHeader.split(' ')[1];\r\n\r\n try {\r\n const decoded = jwt.verify(token, secretKey) as JWTPayload;\r\n\r\n req.userId = decoded.userId;\r\n req.organizationId = decoded.organizationId;\r\n req.user = decoded as Record<string, unknown>;\r\n\r\n if (!decoded.userId) {\r\n unauthorizedResponse(res, 'User ID not found in token');\r\n return;\r\n }\r\n\r\n next();\r\n } catch (err) {\r\n if (err instanceof jwt.TokenExpiredError) {\r\n unauthorizedResponse(res, 'Token has expired');\r\n return;\r\n }\r\n if (err instanceof jwt.JsonWebTokenError) {\r\n forbiddenResponse(res, 'Invalid token');\r\n return;\r\n }\r\n unauthorizedResponse(res, 'Token validation failed');\r\n }\r\n };\r\n};\r\n\r\n/**\r\n * Optional JWT Authentication Middleware\r\n * Validates token if present, but doesn't require it\r\n */\r\nexport const optionalAuthenticateJWT = (secretKey: string) => {\r\n return (req: AuthRequest, _res: Response, next: NextFunction): void => {\r\n const authHeader = req.headers.authorization;\r\n\r\n if (!authHeader || !authHeader.startsWith('Bearer ')) {\r\n next();\r\n return;\r\n }\r\n\r\n const token = authHeader.split(' ')[1];\r\n\r\n try {\r\n const decoded = jwt.verify(token, secretKey) as JWTPayload;\r\n req.userId = decoded.userId;\r\n req.organizationId = decoded.organizationId;\r\n req.user = decoded as Record<string, unknown>;\r\n } catch {\r\n // Token invalid, but continue without auth\r\n }\r\n\r\n next();\r\n };\r\n};\r\n\r\n/**\r\n * API Key Authentication Middleware\r\n * Validates x-api-key header\r\n */\r\nexport const authenticateApiKey = (\r\n validateKeyFn: (key: string) => Promise<{\r\n valid: boolean;\r\n organizationId?: string;\r\n keyId?: string;\r\n keyName?: string;\r\n }>\r\n) => {\r\n return async (req: AuthRequest, res: Response, next: NextFunction): Promise<void> => {\r\n try {\r\n const apiKey = req.headers['x-api-key'] as string;\r\n\r\n if (!apiKey) {\r\n unauthorizedResponse(res, 'API key is required. Please provide x-api-key header');\r\n return;\r\n }\r\n\r\n const validation = await validateKeyFn(apiKey);\r\n\r\n if (!validation.valid) {\r\n unauthorizedResponse(res, 'Invalid or inactive API key');\r\n return;\r\n }\r\n\r\n if (validation.organizationId) {\r\n req.organizationId = validation.organizationId;\r\n }\r\n if (validation.keyId && validation.keyName) {\r\n req.apiKey = {\r\n _id: validation.keyId,\r\n name: validation.keyName,\r\n };\r\n }\r\n\r\n next();\r\n } catch {\r\n unauthorizedResponse(res, 'API key validation failed');\r\n }\r\n };\r\n};\r\n\r\n/**\r\n * Organization Header Middleware\r\n * Extracts organization ID from x-organization-id header\r\n */\r\nexport const extractOrganization = (req: AuthRequest, _res: Response, next: NextFunction): void => {\r\n const orgId = req.headers['x-organization-id'] as string;\r\n\r\n if (orgId) {\r\n req.organizationId = orgId;\r\n }\r\n\r\n next();\r\n};\r\n\r\n/**\r\n * Require Organization Middleware\r\n * Ensures organizationId is present in request\r\n */\r\nexport const requireOrganization = (req: AuthRequest, res: Response, next: NextFunction): void => {\r\n if (!req.organizationId) {\r\n unauthorizedResponse(res, 'Organization ID is required');\r\n return;\r\n }\r\n next();\r\n};\r\n\r\nexport default {\r\n authenticateJWT,\r\n optionalAuthenticateJWT,\r\n authenticateApiKey,\r\n extractOrganization,\r\n requireOrganization,\r\n};\r\n","/**\r\n * Query Parser Middleware\r\n *\r\n * Parses query parameters into a standardized format for pagination and filtering.\r\n */\r\n\r\nimport { Request, Response, NextFunction } from 'express';\r\nimport type { ParsedQuery } from './types/pagination.types';\r\n\r\n/**\r\n * Parse query parameters from request\r\n * Supports:\r\n * - page, limit for pagination\r\n * - sort or sortBy/sortOrder for sorting\r\n * - search for text search\r\n * - filter object or direct query params for filtering\r\n */\r\nexport const queryParser = (req: Request, _: Response, next: NextFunction): void => {\r\n const { page, limit, sort, sortBy, sortOrder, search, filter, ...otherParams } = req.query;\r\n\r\n const parsed: ParsedQuery = {\r\n page: Math.max(Number(page) || 1, 1),\r\n limit: Math.min(Number(limit) || 10, 100),\r\n filter: {},\r\n };\r\n\r\n // Handle sort parameter (supports both \"field:order\" and separate sortBy/sortOrder)\r\n if (typeof sort === 'string') {\r\n const [field, order] = sort.split(':');\r\n parsed.sort = {\r\n field,\r\n order: order === 'asc' ? 'asc' : 'desc',\r\n };\r\n } else if (typeof sortBy === 'string') {\r\n parsed.sort = {\r\n field: sortBy,\r\n order: (sortOrder === 'asc' ? 'asc' : 'desc') as 'asc' | 'desc',\r\n };\r\n }\r\n\r\n if (typeof search === 'string') {\r\n parsed.search = search;\r\n }\r\n\r\n // Handle filter object\r\n if (typeof filter === 'object' && filter !== null) {\r\n Object.entries(filter).forEach(([key, value]) => {\r\n if (value !== 'all') {\r\n parsed.filter[key] = value as string;\r\n }\r\n });\r\n }\r\n\r\n // Handle additional filter parameters passed directly in query\r\n Object.entries(otherParams).forEach(([key, value]) => {\r\n if (\r\n typeof value === 'string' &&\r\n value !== 'all' &&\r\n !['page', 'limit', 'sort', 'sortBy', 'sortOrder', 'search'].includes(key)\r\n ) {\r\n parsed.filter[key] = value;\r\n }\r\n });\r\n\r\n req.parsedQuery = parsed;\r\n next();\r\n};\r\n\r\nexport default queryParser;\r\n","/**\r\n * Schema Meta Extraction Utility\r\n * Extracts column metadata from Mongoose models and Zod schemas\r\n */\r\n\r\nimport { Model } from 'mongoose';\r\n\r\n// Zod-compatible type definitions for optional peer dependency\r\ninterface ZodTypeAny {\r\n _def?: {\r\n typeName?: string;\r\n innerType?: ZodTypeAny;\r\n values?: unknown[];\r\n };\r\n}\r\n\r\ntype ZodObject<T = unknown> = {\r\n shape?: Record<string, ZodTypeAny>;\r\n parse: (data: unknown) => T;\r\n};\r\n\r\n/**\r\n * Column metadata interface\r\n */\r\nexport interface ColumnMeta {\r\n name: string;\r\n datatype: string;\r\n required: boolean;\r\n}\r\n\r\n/**\r\n * Get Zod type name\r\n */\r\nconst getZodTypeName = (schema: ZodTypeAny): string => {\r\n const typeName = schema._def?.typeName;\r\n\r\n switch (typeName) {\r\n case 'ZodString':\r\n return 'string';\r\n case 'ZodNumber':\r\n return 'number';\r\n case 'ZodBoolean':\r\n return 'boolean';\r\n case 'ZodDate':\r\n return 'date';\r\n case 'ZodArray':\r\n return 'array';\r\n case 'ZodObject':\r\n return 'object';\r\n case 'ZodOptional':\r\n case 'ZodNullable':\r\n return schema._def?.innerType ? getZodTypeName(schema._def.innerType) : 'unknown';\r\n case 'ZodDefault':\r\n return schema._def?.innerType ? getZodTypeName(schema._def.innerType) : 'unknown';\r\n case 'ZodEnum':\r\n return 'enum';\r\n case 'ZodUnion':\r\n return 'union';\r\n default:\r\n return 'unknown';\r\n }\r\n};\r\n\r\n/**\r\n * Check if Zod schema field is required\r\n */\r\nconst isZodRequired = (schema: ZodTypeAny): boolean => {\r\n const typeName = schema._def?.typeName;\r\n return typeName !== 'ZodOptional' && typeName !== 'ZodNullable';\r\n};\r\n\r\n/**\r\n * Extract column metadata from Mongoose model and optional Zod schema\r\n */\r\nexport const extractSchemaMeta = <T>(\r\n model: Model<T>,\r\n zodSchema?: ZodObject<unknown>\r\n): ColumnMeta[] => {\r\n const columns: ColumnMeta[] = [];\r\n\r\n // Extract from Zod schema if provided (preferred)\r\n if (zodSchema && zodSchema.shape) {\r\n const shape = zodSchema.shape;\r\n for (const [key, value] of Object.entries(shape)) {\r\n if (key.startsWith('_')) continue; // Skip internal fields\r\n\r\n columns.push({\r\n name: key,\r\n datatype: getZodTypeName(value as ZodTypeAny),\r\n required: isZodRequired(value as ZodTypeAny),\r\n });\r\n }\r\n return columns;\r\n }\r\n\r\n // Fallback: Extract from Mongoose schema\r\n try {\r\n const schema = model.schema;\r\n const paths = schema.paths;\r\n\r\n for (const [key, pathInfo] of Object.entries(paths)) {\r\n // Skip internal Mongoose fields\r\n if (key.startsWith('_') || key === '__v') continue;\r\n\r\n const schemaType = pathInfo as { instance?: string; isRequired?: boolean };\r\n\r\n columns.push({\r\n name: key,\r\n datatype: (schemaType.instance || 'unknown').toLowerCase(),\r\n required: schemaType.isRequired || false,\r\n });\r\n }\r\n } catch {\r\n // If schema extraction fails, return empty array\r\n }\r\n\r\n return columns;\r\n};\r\n\r\nexport default extractSchemaMeta;\r\n","/**\r\n * Query Pagination Middleware\r\n *\r\n * Provides standardized pagination for Mongoose models.\r\n * Works with queryParser middleware for parsed query parameters.\r\n */\r\n\r\nimport { Request, Response, NextFunction } from 'express';\r\nimport { Model, SortOrder } from 'mongoose';\r\n\r\n// Zod-compatible type definitions for optional peer dependency\r\ntype ZodObject<T = Record<string, unknown>> = {\r\n parse: (data: unknown) => T;\r\n safeParse: (data: unknown) => { success: boolean; data?: T; error?: Error };\r\n};\r\nimport { extractSchemaMeta } from './utils/schemaMeta.util';\r\n\r\ninterface PaginationOptions {\r\n searchFields?: string[];\r\n validatorSchema?: ZodObject<unknown>;\r\n regexFilterFields?: string[]; // Fields that should use regex matching for filters\r\n}\r\n\r\n/**\r\n * Creates a pagination middleware for a Mongoose model\r\n *\r\n * @param model - The Mongoose model to paginate\r\n * @param options - Pagination options\r\n * @param withOrgId - Whether to filter by organization ID from header\r\n */\r\nexport const queryPagination = <T>(\r\n model: Model<T>,\r\n options: PaginationOptions = {},\r\n withOrgId = true\r\n) => {\r\n return async (req: Request, res: Response, next: NextFunction): Promise<void> => {\r\n try {\r\n const { page, limit, sort, search, filter } = req.parsedQuery;\r\n\r\n const query: Record<string, unknown> = {};\r\n\r\n // Process filter values - apply regex for specified fields\r\n Object.entries(filter).forEach(([key, value]) => {\r\n if (options.regexFilterFields?.includes(key)) {\r\n // Use regex for partial matching\r\n query[key] = { $regex: value, $options: 'i' };\r\n } else {\r\n query[key] = value;\r\n }\r\n });\r\n\r\n // Add organization filter if x-organization-id header is present\r\n const organizationId = req.headers['x-organization-id'];\r\n if (organizationId && typeof organizationId === 'string' && withOrgId) {\r\n query.organizationId = organizationId;\r\n }\r\n\r\n if (search && options.searchFields?.length) {\r\n query.$or = options.searchFields.map(field => ({\r\n [field]: { $regex: search, $options: 'i' },\r\n }));\r\n }\r\n\r\n const sortQuery: Record<string, SortOrder> = sort\r\n ? { [sort.field]: sort.order }\r\n : { createdAt: 'desc' };\r\n\r\n const skip = (page - 1) * limit;\r\n\r\n const [data, total] = await Promise.all([\r\n model.find(query).sort(sortQuery).skip(skip).limit(limit),\r\n model.countDocuments(query),\r\n ]);\r\n\r\n res.paginatedResult = {\r\n data,\r\n meta: {\r\n page,\r\n limit,\r\n total,\r\n totalPages: Math.ceil(total / limit),\r\n },\r\n columns: extractSchemaMeta(model, options.validatorSchema),\r\n };\r\n\r\n next();\r\n } catch (error) {\r\n next(error);\r\n }\r\n };\r\n};\r\n\r\nexport default queryPagination;\r\n","/**\r\n * CRUD Middleware Factory\r\n *\r\n * High-configuration middleware for standardized CRUD operations.\r\n * Provides consistent API patterns across all services.\r\n *\r\n * Features:\r\n * - getAll with pagination, search, filters, sorting\r\n * - getById with validation\r\n * - create with validation and auto-response\r\n * - update with validation and auto-response\r\n * - delete (single and bulk)\r\n * - Organization-scoped queries\r\n */\r\n\r\nimport { Request, Response, NextFunction, RequestHandler } from 'express';\r\nimport { Model, Types, SortOrder, Document } from 'mongoose';\r\n\r\n// Zod-compatible type definitions for optional peer dependency\r\ninterface ZodIssue {\r\n path: (string | number)[];\r\n message: string;\r\n}\r\n\r\ninterface ZodError extends Error {\r\n errors: ZodIssue[];\r\n}\r\n\r\ninterface ZodSchema<T = unknown> {\r\n parse: (data: unknown) => T;\r\n safeParse: (data: unknown) => { success: boolean; data?: T; error?: ZodError };\r\n}\r\n\r\ntype ZodObject<T = Record<string, unknown>> = ZodSchema<T>;\r\n\r\n/**\r\n * Check if an error is a Zod validation error (duck typing)\r\n */\r\nconst isZodError = (error: unknown): error is ZodError => {\r\n return (\r\n error !== null &&\r\n typeof error === 'object' &&\r\n 'errors' in error &&\r\n Array.isArray((error as ZodError).errors)\r\n );\r\n};\r\nimport { logger } from '../logger';\r\nimport {\r\n successResponse,\r\n createdResponse,\r\n noContentResponse,\r\n badRequestResponse,\r\n notFoundResponse,\r\n errorResponse,\r\n} from '../response/response-object';\r\nimport { extractSchemaMeta } from './utils/schemaMeta.util';\r\nimport type { BulkDeleteRequest } from './bulkDelete.middleware';\r\n\r\n// ==================== Types ====================\r\n\r\n/**\r\n * Extended request with organization ID\r\n */\r\nexport interface OrgRequest extends Request {\r\n organizationId?: string;\r\n}\r\n\r\n/**\r\n * Extended response with paginated result\r\n */\r\nexport interface PaginatedResponse extends Response {\r\n paginatedResult?: {\r\n data: unknown[];\r\n meta: {\r\n page: number;\r\n limit: number;\r\n total: number;\r\n totalPages: number;\r\n };\r\n columns?: unknown[];\r\n };\r\n}\r\n\r\n/**\r\n * CRUD controller configuration\r\n */\r\nexport interface CrudConfig<T> {\r\n /** Mongoose model */\r\n model: Model<T>;\r\n /** Resource name for logging and messages */\r\n resourceName: string;\r\n /** Zod schema for create validation */\r\n createSchema?: ZodObject<unknown>;\r\n /** Zod schema for update validation */\r\n updateSchema?: ZodObject<unknown>;\r\n /** Fields to search on (for getAll) */\r\n searchFields?: string[];\r\n /** Fields that use regex matching for filters */\r\n regexFilterFields?: string[];\r\n /** Whether to scope by organizationId (default: true) */\r\n withOrganization?: boolean;\r\n /** Field to use as the organization reference (default: 'organizationId') */\r\n orgField?: string;\r\n /** Custom transform for create input */\r\n transformCreate?: (input: unknown, req: OrgRequest) => unknown;\r\n /** Custom transform for update input */\r\n transformUpdate?: (input: unknown, req: OrgRequest) => unknown;\r\n /** Custom post-create hook */\r\n afterCreate?: (doc: Document, req: OrgRequest) => Promise<void> | void;\r\n /** Custom post-update hook */\r\n afterUpdate?: (doc: Document, req: OrgRequest) => Promise<void> | void;\r\n /** Custom post-delete hook */\r\n afterDelete?: (id: string, req: OrgRequest) => Promise<void> | void;\r\n /** Fields to exclude from response */\r\n excludeFields?: string[];\r\n /** Fields to populate in queries */\r\n populateFields?: string[];\r\n /** Custom query builder for getAll */\r\n buildQuery?: (req: OrgRequest, baseQuery: Record<string, unknown>) => Record<string, unknown>;\r\n}\r\n\r\n// ==================== Helper Functions ====================\r\n\r\n/**\r\n * Get organization ID from request\r\n */\r\nconst getOrgId = (req: Request, orgField = 'organizationId'): string | undefined => {\r\n const orgReq = req as OrgRequest;\r\n return (\r\n orgReq.organizationId ||\r\n (req.headers['x-organization-id'] as string) ||\r\n (req.query[orgField] as string)\r\n );\r\n};\r\n\r\n/**\r\n * Build organization filter\r\n */\r\nconst buildOrgFilter = (req: Request, config: { withOrganization?: boolean; orgField?: string }): Record<string, unknown> => {\r\n const filter: Record<string, unknown> = {};\r\n\r\n if (config.withOrganization !== false) {\r\n const orgId = getOrgId(req, config.orgField);\r\n if (orgId) {\r\n filter[config.orgField || 'organizationId'] = orgId;\r\n }\r\n }\r\n\r\n return filter;\r\n};\r\n\r\n/**\r\n * Format Zod validation errors\r\n */\r\nconst formatZodError = (error: ZodError): string => {\r\n return error.errors.map((e: ZodIssue) => `${e.path.join('.')}: ${e.message}`).join(', ');\r\n};\r\n\r\n// ==================== Middleware Factory ====================\r\n\r\n/**\r\n * Creates standardized CRUD controller handlers\r\n */\r\nexport function createCrudControllers<T extends Document>(\r\n config: CrudConfig<T>\r\n): {\r\n getAll: RequestHandler;\r\n getById: RequestHandler;\r\n create: RequestHandler;\r\n update: RequestHandler;\r\n deleteOne: RequestHandler;\r\n bulkDelete: RequestHandler;\r\n} {\r\n const {\r\n model,\r\n resourceName,\r\n createSchema,\r\n updateSchema,\r\n searchFields = [],\r\n regexFilterFields = [],\r\n withOrganization = true,\r\n orgField = 'organizationId',\r\n transformCreate,\r\n transformUpdate,\r\n afterCreate,\r\n afterUpdate,\r\n afterDelete,\r\n excludeFields = [],\r\n populateFields = [],\r\n buildQuery,\r\n } = config;\r\n\r\n /**\r\n * GET /\r\n * Get all resources with pagination, search, filters, sorting\r\n */\r\n const getAll: RequestHandler = async (req, res, _next): Promise<void> => {\r\n try {\r\n const paginatedRes = res as PaginatedResponse;\r\n\r\n // If pagination middleware already ran, return its result\r\n if (paginatedRes.paginatedResult) {\r\n successResponse(res, paginatedRes.paginatedResult, `${resourceName} list fetched successfully`);\r\n return;\r\n }\r\n\r\n // Manual pagination if middleware didn't run\r\n const page = parseInt(req.query.page as string) || 1;\r\n const limit = parseInt(req.query.limit as string) || 10;\r\n const sortField = (req.query.sortBy as string) || 'createdAt';\r\n const sortOrder = ((req.query.sortOrder as string) || 'desc') as SortOrder;\r\n const search = req.query.search as string;\r\n\r\n let query: Record<string, unknown> = {};\r\n\r\n // Add organization filter\r\n if (withOrganization) {\r\n const orgId = getOrgId(req, orgField);\r\n if (orgId) {\r\n query[orgField] = orgId;\r\n }\r\n }\r\n\r\n // Add search filter\r\n if (search && searchFields.length > 0) {\r\n query.$or = searchFields.map((field) => ({\r\n [field]: { $regex: search, $options: 'i' },\r\n }));\r\n }\r\n\r\n // Add custom filters from query params\r\n const filterableParams = Object.keys(req.query).filter(\r\n (key) => !['page', 'limit', 'sortBy', 'sortOrder', 'search'].includes(key)\r\n );\r\n\r\n filterableParams.forEach((key) => {\r\n const value = req.query[key];\r\n if (value !== undefined && value !== '' && value !== 'all') {\r\n if (regexFilterFields.includes(key)) {\r\n query[key] = { $regex: value, $options: 'i' };\r\n } else {\r\n query[key] = value;\r\n }\r\n }\r\n });\r\n\r\n // Apply custom query builder if provided\r\n if (buildQuery) {\r\n query = buildQuery(req as OrgRequest, query);\r\n }\r\n\r\n const sortQuery: Record<string, SortOrder> = { [sortField]: sortOrder };\r\n const skip = (page - 1) * limit;\r\n\r\n // Build the query with projection\r\n let projection: Record<string, 0> = {};\r\n if (excludeFields.length > 0) {\r\n projection = excludeFields.reduce(\r\n (acc, field) => ({ ...acc, [field]: 0 }),\r\n {} as Record<string, 0>\r\n );\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n let dbQuery: any = model.find(query, projection);\r\n\r\n // Apply population if configured\r\n if (populateFields.length > 0) {\r\n populateFields.forEach((field) => {\r\n dbQuery = dbQuery.populate(field);\r\n });\r\n }\r\n\r\n const [data, total] = await Promise.all([\r\n dbQuery.sort(sortQuery).skip(skip).limit(limit),\r\n model.countDocuments(query),\r\n ]);\r\n\r\n successResponse(\r\n res,\r\n {\r\n data,\r\n meta: {\r\n page,\r\n limit,\r\n total,\r\n totalPages: Math.ceil(total / limit),\r\n },\r\n columns: extractSchemaMeta(model, createSchema),\r\n },\r\n `${resourceName} list fetched successfully`\r\n );\r\n } catch (error) {\r\n logger.error(`Error in getAll ${resourceName}`, {\r\n error: error instanceof Error ? error.message : 'Unknown error',\r\n });\r\n errorResponse(res, `Failed to fetch ${resourceName.toLowerCase()} list`);\r\n }\r\n };\r\n\r\n /**\r\n * GET /:id\r\n * Get single resource by ID\r\n */\r\n const getById: RequestHandler = async (req, res, _next): Promise<void> => {\r\n try {\r\n const { id } = req.params;\r\n\r\n if (!id || !Types.ObjectId.isValid(id)) {\r\n badRequestResponse(res, 'Invalid ID format');\r\n return;\r\n }\r\n\r\n const query: Record<string, unknown> = {\r\n _id: new Types.ObjectId(id),\r\n ...buildOrgFilter(req, { ...config, withOrganization, orgField }),\r\n };\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n let dbQuery: any = model.findOne(query);\r\n\r\n if (populateFields.length > 0) {\r\n populateFields.forEach((field) => {\r\n dbQuery = dbQuery.populate(field);\r\n });\r\n }\r\n\r\n const doc = await dbQuery;\r\n\r\n if (!doc) {\r\n notFoundResponse(res, `${resourceName} not found`);\r\n return;\r\n }\r\n\r\n successResponse(res, doc, `${resourceName} fetched successfully`);\r\n } catch (error) {\r\n logger.error(`Error in getById ${resourceName}`, {\r\n error: error instanceof Error ? error.message : 'Unknown error',\r\n id: req.params.id,\r\n });\r\n errorResponse(res, `Failed to fetch ${resourceName.toLowerCase()}`);\r\n }\r\n };\r\n\r\n /**\r\n * POST /\r\n * Create new resource\r\n */\r\n const create: RequestHandler = async (req, res, _next): Promise<void> => {\r\n try {\r\n let input = req.body;\r\n\r\n // Validate with Zod if schema provided\r\n if (createSchema) {\r\n try {\r\n input = createSchema.parse(input);\r\n } catch (error) {\r\n if (isZodError(error)) {\r\n badRequestResponse(res, formatZodError(error));\r\n return;\r\n }\r\n throw error;\r\n }\r\n }\r\n\r\n // Transform input if custom transformer provided\r\n if (transformCreate) {\r\n input = transformCreate(input, req as OrgRequest);\r\n }\r\n\r\n // Add organization ID\r\n if (withOrganization) {\r\n const orgId = getOrgId(req, orgField);\r\n if (orgId) {\r\n input[orgField] = orgId;\r\n }\r\n }\r\n\r\n const doc = new model(input);\r\n await doc.save();\r\n\r\n // Run post-create hook\r\n if (afterCreate) {\r\n await afterCreate(doc, req as OrgRequest);\r\n }\r\n\r\n logger.info(`${resourceName} created successfully`, {\r\n id: doc._id,\r\n [orgField]: input[orgField],\r\n });\r\n\r\n createdResponse(res, doc, `${resourceName} created successfully`);\r\n } catch (error) {\r\n logger.error(`Error in create ${resourceName}`, {\r\n error: error instanceof Error ? error.message : 'Unknown error',\r\n });\r\n\r\n // Handle duplicate key errors\r\n if ((error as { code?: number }).code === 11000) {\r\n badRequestResponse(res, `A ${resourceName.toLowerCase()} with this data already exists`);\r\n return;\r\n }\r\n\r\n errorResponse(res, `Failed to create ${resourceName.toLowerCase()}`);\r\n }\r\n };\r\n\r\n /**\r\n * PUT /:id\r\n * Update resource\r\n */\r\n const update: RequestHandler = async (req, res, _next): Promise<void> => {\r\n try {\r\n const { id } = req.params;\r\n\r\n if (!id || !Types.ObjectId.isValid(id)) {\r\n badRequestResponse(res, 'Invalid ID format');\r\n return;\r\n }\r\n\r\n let input = req.body;\r\n\r\n // Validate with Zod if schema provided\r\n if (updateSchema) {\r\n try {\r\n input = updateSchema.parse(input);\r\n } catch (error) {\r\n if (isZodError(error)) {\r\n badRequestResponse(res, formatZodError(error));\r\n return;\r\n }\r\n throw error;\r\n }\r\n }\r\n\r\n // Transform input if custom transformer provided\r\n if (transformUpdate) {\r\n input = transformUpdate(input, req as OrgRequest);\r\n }\r\n\r\n const query: Record<string, unknown> = {\r\n _id: new Types.ObjectId(id),\r\n ...buildOrgFilter(req, { ...config, withOrganization, orgField }),\r\n };\r\n\r\n const doc = await model.findOneAndUpdate(query, { $set: input }, { new: true });\r\n\r\n if (!doc) {\r\n notFoundResponse(res, `${resourceName} not found`);\r\n return;\r\n }\r\n\r\n // Run post-update hook\r\n if (afterUpdate) {\r\n await afterUpdate(doc, req as OrgRequest);\r\n }\r\n\r\n logger.info(`${resourceName} updated successfully`, { id });\r\n successResponse(res, doc, `${resourceName} updated successfully`);\r\n } catch (error) {\r\n logger.error(`Error in update ${resourceName}`, {\r\n error: error instanceof Error ? error.message : 'Unknown error',\r\n id: req.params.id,\r\n });\r\n errorResponse(res, `Failed to update ${resourceName.toLowerCase()}`);\r\n }\r\n };\r\n\r\n /**\r\n * DELETE /:id\r\n * Delete single resource\r\n */\r\n const deleteOne: RequestHandler = async (req, res, _next): Promise<void> => {\r\n try {\r\n const { id } = req.params;\r\n\r\n if (!id || !Types.ObjectId.isValid(id)) {\r\n badRequestResponse(res, 'Invalid ID format');\r\n return;\r\n }\r\n\r\n const query: Record<string, unknown> = {\r\n _id: new Types.ObjectId(id),\r\n ...buildOrgFilter(req, { ...config, withOrganization, orgField }),\r\n };\r\n\r\n const result = await model.deleteOne(query);\r\n\r\n if (result.deletedCount === 0) {\r\n notFoundResponse(res, `${resourceName} not found`);\r\n return;\r\n }\r\n\r\n // Run post-delete hook\r\n if (afterDelete) {\r\n await afterDelete(id, req as OrgRequest);\r\n }\r\n\r\n logger.info(`${resourceName} deleted successfully`, { id });\r\n noContentResponse(res, null, `${resourceName} deleted successfully`);\r\n } catch (error) {\r\n logger.error(`Error in delete ${resourceName}`, {\r\n error: error instanceof Error ? error.message : 'Unknown error',\r\n id: req.params.id,\r\n });\r\n errorResponse(res, `Failed to delete ${resourceName.toLowerCase()}`);\r\n }\r\n };\r\n\r\n /**\r\n * DELETE /bulk or DELETE /\r\n * Bulk delete resources\r\n */\r\n const bulkDelete: RequestHandler = async (req, res, _next): Promise<void> => {\r\n try {\r\n const bulkReq = req as BulkDeleteRequest;\r\n const { deleteIds = [], deleteAll = false } = bulkReq;\r\n\r\n const baseFilter = buildOrgFilter(req, { ...config, withOrganization, orgField });\r\n\r\n let filter: Record<string, unknown>;\r\n\r\n if (deleteAll) {\r\n filter = baseFilter;\r\n } else if (deleteIds.length > 0) {\r\n filter = {\r\n ...baseFilter,\r\n _id: { $in: deleteIds.map((id) => new Types.ObjectId(id)) },\r\n };\r\n } else {\r\n badRequestResponse(res, 'No IDs provided for deletion');\r\n return;\r\n }\r\n\r\n const result = await model.deleteMany(filter);\r\n\r\n // Run post-delete hooks\r\n if (afterDelete && deleteIds.length > 0) {\r\n await Promise.all(deleteIds.map((id) => afterDelete(id, req as OrgRequest)));\r\n }\r\n\r\n logger.info(`${resourceName}(s) bulk deleted successfully`, {\r\n deletedCount: result.deletedCount,\r\n deleteAll,\r\n });\r\n\r\n successResponse(\r\n res,\r\n { deletedCount: result.deletedCount },\r\n `${result.deletedCount} ${resourceName.toLowerCase()}(s) deleted successfully`\r\n );\r\n } catch (error) {\r\n logger.error(`Error in bulkDelete ${resourceName}`, {\r\n error: error instanceof Error ? error.message : 'Unknown error',\r\n });\r\n errorResponse(res, `Failed to delete ${resourceName.toLowerCase()}(s)`);\r\n }\r\n };\r\n\r\n return {\r\n getAll,\r\n getById,\r\n create,\r\n update,\r\n deleteOne,\r\n bulkDelete,\r\n };\r\n}\r\n\r\n/**\r\n * Creates a standardized pagination middleware for a model\r\n */\r\nexport function createPaginationMiddleware<T>(\r\n model: Model<T>,\r\n config: Partial<CrudConfig<T>> = {}\r\n): RequestHandler {\r\n const {\r\n searchFields = [],\r\n regexFilterFields = [],\r\n withOrganization = true,\r\n orgField = 'organizationId',\r\n } = config;\r\n\r\n return async (req: Request, res: Response, next: NextFunction): Promise<void> => {\r\n try {\r\n const page = parseInt(req.query.page as string) || 1;\r\n const limit = parseInt(req.query.limit as string) || 10;\r\n const sortField = (req.query.sortBy as string) || 'createdAt';\r\n const sortOrder = ((req.query.sortOrder as string) || 'desc') as SortOrder;\r\n const search = req.query.search as string;\r\n\r\n const query: Record<string, unknown> = {};\r\n\r\n // Add organization filter\r\n if (withOrganization) {\r\n const orgId = getOrgId(req, orgField);\r\n if (orgId) {\r\n query[orgField] = orgId;\r\n }\r\n }\r\n\r\n // Add search filter\r\n if (search && searchFields.length > 0) {\r\n query.$or = searchFields.map((field) => ({\r\n [field]: { $regex: search, $options: 'i' },\r\n }));\r\n }\r\n\r\n // Add other filters\r\n const filterableParams = Object.keys(req.query).filter(\r\n (key) => !['page', 'limit', 'sortBy', 'sortOrder', 'search'].includes(key)\r\n );\r\n\r\n filterableParams.forEach((key) => {\r\n const value = req.query[key];\r\n if (value !== undefined && value !== '' && value !== 'all') {\r\n if (regexFilterFields.includes(key)) {\r\n query[key] = { $regex: value, $options: 'i' };\r\n } else {\r\n query[key] = value;\r\n }\r\n }\r\n });\r\n\r\n const sortQuery: Record<string, SortOrder> = { [sortField]: sortOrder };\r\n const skip = (page - 1) * limit;\r\n\r\n const [data, total] = await Promise.all([\r\n model.find(query).sort(sortQuery).skip(skip).limit(limit),\r\n model.countDocuments(query),\r\n ]);\r\n\r\n const paginatedRes = res as PaginatedResponse;\r\n paginatedRes.paginatedResult = {\r\n data,\r\n meta: {\r\n page,\r\n limit,\r\n total,\r\n totalPages: Math.ceil(total / limit),\r\n },\r\n columns: extractSchemaMeta(model, config.createSchema),\r\n };\r\n\r\n next();\r\n } catch (error) {\r\n next(error);\r\n }\r\n };\r\n}\r\n\r\nexport default createCrudControllers;\r\n","/**\r\n * Bulk Delete Middleware\r\n *\r\n * Common delete middleware for all services.\r\n * Supports:\r\n * - ['*'] → delete all records\r\n * - ['id1', 'id2', ...] → delete multiple records\r\n * - Single ID deletion as subset of multiple\r\n */\r\n\r\nimport { Request, Response, NextFunction } from 'express';\r\nimport { Types } from 'mongoose';\r\nimport { badRequestResponse } from '../response/response-object';\r\nimport { logger } from '../logger';\r\n\r\n/**\r\n * Extended request interface with parsed delete IDs\r\n */\r\nexport interface BulkDeleteRequest extends Request {\r\n deleteIds?: string[];\r\n deleteAll?: boolean;\r\n}\r\n\r\n/**\r\n * Validates and parses bulk delete request body\r\n *\r\n * Expected request body formats:\r\n * - { \"ids\": [\"*\"] } or [\"*\"] → delete all\r\n * - { \"ids\": [\"id1\", \"id2\"] } or [\"id1\", \"id2\"] → delete specific records\r\n */\r\nexport const parseBulkDelete = (\r\n req: Request,\r\n res: Response,\r\n next: NextFunction\r\n): void | Response => {\r\n try {\r\n const bulkReq = req as BulkDeleteRequest;\r\n\r\n // Get IDs from body - support both { ids: [...] } and [...] formats\r\n let ids: unknown[] = [];\r\n\r\n if (Array.isArray(req.body)) {\r\n ids = req.body;\r\n } else if (req.body && Array.isArray(req.body.ids)) {\r\n ids = req.body.ids;\r\n } else if (req.body && typeof req.body === 'object') {\r\n // Check for data property (common pattern)\r\n if (Array.isArray(req.body.data)) {\r\n ids = req.body.data;\r\n }\r\n }\r\n\r\n // Validate that we have IDs\r\n if (ids.length === 0) {\r\n return badRequestResponse(\r\n res,\r\n 'Request body must contain an array of IDs. Use [\"*\"] to delete all records or [\"id1\", \"id2\"] to delete specific records.'\r\n );\r\n }\r\n\r\n // Check for delete all\r\n if (ids.length === 1 && ids[0] === '*') {\r\n bulkReq.deleteAll = true;\r\n bulkReq.deleteIds = [];\r\n logger.info('Bulk delete: Deleting all records');\r\n return next();\r\n }\r\n\r\n // Validate all IDs are valid MongoDB ObjectIds\r\n const validIds: string[] = [];\r\n const invalidIds: unknown[] = [];\r\n\r\n for (const id of ids) {\r\n if (typeof id === 'string' && Types.ObjectId.isValid(id)) {\r\n validIds.push(id);\r\n } else {\r\n invalidIds.push(id);\r\n }\r\n }\r\n\r\n if (invalidIds.length > 0) {\r\n return badRequestResponse(\r\n res,\r\n `Invalid ID format(s): ${invalidIds.slice(0, 5).join(', ')}${invalidIds.length > 5 ? '...' : ''}. All IDs must be valid MongoDB ObjectIds.`\r\n );\r\n }\r\n\r\n if (validIds.length === 0) {\r\n return badRequestResponse(res, 'No valid IDs provided for deletion.');\r\n }\r\n\r\n bulkReq.deleteAll = false;\r\n bulkReq.deleteIds = validIds;\r\n logger.info(`Bulk delete: Deleting ${validIds.length} record(s)`);\r\n\r\n next();\r\n } catch (error) {\r\n logger.error('Error in parseBulkDelete middleware', error);\r\n return badRequestResponse(res, 'Failed to parse delete request');\r\n }\r\n};\r\n\r\n/**\r\n * Helper function to build delete filter for MongoDB\r\n */\r\nexport const buildDeleteFilter = (\r\n req: BulkDeleteRequest,\r\n organizationId: string\r\n): Record<string, unknown> => {\r\n const filter: Record<string, unknown> = {\r\n organizationId: new Types.ObjectId(organizationId),\r\n };\r\n\r\n if (!req.deleteAll && req.deleteIds && req.deleteIds.length > 0) {\r\n filter._id = {\r\n $in: req.deleteIds.map((id) => new Types.ObjectId(id)),\r\n };\r\n }\r\n\r\n return filter;\r\n};\r\n\r\n/**\r\n * Generic bulk delete handler factory\r\n *\r\n * Creates a controller function that handles bulk delete operations\r\n * for any Mongoose model.\r\n */\r\nexport const createBulkDeleteHandler = (\r\n Model: { deleteMany: (filter: Record<string, unknown>) => Promise<{ deletedCount?: number }> },\r\n modelName: string\r\n) => {\r\n return async (req: Request, res: Response): Promise<Response> => {\r\n const bulkReq = req as BulkDeleteRequest;\r\n const organizationId = req.headers['x-organization-id'] as string;\r\n\r\n if (!organizationId) {\r\n return badRequestResponse(res, 'Organization ID is required');\r\n }\r\n\r\n try {\r\n const filter = buildDeleteFilter(bulkReq, organizationId);\r\n const result = await Model.deleteMany(filter);\r\n\r\n const deletedCount = result.deletedCount || 0;\r\n\r\n logger.info(`Bulk delete completed: ${deletedCount} ${modelName}(s) deleted`, {\r\n organizationId,\r\n deleteAll: bulkReq.deleteAll,\r\n requestedIds: bulkReq.deleteIds?.length || 'all',\r\n deletedCount,\r\n });\r\n\r\n return res.status(200).json({\r\n message: `Successfully deleted ${deletedCount} ${modelName}(s)`,\r\n data: {\r\n deletedCount,\r\n deleteAll: bulkReq.deleteAll,\r\n },\r\n status: 'success',\r\n statusCode: 200,\r\n });\r\n } catch (error) {\r\n logger.error(`Error in bulk delete ${modelName}`, error);\r\n return res.status(500).json({\r\n message: `Failed to delete ${modelName}(s)`,\r\n data: null,\r\n status: 'error',\r\n statusCode: 500,\r\n });\r\n }\r\n };\r\n};\r\n\r\nexport default {\r\n parseBulkDelete,\r\n buildDeleteFilter,\r\n createBulkDeleteHandler,\r\n};\r\n","/**\r\n * Filter Builder Options\r\n */\r\nexport interface FilterOptions {\r\n organizationId?: string;\r\n search?: string;\r\n searchFields?: string[];\r\n dateField?: string;\r\n startDate?: string;\r\n endDate?: string;\r\n status?: string;\r\n isActive?: boolean;\r\n [key: string]: unknown;\r\n}\r\n\r\n/**\r\n * Pagination Options\r\n */\r\nexport interface PaginationOptions {\r\n page?: number;\r\n limit?: number;\r\n defaultLimit?: number;\r\n maxLimit?: number;\r\n}\r\n\r\n/**\r\n * Pagination Result\r\n */\r\nexport interface PaginationResult {\r\n skip: number;\r\n limit: number;\r\n page: number;\r\n}\r\n\r\n/**\r\n * Build MongoDB filter query dynamically\r\n */\r\nexport const buildFilter = (options: FilterOptions): Record<string, unknown> => {\r\n const {\r\n organizationId,\r\n search,\r\n searchFields = [],\r\n dateField = 'createdAt',\r\n startDate,\r\n endDate,\r\n status,\r\n isActive,\r\n ...additionalFilters\r\n } = options;\r\n\r\n const filter: Record<string, unknown> = {};\r\n\r\n // Add organizationId if provided\r\n if (organizationId) {\r\n filter.organizationId = organizationId;\r\n }\r\n\r\n // Handle text search with regex (min 2 characters)\r\n if (search && search.trim().length >= 2 && searchFields.length > 0) {\r\n const searchRegex = new RegExp(search.trim(), 'i');\r\n filter.$or = searchFields.map((field) => ({ [field]: searchRegex }));\r\n }\r\n\r\n // Handle date range filtering\r\n if (startDate || endDate) {\r\n filter[dateField] = {};\r\n if (startDate) {\r\n (filter[dateField] as Record<string, unknown>).$gte = new Date(startDate);\r\n }\r\n if (endDate) {\r\n (filter[dateField] as Record<string, unknown>).$lte = new Date(endDate);\r\n }\r\n }\r\n\r\n // Handle status filter\r\n if (status !== undefined) {\r\n filter.status = status;\r\n }\r\n\r\n // Handle isActive filter\r\n if (isActive !== undefined) {\r\n filter.isActive = isActive;\r\n }\r\n\r\n // Add any additional filters\r\n Object.entries(additionalFilters).forEach(([key, value]) => {\r\n if (value !== undefined && value !== null && value !== '') {\r\n filter[key] = value;\r\n }\r\n });\r\n\r\n return filter;\r\n};\r\n\r\n/**\r\n * Calculate pagination values\r\n */\r\nexport const buildPagination = (options: PaginationOptions): PaginationResult => {\r\n const { page = 1, limit, defaultLimit = 10, maxLimit = 100 } = options;\r\n\r\n const finalPage = Math.max(1, page);\r\n const finalLimit = Math.min(maxLimit, Math.max(1, limit || defaultLimit));\r\n const skip = (finalPage - 1) * finalLimit;\r\n\r\n return {\r\n skip,\r\n limit: finalLimit,\r\n page: finalPage,\r\n };\r\n};\r\n\r\n/**\r\n * Calculate pagination metadata for response\r\n */\r\nexport const buildPaginationMeta = (\r\n total: number,\r\n page: number,\r\n limit: number\r\n): {\r\n total: number;\r\n page: number;\r\n limit: number;\r\n totalPages: number;\r\n hasNextPage: boolean;\r\n hasPrevPage: boolean;\r\n} => {\r\n const totalPages = Math.ceil(total / limit);\r\n\r\n return {\r\n total,\r\n page,\r\n limit,\r\n totalPages,\r\n hasNextPage: page < totalPages,\r\n hasPrevPage: page > 1,\r\n };\r\n};\r\n\r\nexport default {\r\n buildFilter,\r\n buildPagination,\r\n buildPaginationMeta,\r\n};\r\n","/**\r\n * Sanitize user object by removing sensitive fields\r\n */\r\nexport const sanitizeUser = <T extends Record<string, unknown>>(\r\n user: T | null | undefined,\r\n additionalFieldsToRemove: string[] = []\r\n): Omit<T, 'password' | '__v' | '_id'> | null => {\r\n if (!user) return null;\r\n\r\n const fieldsToRemove = ['password', '__v', '_id', ...additionalFieldsToRemove];\r\n\r\n // Handle mongoose documents\r\n const obj = typeof (user as any).toObject === 'function' \r\n ? (user as any).toObject() \r\n : { ...user };\r\n\r\n fieldsToRemove.forEach((field) => {\r\n delete obj[field];\r\n });\r\n\r\n return obj;\r\n};\r\n\r\n/**\r\n * Sanitize document by removing specified fields\r\n */\r\nexport const sanitizeDocument = <T extends Record<string, unknown>>(\r\n doc: T | null | undefined,\r\n fieldsToRemove: string[]\r\n): Partial<T> | null => {\r\n if (!doc) return null;\r\n\r\n // Handle mongoose documents\r\n const obj = typeof (doc as any).toObject === 'function' \r\n ? (doc as any).toObject() \r\n : { ...doc };\r\n\r\n fieldsToRemove.forEach((field) => {\r\n delete obj[field];\r\n });\r\n\r\n return obj;\r\n};\r\n\r\n/**\r\n * Pick specific fields from an object\r\n */\r\nexport const pickFields = <T extends Record<string, unknown>>(\r\n obj: T | null | undefined,\r\n fieldsToPick: (keyof T)[]\r\n): Partial<T> | null => {\r\n if (!obj) return null;\r\n\r\n const result: Partial<T> = {};\r\n\r\n fieldsToPick.forEach((field) => {\r\n if (field in obj) {\r\n result[field] = obj[field];\r\n }\r\n });\r\n\r\n return result;\r\n};\r\n\r\n/**\r\n * Omit specific fields from an object\r\n */\r\nexport const omitFields = <T extends Record<string, unknown>, K extends keyof T>(\r\n obj: T | null | undefined,\r\n fieldsToOmit: K[]\r\n): Omit<T, K> | null => {\r\n if (!obj) return null;\r\n\r\n const result = { ...obj };\r\n\r\n fieldsToOmit.forEach((field) => {\r\n delete result[field];\r\n });\r\n\r\n return result as Omit<T, K>;\r\n};\r\n\r\nexport default {\r\n sanitizeUser,\r\n sanitizeDocument,\r\n pickFields,\r\n omitFields,\r\n};\r\n","/**\r\n * Package Check Utility - Server/Node.js Version\r\n * Analyzes package.json dependencies and checks for updates\r\n * \r\n * This version supports reading from file paths using Node.js fs\r\n */\r\nimport { readFileSync, existsSync } from 'fs';\r\nimport { resolve } from 'path';\r\n\r\nexport interface PackageVersion {\r\n name: string;\r\n current: string;\r\n latest: string;\r\n hasUpdate: boolean;\r\n updateType: 'major' | 'minor' | 'patch' | 'prerelease' | 'none';\r\n dependencyType: 'dependencies' | 'devDependencies' | 'peerDependencies' | 'optionalDependencies';\r\n}\r\n\r\nexport interface PackageCheckResult {\r\n packageName: string;\r\n packageVersion: string;\r\n totalDependencies: number;\r\n outdatedCount: number;\r\n dependencies: PackageVersion[];\r\n byType: {\r\n dependencies: PackageVersion[];\r\n devDependencies: PackageVersion[];\r\n peerDependencies: PackageVersion[];\r\n optionalDependencies: PackageVersion[];\r\n };\r\n byUpdateType: {\r\n major: PackageVersion[];\r\n minor: PackageVersion[];\r\n patch: PackageVersion[];\r\n prerelease: PackageVersion[];\r\n };\r\n checkedAt: Date;\r\n errors: string[];\r\n}\r\n\r\nexport interface PackageJson {\r\n name?: string;\r\n version?: string;\r\n dependencies?: Record<string, string>;\r\n devDependencies?: Record<string, string>;\r\n peerDependencies?: Record<string, string>;\r\n optionalDependencies?: Record<string, string>;\r\n}\r\n\r\n/**\r\n * Parse version string, removing range operators\r\n */\r\nfunction parseVersion(version: string): string {\r\n return version.replace(/[\\^~>=<|*x\\s]/g, '').split(' ')[0] || '0.0.0';\r\n}\r\n\r\n/**\r\n * Compare two semver versions\r\n */\r\nfunction compareVersions(current: string, latest: string): 'major' | 'minor' | 'patch' | 'prerelease' | 'none' {\r\n const currentClean = parseVersion(current);\r\n const latestClean = parseVersion(latest);\r\n\r\n if (currentClean === latestClean) return 'none';\r\n\r\n const [curMajor, curMinor, curPatch] = currentClean.split('.').map(Number);\r\n const [latMajor, latMinor, latPatch] = latestClean.split('.').map(Number);\r\n\r\n if (latest.includes('-')) return 'prerelease';\r\n if (latMajor > curMajor) return 'major';\r\n if (latMinor > curMinor) return 'minor';\r\n if (latPatch > curPatch) return 'patch';\r\n\r\n return 'none';\r\n}\r\n\r\n/**\r\n * Fetch latest version from npm registry\r\n */\r\nasync function fetchLatestVersion(packageName: string): Promise<string | null> {\r\n try {\r\n const encodedName = packageName.startsWith('@')\r\n ? `@${encodeURIComponent(packageName.slice(1))}`\r\n : encodeURIComponent(packageName);\r\n\r\n const response = await fetch(`https://registry.npmjs.org/${encodedName}`);\r\n\r\n if (!response.ok) return null;\r\n\r\n const data = await response.json();\r\n return data['dist-tags']?.latest || null;\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\n/**\r\n * Load package.json from file path, URL, or object\r\n */\r\nasync function loadPackageJson(source: string | PackageJson): Promise<PackageJson> {\r\n if (typeof source === 'object') {\r\n return source;\r\n }\r\n\r\n // URL\r\n if (source.startsWith('http://') || source.startsWith('https://')) {\r\n const response = await fetch(source);\r\n if (!response.ok) {\r\n throw new Error(`Failed to fetch: ${response.status}`);\r\n }\r\n return response.json() as Promise<PackageJson>;\r\n }\r\n\r\n // File path\r\n const filePath = resolve(source);\r\n if (!existsSync(filePath)) {\r\n throw new Error(`File not found: ${filePath}`);\r\n }\r\n\r\n const content = readFileSync(filePath, 'utf-8');\r\n return JSON.parse(content) as PackageJson;\r\n}\r\n\r\n/**\r\n * Check dependencies\r\n */\r\nasync function checkDeps(\r\n deps: Record<string, string> | undefined,\r\n type: PackageVersion['dependencyType'],\r\n errors: string[]\r\n): Promise<PackageVersion[]> {\r\n if (!deps) return [];\r\n\r\n const results: PackageVersion[] = [];\r\n const entries = Object.entries(deps);\r\n\r\n const concurrencyLimit = 10;\r\n for (let i = 0; i < entries.length; i += concurrencyLimit) {\r\n const batch = entries.slice(i, i + concurrencyLimit);\r\n const batchResults = await Promise.all(\r\n batch.map(async ([name, currentVersion]) => {\r\n try {\r\n const latest = await fetchLatestVersion(name);\r\n\r\n if (!latest) {\r\n errors.push(`Could not fetch: ${name}`);\r\n return {\r\n name,\r\n current: currentVersion,\r\n latest: 'unknown',\r\n hasUpdate: false,\r\n updateType: 'none' as const,\r\n dependencyType: type,\r\n };\r\n }\r\n\r\n const updateType = compareVersions(currentVersion, latest);\r\n\r\n return {\r\n name,\r\n current: currentVersion,\r\n latest,\r\n hasUpdate: updateType !== 'none',\r\n updateType,\r\n dependencyType: type,\r\n };\r\n } catch (err) {\r\n errors.push(`Error: ${name} - ${err}`);\r\n return {\r\n name,\r\n current: currentVersion,\r\n latest: 'error',\r\n hasUpdate: false,\r\n updateType: 'none' as const,\r\n dependencyType: type,\r\n };\r\n }\r\n })\r\n );\r\n results.push(...batchResults);\r\n }\r\n\r\n return results;\r\n}\r\n\r\n/**\r\n * Check package.json for outdated dependencies\r\n * \r\n * @example\r\n * // From file path\r\n * const result = await checkPackageServer('./package.json');\r\n * \r\n * @example\r\n * // From URL\r\n * const result = await checkPackageServer('https://raw.githubusercontent.com/user/repo/main/package.json');\r\n */\r\nexport async function checkPackageServer(\r\n source: string | PackageJson\r\n): Promise<PackageCheckResult> {\r\n const errors: string[] = [];\r\n const pkg = await loadPackageJson(source);\r\n\r\n const [dependencies, devDependencies, peerDependencies, optionalDependencies] =\r\n await Promise.all([\r\n checkDeps(pkg.dependencies, 'dependencies', errors),\r\n checkDeps(pkg.devDependencies, 'devDependencies', errors),\r\n checkDeps(pkg.peerDependencies, 'peerDependencies', errors),\r\n checkDeps(pkg.optionalDependencies, 'optionalDependencies', errors),\r\n ]);\r\n\r\n const allDeps = [...dependencies, ...devDependencies, ...peerDependencies, ...optionalDependencies];\r\n\r\n return {\r\n packageName: pkg.name || 'unknown',\r\n packageVersion: pkg.version || '0.0.0',\r\n totalDependencies: allDeps.length,\r\n outdatedCount: allDeps.filter((d) => d.hasUpdate).length,\r\n dependencies: allDeps,\r\n byType: { dependencies, devDependencies, peerDependencies, optionalDependencies },\r\n byUpdateType: {\r\n major: allDeps.filter((d) => d.updateType === 'major'),\r\n minor: allDeps.filter((d) => d.updateType === 'minor'),\r\n patch: allDeps.filter((d) => d.updateType === 'patch'),\r\n prerelease: allDeps.filter((d) => d.updateType === 'prerelease'),\r\n },\r\n checkedAt: new Date(),\r\n errors,\r\n };\r\n}\r\n\r\n/**\r\n * Format result as colored console output\r\n */\r\nexport function formatPackageCheckResult(result: PackageCheckResult): string {\r\n const lines: string[] = [];\r\n\r\n lines.push(`\\n📦 Package: ${result.packageName}@${result.packageVersion}`);\r\n lines.push(`📅 Checked: ${result.checkedAt.toISOString()}`);\r\n lines.push(`📊 Total: ${result.totalDependencies} | Outdated: ${result.outdatedCount}\\n`);\r\n\r\n const formatDep = (d: PackageVersion) => ` ${d.name.padEnd(35)} ${d.current.padEnd(15)} → ${d.latest}`;\r\n\r\n if (result.byUpdateType.major.length > 0) {\r\n lines.push('🔴 MAJOR Updates:');\r\n result.byUpdateType.major.forEach((d) => lines.push(formatDep(d)));\r\n lines.push('');\r\n }\r\n\r\n if (result.byUpdateType.minor.length > 0) {\r\n lines.push('🟡 MINOR Updates:');\r\n result.byUpdateType.minor.forEach((d) => lines.push(formatDep(d)));\r\n lines.push('');\r\n }\r\n\r\n if (result.byUpdateType.patch.length > 0) {\r\n lines.push('🟢 PATCH Updates:');\r\n result.byUpdateType.patch.forEach((d) => lines.push(formatDep(d)));\r\n lines.push('');\r\n }\r\n\r\n if (result.errors.length > 0) {\r\n lines.push('⚠️ Errors:');\r\n result.errors.forEach((e) => lines.push(` ${e}`));\r\n }\r\n\r\n return lines.join('\\n');\r\n}\r\n\r\n/**\r\n * Generate ncu command\r\n */\r\nexport function generateNcuCommand(\r\n result: PackageCheckResult,\r\n options: { updateType?: 'major' | 'minor' | 'patch' | 'all'; interactive?: boolean; upgrade?: boolean } = {}\r\n): string {\r\n const { updateType = 'all', interactive = false, upgrade = false } = options;\r\n\r\n let packages: string[] = [];\r\n\r\n switch (updateType) {\r\n case 'major':\r\n packages = result.byUpdateType.major.map((d) => d.name);\r\n break;\r\n case 'minor':\r\n packages = result.byUpdateType.minor.map((d) => d.name);\r\n break;\r\n case 'patch':\r\n packages = result.byUpdateType.patch.map((d) => d.name);\r\n break;\r\n default:\r\n packages = result.dependencies.filter((d) => d.hasUpdate).map((d) => d.name);\r\n }\r\n\r\n if (packages.length === 0) return '# No updates available';\r\n\r\n let cmd = 'npx npm-check-updates';\r\n\r\n if (packages.length < result.dependencies.length) {\r\n cmd += ` --filter \"${packages.join(',')}\"`;\r\n }\r\n\r\n if (interactive) cmd += ' --interactive';\r\n if (upgrade) cmd += ' --upgrade';\r\n\r\n return cmd;\r\n}\r\n\r\n/**\r\n * Print summary to console\r\n */\r\nexport function printPackageCheckSummary(result: PackageCheckResult): void {\r\n console.log(formatPackageCheckResult(result));\r\n\r\n if (result.outdatedCount > 0) {\r\n console.log('\\n📝 Quick Commands:');\r\n console.log(' Check all: npx npm-check-updates');\r\n console.log(' Interactive: npx npm-check-updates --interactive');\r\n console.log(' Update all: npx npm-check-updates --upgrade && npm install');\r\n\r\n if (result.byUpdateType.patch.length > 0) {\r\n console.log(` Patch only: ${generateNcuCommand(result, { updateType: 'patch', upgrade: true })}`);\r\n }\r\n }\r\n}\r\n\r\nexport const packageCheckServer = {\r\n check: checkPackageServer,\r\n format: formatPackageCheckResult,\r\n generateNcuCommand,\r\n print: printPackageCheckSummary,\r\n} as const;\r\n\r\nexport default packageCheckServer;\r\n","// =============================================================================\r\n// Dynamic CORS Configuration\r\n// Configurable for multiple projects\r\n// =============================================================================\r\n\r\nimport type { CorsOptions } from 'cors';\r\n\r\n// =============================================================================\r\n// TYPES\r\n// =============================================================================\r\n\r\n/**\r\n * CORS configuration options\r\n */\r\nexport interface CorsConfig {\r\n /** Allowed production origins */\r\n productionOrigins?: string[];\r\n /** Allowed development origins */\r\n developmentOrigins?: string[];\r\n /** Subdomain patterns to allow (e.g., '.exyconn.com') */\r\n allowedSubdomains?: string[];\r\n /** Regex patterns for origin matching */\r\n originPatterns?: RegExp[];\r\n /** Allow requests with no origin (mobile apps, curl) */\r\n allowNoOrigin?: boolean;\r\n /** Allow all origins in development */\r\n allowAllInDev?: boolean;\r\n /** Custom origin validator */\r\n customValidator?: (origin: string) => boolean;\r\n /** Enable credentials */\r\n credentials?: boolean;\r\n /** Allowed HTTP methods */\r\n methods?: string[];\r\n /** Allowed headers */\r\n allowedHeaders?: string[];\r\n /** Exposed headers */\r\n exposedHeaders?: string[];\r\n /** Preflight cache duration in seconds */\r\n maxAge?: number;\r\n}\r\n\r\n// =============================================================================\r\n// DEFAULT CONFIG\r\n// =============================================================================\r\n\r\n/**\r\n * Default CORS configuration\r\n */\r\nexport const DEFAULT_CORS_CONFIG: Required<Omit<CorsConfig, 'customValidator'>> & { customValidator?: (origin: string) => boolean } = {\r\n productionOrigins: [],\r\n developmentOrigins: [\r\n 'http://localhost:3000',\r\n 'http://localhost:4000',\r\n 'http://localhost:5000',\r\n 'http://localhost:5173',\r\n 'http://localhost:8080',\r\n 'http://127.0.0.1:3000',\r\n 'http://127.0.0.1:4000',\r\n 'http://127.0.0.1:5000',\r\n 'http://127.0.0.1:5173',\r\n 'http://127.0.0.1:8080',\r\n ],\r\n allowedSubdomains: [],\r\n originPatterns: [],\r\n allowNoOrigin: true,\r\n allowAllInDev: true,\r\n credentials: true,\r\n methods: ['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'OPTIONS', 'HEAD'],\r\n allowedHeaders: [\r\n 'Content-Type',\r\n 'Authorization',\r\n 'X-Requested-With',\r\n 'Accept',\r\n 'Origin',\r\n 'X-API-Key',\r\n 'X-Organization-Id',\r\n 'X-Request-Id',\r\n ],\r\n exposedHeaders: [\r\n 'Content-Range',\r\n 'X-Content-Range',\r\n 'X-Total-Count',\r\n 'X-Request-Id',\r\n ],\r\n maxAge: 86400, // 24 hours\r\n};\r\n\r\n// =============================================================================\r\n// CORS BUILDER\r\n// =============================================================================\r\n\r\n/**\r\n * Create CORS options with custom configuration\r\n * @param config - CORS configuration options\r\n * @returns Express CORS options object\r\n * \r\n * @example\r\n * ```typescript\r\n * // Basic usage with production origins\r\n * const cors = createCorsOptions({\r\n * productionOrigins: ['https://example.com'],\r\n * allowedSubdomains: ['.example.com'],\r\n * });\r\n * \r\n * // With custom validator\r\n * const cors = createCorsOptions({\r\n * customValidator: (origin) => origin.includes('trusted'),\r\n * });\r\n * ```\r\n */\r\nexport const createCorsOptions = (config: CorsConfig = {}): CorsOptions => {\r\n const finalConfig = { ...DEFAULT_CORS_CONFIG, ...config };\r\n \r\n const {\r\n productionOrigins,\r\n developmentOrigins,\r\n allowedSubdomains,\r\n originPatterns,\r\n allowNoOrigin,\r\n allowAllInDev,\r\n customValidator,\r\n credentials,\r\n methods,\r\n allowedHeaders,\r\n exposedHeaders,\r\n maxAge,\r\n } = finalConfig;\r\n\r\n // Combine all static origins\r\n const allOrigins = new Set([...productionOrigins, ...developmentOrigins]);\r\n\r\n const originHandler = (\r\n origin: string | undefined,\r\n callback: (err: Error | null, allow?: boolean) => void\r\n ): void => {\r\n // Allow requests with no origin (mobile apps, curl, server-to-server)\r\n if (!origin) {\r\n callback(null, allowNoOrigin);\r\n return;\r\n }\r\n\r\n // Check static allowed origins\r\n if (allOrigins.has(origin)) {\r\n callback(null, true);\r\n return;\r\n }\r\n\r\n // Check subdomain patterns\r\n if (allowedSubdomains.some((subdomain) => origin.endsWith(subdomain))) {\r\n callback(null, true);\r\n return;\r\n }\r\n\r\n // Check regex patterns\r\n if (originPatterns.some((pattern) => pattern.test(origin))) {\r\n callback(null, true);\r\n return;\r\n }\r\n\r\n // Check custom validator\r\n if (customValidator && customValidator(origin)) {\r\n callback(null, true);\r\n return;\r\n }\r\n\r\n // In development, allow all if configured\r\n if (process.env.NODE_ENV !== 'production' && allowAllInDev) {\r\n callback(null, true);\r\n return;\r\n }\r\n\r\n // Reject in production\r\n if (process.env.NODE_ENV === 'production') {\r\n callback(new Error(`Origin ${origin} not allowed by CORS`));\r\n return;\r\n }\r\n\r\n // Default allow in non-production\r\n callback(null, true);\r\n };\r\n\r\n return {\r\n origin: originHandler,\r\n credentials,\r\n methods,\r\n allowedHeaders,\r\n exposedHeaders,\r\n maxAge,\r\n };\r\n};\r\n\r\n/**\r\n * Create CORS options for a specific project/brand\r\n * @param brandDomain - Primary domain (e.g., 'exyconn.com')\r\n * @param additionalConfig - Additional configuration\r\n */\r\nexport const createBrandCorsOptions = (\r\n brandDomain: string,\r\n additionalConfig: Partial<CorsConfig> = {}\r\n): CorsOptions => {\r\n const productionOrigins = [\r\n `https://${brandDomain}`,\r\n `https://www.${brandDomain}`,\r\n ];\r\n\r\n const allowedSubdomains = [`.${brandDomain}`];\r\n\r\n return createCorsOptions({\r\n productionOrigins,\r\n allowedSubdomains,\r\n ...additionalConfig,\r\n });\r\n};\r\n\r\n/**\r\n * Create CORS options for multiple projects\r\n * @param domains - Array of primary domains\r\n * @param additionalConfig - Additional configuration\r\n */\r\nexport const createMultiBrandCorsOptions = (\r\n domains: string[],\r\n additionalConfig: Partial<CorsConfig> = {}\r\n): CorsOptions => {\r\n const productionOrigins = domains.flatMap((domain) => [\r\n `https://${domain}`,\r\n `https://www.${domain}`,\r\n ]);\r\n\r\n const allowedSubdomains = domains.map((domain) => `.${domain}`);\r\n\r\n return createCorsOptions({\r\n productionOrigins,\r\n allowedSubdomains,\r\n ...additionalConfig,\r\n });\r\n};\r\n\r\n// =============================================================================\r\n// PRESET CONFIGURATIONS\r\n// =============================================================================\r\n\r\n/**\r\n * Exyconn preset CORS configuration\r\n */\r\nexport const EXYCONN_CORS_CONFIG: CorsConfig = {\r\n productionOrigins: [\r\n 'https://exyconn.com',\r\n 'https://www.exyconn.com',\r\n 'https://botify.life',\r\n 'https://www.botify.life',\r\n 'https://partywings.fun',\r\n 'https://www.partywings.fun',\r\n 'https://sibera.work',\r\n 'https://www.sibera.work',\r\n 'https://spentiva.com',\r\n 'https://www.spentiva.com',\r\n ],\r\n allowedSubdomains: [\r\n '.exyconn.com',\r\n '.botify.life',\r\n '.partywings.fun',\r\n '.sibera.work',\r\n '.spentiva.com',\r\n ],\r\n developmentOrigins: [\r\n 'http://localhost:3000',\r\n 'http://localhost:4000',\r\n 'http://localhost:4001',\r\n 'http://localhost:4002',\r\n 'http://localhost:4003',\r\n 'http://localhost:4004',\r\n 'http://localhost:4005',\r\n 'http://localhost:5173',\r\n 'http://127.0.0.1:3000',\r\n 'http://127.0.0.1:4000',\r\n 'http://127.0.0.1:5173',\r\n ],\r\n};\r\n\r\n/**\r\n * Strict CORS configuration (production only)\r\n */\r\nexport const STRICT_CORS_CONFIG: CorsConfig = {\r\n allowNoOrigin: false,\r\n allowAllInDev: false,\r\n methods: ['GET', 'POST', 'PUT', 'DELETE'],\r\n};\r\n\r\n/**\r\n * Permissive CORS configuration (development/testing)\r\n */\r\nexport const PERMISSIVE_CORS_CONFIG: CorsConfig = {\r\n allowNoOrigin: true,\r\n allowAllInDev: true,\r\n originPatterns: [/localhost/, /127\\.0\\.0\\.1/],\r\n};\r\n\r\n// =============================================================================\r\n// LEGACY EXPORTS (backward compatibility)\r\n// =============================================================================\r\n\r\n/**\r\n * @deprecated Use createCorsOptions() instead\r\n */\r\nexport const corsOptions: CorsOptions = createCorsOptions(EXYCONN_CORS_CONFIG);\r\n\r\nexport default {\r\n createCorsOptions,\r\n createBrandCorsOptions,\r\n createMultiBrandCorsOptions,\r\n DEFAULT_CORS_CONFIG,\r\n EXYCONN_CORS_CONFIG,\r\n STRICT_CORS_CONFIG,\r\n PERMISSIVE_CORS_CONFIG,\r\n corsOptions,\r\n};\r\n","// =============================================================================\r\n// Dynamic Rate Limiter Configuration\r\n// Configurable for multiple projects\r\n// =============================================================================\r\n\r\nimport rateLimit from 'express-rate-limit';\r\nimport type { Options, RateLimitRequestHandler } from 'express-rate-limit';\r\nimport type { Request } from 'express';\r\n\r\n// =============================================================================\r\n// TYPES\r\n// =============================================================================\r\n\r\n/**\r\n * Rate limit tier configuration\r\n */\r\nexport interface RateLimitTierConfig {\r\n /** Window duration in milliseconds */\r\n windowMs: number;\r\n /** Maximum requests allowed in window */\r\n maxRequests: number;\r\n /** Error message to return */\r\n message: string;\r\n /** Skip successful requests */\r\n skipSuccessfulRequests?: boolean;\r\n /** Skip failed requests */\r\n skipFailedRequests?: boolean;\r\n}\r\n\r\n/**\r\n * Rate limiter configuration options\r\n */\r\nexport interface RateLimiterConfig {\r\n /** Standard tier - general API endpoints */\r\n standard?: Partial<RateLimitTierConfig>;\r\n /** Strict tier - sensitive endpoints (login, signup) */\r\n strict?: Partial<RateLimitTierConfig>;\r\n /** DDoS tier - global protection */\r\n ddos?: Partial<RateLimitTierConfig>;\r\n /** Custom tiers */\r\n custom?: Record<string, RateLimitTierConfig>;\r\n /** Use standard headers */\r\n standardHeaders?: boolean;\r\n /** Use legacy headers */\r\n legacyHeaders?: boolean;\r\n /** Custom key generator */\r\n keyGenerator?: (req: Request) => string;\r\n /** Skip certain requests */\r\n skip?: (req: Request) => boolean;\r\n /** Handler for when rate limit is exceeded */\r\n handler?: Options['handler'];\r\n}\r\n\r\n/**\r\n * Rate limit response format\r\n */\r\nexport interface RateLimitResponse {\r\n status: string;\r\n statusCode: number;\r\n message: string;\r\n retryAfter?: number;\r\n}\r\n\r\n// =============================================================================\r\n// DEFAULT CONFIGURATIONS\r\n// =============================================================================\r\n\r\n/**\r\n * Default rate limit tier configurations\r\n */\r\nexport const DEFAULT_RATE_LIMIT_TIERS = {\r\n STANDARD: {\r\n windowMs: 15 * 60 * 1000, // 15 minutes\r\n maxRequests: 100,\r\n message: 'Too many requests, please try again later.',\r\n skipSuccessfulRequests: false,\r\n skipFailedRequests: false,\r\n },\r\n STRICT: {\r\n windowMs: 15 * 60 * 1000, // 15 minutes\r\n maxRequests: 20,\r\n message: 'Too many requests, please try again later.',\r\n skipSuccessfulRequests: false,\r\n skipFailedRequests: false,\r\n },\r\n DDOS: {\r\n windowMs: 60 * 1000, // 1 minute\r\n maxRequests: 60,\r\n message: 'Rate limit exceeded. Please slow down.',\r\n skipSuccessfulRequests: false,\r\n skipFailedRequests: false,\r\n },\r\n // Additional presets\r\n VERY_STRICT: {\r\n windowMs: 60 * 60 * 1000, // 1 hour\r\n maxRequests: 5,\r\n message: 'Too many attempts. Please try again in an hour.',\r\n skipSuccessfulRequests: false,\r\n skipFailedRequests: false,\r\n },\r\n RELAXED: {\r\n windowMs: 15 * 60 * 1000, // 15 minutes\r\n maxRequests: 500,\r\n message: 'Rate limit exceeded.',\r\n skipSuccessfulRequests: false,\r\n skipFailedRequests: false,\r\n },\r\n API: {\r\n windowMs: 60 * 1000, // 1 minute\r\n maxRequests: 30,\r\n message: 'API rate limit exceeded.',\r\n skipSuccessfulRequests: false,\r\n skipFailedRequests: false,\r\n },\r\n} as const;\r\n\r\n// =============================================================================\r\n// KEY GENERATORS\r\n// =============================================================================\r\n\r\n/**\r\n * Default IP-based key generator\r\n */\r\nexport const defaultKeyGenerator = (req: Request): string => {\r\n const forwarded = req.headers['x-forwarded-for'];\r\n const ip = forwarded \r\n ? (Array.isArray(forwarded) ? forwarded[0] : forwarded.split(',')[0].trim())\r\n : req.ip || req.socket.remoteAddress || 'unknown';\r\n return ip;\r\n};\r\n\r\n/**\r\n * Create key generator with custom prefix\r\n */\r\nexport const createPrefixedKeyGenerator = (prefix: string) => (req: Request): string => {\r\n return `${prefix}:${defaultKeyGenerator(req)}`;\r\n};\r\n\r\n/**\r\n * Create key generator based on user ID (for authenticated routes)\r\n */\r\nexport const createUserKeyGenerator = (getUserId: (req: Request) => string | undefined) => (req: Request): string => {\r\n const userId = getUserId(req);\r\n return userId || defaultKeyGenerator(req);\r\n};\r\n\r\n/**\r\n * Create key generator based on API key\r\n */\r\nexport const createApiKeyGenerator = (headerName: string = 'x-api-key') => (req: Request): string => {\r\n const apiKey = req.headers[headerName.toLowerCase()] as string | undefined;\r\n return apiKey || defaultKeyGenerator(req);\r\n};\r\n\r\n// =============================================================================\r\n// RATE LIMITER FACTORY\r\n// =============================================================================\r\n\r\n/**\r\n * Create rate limiter response object\r\n */\r\nconst createRateLimitResponse = (message: string, retryAfter?: number): RateLimitResponse => ({\r\n status: 'error',\r\n statusCode: 429,\r\n message,\r\n ...(retryAfter && { retryAfter }),\r\n});\r\n\r\n/**\r\n * Create a rate limiter with custom configuration\r\n * @param tierConfig - Tier configuration\r\n * @param options - Additional options\r\n * @returns Express rate limit middleware\r\n * \r\n * @example\r\n * ```typescript\r\n * // Create custom rate limiter\r\n * const apiLimiter = createRateLimiter({\r\n * windowMs: 60 * 1000, // 1 minute\r\n * maxRequests: 30,\r\n * message: 'API rate limit exceeded',\r\n * });\r\n * \r\n * // Use with user-based limiting\r\n * const userLimiter = createRateLimiter(\r\n * { windowMs: 60000, maxRequests: 10, message: 'Slow down!' },\r\n * { keyGenerator: createUserKeyGenerator((req) => req.userId) }\r\n * );\r\n * ```\r\n */\r\nexport const createRateLimiter = (\r\n tierConfig: RateLimitTierConfig,\r\n options: Partial<Omit<RateLimiterConfig, 'standard' | 'strict' | 'ddos' | 'custom'>> = {}\r\n): RateLimitRequestHandler => {\r\n const {\r\n standardHeaders = true,\r\n legacyHeaders = false,\r\n keyGenerator = defaultKeyGenerator,\r\n skip,\r\n handler,\r\n } = options;\r\n\r\n return rateLimit({\r\n windowMs: tierConfig.windowMs,\r\n max: tierConfig.maxRequests,\r\n message: createRateLimitResponse(tierConfig.message),\r\n standardHeaders,\r\n legacyHeaders,\r\n keyGenerator,\r\n skip,\r\n handler,\r\n skipSuccessfulRequests: tierConfig.skipSuccessfulRequests,\r\n skipFailedRequests: tierConfig.skipFailedRequests,\r\n });\r\n};\r\n\r\n/**\r\n * Create standard rate limiter\r\n * @param config - Optional custom configuration\r\n */\r\nexport const createStandardRateLimiter = (\r\n config: Partial<RateLimitTierConfig> = {},\r\n options: Partial<Omit<RateLimiterConfig, 'standard' | 'strict' | 'ddos' | 'custom'>> = {}\r\n): RateLimitRequestHandler => {\r\n const tierConfig = { ...DEFAULT_RATE_LIMIT_TIERS.STANDARD, ...config };\r\n return createRateLimiter(tierConfig, options);\r\n};\r\n\r\n/**\r\n * Create strict rate limiter (for sensitive endpoints)\r\n * @param config - Optional custom configuration\r\n */\r\nexport const createStrictRateLimiter = (\r\n config: Partial<RateLimitTierConfig> = {},\r\n options: Partial<Omit<RateLimiterConfig, 'standard' | 'strict' | 'ddos' | 'custom'>> = {}\r\n): RateLimitRequestHandler => {\r\n const tierConfig = { ...DEFAULT_RATE_LIMIT_TIERS.STRICT, ...config };\r\n return createRateLimiter(tierConfig, options);\r\n};\r\n\r\n/**\r\n * Create DDoS protection rate limiter\r\n * @param config - Optional custom configuration\r\n */\r\nexport const createDdosRateLimiter = (\r\n config: Partial<RateLimitTierConfig> = {},\r\n options: Partial<Omit<RateLimiterConfig, 'standard' | 'strict' | 'ddos' | 'custom'>> = {}\r\n): RateLimitRequestHandler => {\r\n const tierConfig = { ...DEFAULT_RATE_LIMIT_TIERS.DDOS, ...config };\r\n return createRateLimiter(tierConfig, options);\r\n};\r\n\r\n/**\r\n * Create API rate limiter\r\n * @param config - Optional custom configuration\r\n */\r\nexport const createApiRateLimiter = (\r\n config: Partial<RateLimitTierConfig> = {},\r\n options: Partial<Omit<RateLimiterConfig, 'standard' | 'strict' | 'ddos' | 'custom'>> = {}\r\n): RateLimitRequestHandler => {\r\n const tierConfig = { ...DEFAULT_RATE_LIMIT_TIERS.API, ...config };\r\n return createRateLimiter(tierConfig, {\r\n keyGenerator: createApiKeyGenerator(),\r\n ...options,\r\n });\r\n};\r\n\r\n// =============================================================================\r\n// RATE LIMITER BUILDER CLASS\r\n// =============================================================================\r\n\r\n/**\r\n * Rate limiter builder for complex configurations\r\n */\r\nexport class RateLimiterBuilder {\r\n private config: RateLimitTierConfig;\r\n private options: Partial<Omit<RateLimiterConfig, 'standard' | 'strict' | 'ddos' | 'custom'>>;\r\n\r\n constructor(preset: keyof typeof DEFAULT_RATE_LIMIT_TIERS = 'STANDARD') {\r\n const presetConfig = DEFAULT_RATE_LIMIT_TIERS[preset];\r\n this.config = {\r\n windowMs: presetConfig.windowMs,\r\n maxRequests: presetConfig.maxRequests,\r\n message: presetConfig.message,\r\n skipSuccessfulRequests: presetConfig.skipSuccessfulRequests ?? false,\r\n skipFailedRequests: presetConfig.skipFailedRequests ?? false,\r\n };\r\n this.options = {};\r\n }\r\n\r\n /**\r\n * Set window duration\r\n */\r\n windowMs(ms: number): this {\r\n this.config.windowMs = ms;\r\n return this;\r\n }\r\n\r\n /**\r\n * Set window duration in minutes\r\n */\r\n windowMinutes(minutes: number): this {\r\n this.config.windowMs = minutes * 60 * 1000;\r\n return this;\r\n }\r\n\r\n /**\r\n * Set window duration in hours\r\n */\r\n windowHours(hours: number): this {\r\n this.config.windowMs = hours * 60 * 60 * 1000;\r\n return this;\r\n }\r\n\r\n /**\r\n * Set maximum requests\r\n */\r\n max(requests: number): this {\r\n this.config.maxRequests = requests;\r\n return this;\r\n }\r\n\r\n /**\r\n * Set error message\r\n */\r\n message(msg: string): this {\r\n this.config.message = msg;\r\n return this;\r\n }\r\n\r\n /**\r\n * Skip successful requests\r\n */\r\n skipSuccessful(skip: boolean = true): this {\r\n this.config.skipSuccessfulRequests = skip;\r\n return this;\r\n }\r\n\r\n /**\r\n * Skip failed requests\r\n */\r\n skipFailed(skip: boolean = true): this {\r\n this.config.skipFailedRequests = skip;\r\n return this;\r\n }\r\n\r\n /**\r\n * Set key generator\r\n */\r\n keyBy(generator: (req: Request) => string): this {\r\n this.options.keyGenerator = generator;\r\n return this;\r\n }\r\n\r\n /**\r\n * Key by IP (default)\r\n */\r\n keyByIp(): this {\r\n this.options.keyGenerator = defaultKeyGenerator;\r\n return this;\r\n }\r\n\r\n /**\r\n * Key by API key\r\n */\r\n keyByApiKey(headerName?: string): this {\r\n this.options.keyGenerator = createApiKeyGenerator(headerName);\r\n return this;\r\n }\r\n\r\n /**\r\n * Skip certain requests\r\n */\r\n skipWhen(predicate: (req: Request) => boolean): this {\r\n this.options.skip = predicate;\r\n return this;\r\n }\r\n\r\n /**\r\n * Build the rate limiter\r\n */\r\n build(): RateLimitRequestHandler {\r\n return createRateLimiter(this.config, this.options);\r\n }\r\n}\r\n\r\n/**\r\n * Create a new rate limiter builder\r\n */\r\nexport const rateLimiter = (preset?: keyof typeof DEFAULT_RATE_LIMIT_TIERS): RateLimiterBuilder => {\r\n return new RateLimiterBuilder(preset);\r\n};\r\n\r\n// =============================================================================\r\n// LEGACY EXPORTS (backward compatibility)\r\n// =============================================================================\r\n\r\n/**\r\n * @deprecated Use DEFAULT_RATE_LIMIT_TIERS instead\r\n */\r\nexport const RATE_LIMIT_CONFIG = {\r\n STANDARD: DEFAULT_RATE_LIMIT_TIERS.STANDARD,\r\n STRICT: DEFAULT_RATE_LIMIT_TIERS.STRICT,\r\n DDOS: DEFAULT_RATE_LIMIT_TIERS.DDOS,\r\n} as const;\r\n\r\n/**\r\n * @deprecated Use createStandardRateLimiter() instead\r\n */\r\nexport const standardRateLimiter = createStandardRateLimiter();\r\n\r\n/**\r\n * @deprecated Use createStrictRateLimiter() instead\r\n */\r\nexport const strictRateLimiter = createStrictRateLimiter();\r\n\r\n/**\r\n * @deprecated Use createDdosRateLimiter() instead\r\n */\r\nexport const ddosProtectionLimiter = createDdosRateLimiter();\r\n\r\nexport default {\r\n // Factory functions\r\n createRateLimiter,\r\n createStandardRateLimiter,\r\n createStrictRateLimiter,\r\n createDdosRateLimiter,\r\n createApiRateLimiter,\r\n // Builder\r\n rateLimiter,\r\n RateLimiterBuilder,\r\n // Key generators\r\n defaultKeyGenerator,\r\n createPrefixedKeyGenerator,\r\n createUserKeyGenerator,\r\n createApiKeyGenerator,\r\n // Constants\r\n DEFAULT_RATE_LIMIT_TIERS,\r\n RATE_LIMIT_CONFIG,\r\n // Legacy\r\n standardRateLimiter,\r\n strictRateLimiter,\r\n ddosProtectionLimiter,\r\n};\r\n","// =============================================================================\r\n// Dynamic Server Configuration\r\n// Use this to create project-specific server configs\r\n// =============================================================================\r\n\r\n// =============================================================================\r\n// TYPES\r\n// =============================================================================\r\n\r\n/**\r\n * Environment type\r\n */\r\nexport type Environment = 'development' | 'production' | 'test' | 'staging';\r\n\r\n/**\r\n * Log level type\r\n */\r\nexport type LogLevel = 'error' | 'warn' | 'info' | 'http' | 'debug';\r\n\r\n/**\r\n * Server configuration interface\r\n */\r\nexport interface ServerConfig {\r\n /** Server name/identifier */\r\n name: string;\r\n /** Server version */\r\n version: string;\r\n /** Current environment */\r\n environment: Environment;\r\n /** Server port */\r\n port: number;\r\n /** Host binding */\r\n host: string;\r\n /** Base API path */\r\n basePath: string;\r\n /** Enable debug mode */\r\n debug: boolean;\r\n /** Trusted proxy settings */\r\n trustProxy: boolean | string | number;\r\n}\r\n\r\n/**\r\n * Database configuration interface\r\n */\r\nexport interface DatabaseConfig {\r\n /** MongoDB connection URI */\r\n uri: string;\r\n /** Database name */\r\n name: string;\r\n /** Max connection pool size */\r\n maxPoolSize: number;\r\n /** Min connection pool size */\r\n minPoolSize: number;\r\n /** Socket timeout in ms */\r\n socketTimeoutMS: number;\r\n /** Server selection timeout in ms */\r\n serverSelectionTimeoutMS: number;\r\n /** Max idle time in ms */\r\n maxIdleTimeMS: number;\r\n /** Enable retry writes */\r\n retryWrites: boolean;\r\n /** Enable retry reads */\r\n retryReads: boolean;\r\n /** Write concern */\r\n writeConcern: 'majority' | number;\r\n}\r\n\r\n/**\r\n * JWT/Auth configuration interface\r\n */\r\nexport interface AuthConfig {\r\n /** JWT secret key */\r\n jwtSecret: string;\r\n /** JWT expiration (e.g., '7d', '24h', '30m') */\r\n jwtExpiresIn: string;\r\n /** Refresh token expiration */\r\n refreshTokenExpiresIn: string;\r\n /** Enable refresh tokens */\r\n enableRefreshTokens: boolean;\r\n /** API key header name */\r\n apiKeyHeader: string;\r\n /** Organization header name */\r\n orgHeader: string;\r\n}\r\n\r\n/**\r\n * Logging configuration interface\r\n */\r\nexport interface LoggingConfig {\r\n /** Log level */\r\n level: LogLevel;\r\n /** Logs directory */\r\n logsDir: string;\r\n /** Max log file size */\r\n maxSize: string;\r\n /** Max days to keep logs */\r\n maxFiles: string;\r\n /** Max days to keep error logs */\r\n errorMaxFiles: string;\r\n /** Enable console logging */\r\n console: boolean;\r\n /** Enable file logging */\r\n file: boolean;\r\n /** Enable JSON format */\r\n json: boolean;\r\n}\r\n\r\n/**\r\n * CORS origins configuration\r\n */\r\nexport interface CorsOriginsConfig {\r\n /** Production domains */\r\n production: string[];\r\n /** Development domains */\r\n development: string[];\r\n /** Custom domain patterns (regex strings) */\r\n patterns: string[];\r\n}\r\n\r\n/**\r\n * Rate limit tier configuration\r\n */\r\nexport interface RateLimitTier {\r\n /** Window duration in ms */\r\n windowMs: number;\r\n /** Max requests in window */\r\n maxRequests: number;\r\n /** Error message */\r\n message: string;\r\n /** Skip successful requests */\r\n skipSuccessfulRequests?: boolean;\r\n /** Skip failed requests */\r\n skipFailedRequests?: boolean;\r\n}\r\n\r\n/**\r\n * Rate limiting configuration\r\n */\r\nexport interface RateLimitConfig {\r\n /** Enable rate limiting */\r\n enabled: boolean;\r\n /** Standard tier */\r\n standard: RateLimitTier;\r\n /** Strict tier (auth endpoints) */\r\n strict: RateLimitTier;\r\n /** DDoS protection tier */\r\n ddos: RateLimitTier;\r\n /** Custom tiers */\r\n custom?: Record<string, RateLimitTier>;\r\n}\r\n\r\n/**\r\n * Complete application configuration\r\n */\r\nexport interface AppConfig {\r\n server: ServerConfig;\r\n database: DatabaseConfig;\r\n auth: AuthConfig;\r\n logging: LoggingConfig;\r\n cors: CorsOriginsConfig;\r\n rateLimit: RateLimitConfig;\r\n /** Custom configuration */\r\n custom?: Record<string, unknown>;\r\n}\r\n\r\n// =============================================================================\r\n// DEFAULT CONFIGURATIONS\r\n// =============================================================================\r\n\r\n/**\r\n * Default server configuration\r\n */\r\nexport const DEFAULT_SERVER_CONFIG: ServerConfig = {\r\n name: 'app-server',\r\n version: '1.0.0',\r\n environment: (process.env.NODE_ENV as Environment) || 'development',\r\n port: parseInt(process.env.PORT || '3000', 10),\r\n host: process.env.HOST || '0.0.0.0',\r\n basePath: '/api',\r\n debug: process.env.DEBUG === 'true',\r\n trustProxy: true,\r\n};\r\n\r\n/**\r\n * Default database configuration\r\n */\r\nexport const DEFAULT_DATABASE_CONFIG: DatabaseConfig = {\r\n uri: process.env.DATABASE_URL || process.env.MONGODB_URI || '',\r\n name: process.env.DATABASE_NAME || 'app_db',\r\n maxPoolSize: process.env.NODE_ENV === 'production' ? 50 : 10,\r\n minPoolSize: process.env.NODE_ENV === 'production' ? 10 : 5,\r\n socketTimeoutMS: 45000,\r\n serverSelectionTimeoutMS: 10000,\r\n maxIdleTimeMS: 10000,\r\n retryWrites: true,\r\n retryReads: true,\r\n writeConcern: 'majority',\r\n};\r\n\r\n/**\r\n * Default auth configuration\r\n */\r\nexport const DEFAULT_AUTH_CONFIG: AuthConfig = {\r\n jwtSecret: process.env.JWT_SECRET || '',\r\n jwtExpiresIn: process.env.JWT_EXPIRES_IN || '7d',\r\n refreshTokenExpiresIn: process.env.REFRESH_TOKEN_EXPIRES_IN || '30d',\r\n enableRefreshTokens: true,\r\n apiKeyHeader: 'x-api-key',\r\n orgHeader: 'x-organization-id',\r\n};\r\n\r\n/**\r\n * Default logging configuration\r\n */\r\nexport const DEFAULT_LOGGING_CONFIG: LoggingConfig = {\r\n level: (process.env.LOG_LEVEL as LogLevel) || 'info',\r\n logsDir: process.env.LOGS_DIR || 'logs',\r\n maxSize: '20m',\r\n maxFiles: '14d',\r\n errorMaxFiles: '30d',\r\n console: true,\r\n file: process.env.NODE_ENV === 'production',\r\n json: process.env.NODE_ENV === 'production',\r\n};\r\n\r\n/**\r\n * Default CORS origins configuration\r\n */\r\nexport const DEFAULT_CORS_ORIGINS: CorsOriginsConfig = {\r\n production: [],\r\n development: [\r\n 'http://localhost:3000',\r\n 'http://localhost:4000',\r\n 'http://localhost:5173',\r\n 'http://127.0.0.1:3000',\r\n 'http://127.0.0.1:4000',\r\n 'http://127.0.0.1:5173',\r\n ],\r\n patterns: [],\r\n};\r\n\r\n/**\r\n * Default rate limit configuration\r\n */\r\nexport const DEFAULT_RATE_LIMIT_CONFIG: RateLimitConfig = {\r\n enabled: true,\r\n standard: {\r\n windowMs: 15 * 60 * 1000, // 15 minutes\r\n maxRequests: 100,\r\n message: 'Too many requests, please try again later.',\r\n },\r\n strict: {\r\n windowMs: 15 * 60 * 1000, // 15 minutes\r\n maxRequests: 20,\r\n message: 'Too many requests, please try again later.',\r\n },\r\n ddos: {\r\n windowMs: 60 * 1000, // 1 minute\r\n maxRequests: 60,\r\n message: 'Rate limit exceeded. Please slow down.',\r\n skipSuccessfulRequests: false,\r\n },\r\n};\r\n\r\n// =============================================================================\r\n// CONFIG BUILDER\r\n// =============================================================================\r\n\r\n/**\r\n * Create a deep merge of two objects\r\n */\r\nfunction deepMerge<T extends object>(target: T, source: Partial<T>): T {\r\n const result = { ...target } as T;\r\n \r\n for (const key in source) {\r\n if (Object.prototype.hasOwnProperty.call(source, key)) {\r\n const sourceValue = source[key as keyof T];\r\n const targetValue = target[key as keyof T];\r\n \r\n if (\r\n sourceValue !== undefined &&\r\n typeof sourceValue === 'object' &&\r\n sourceValue !== null &&\r\n !Array.isArray(sourceValue) &&\r\n typeof targetValue === 'object' &&\r\n targetValue !== null &&\r\n !Array.isArray(targetValue)\r\n ) {\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n (result as any)[key] = deepMerge(\r\n targetValue as object,\r\n sourceValue as object\r\n );\r\n } else if (sourceValue !== undefined) {\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n (result as any)[key] = sourceValue;\r\n }\r\n }\r\n }\r\n \r\n return result;\r\n}\r\n\r\n/**\r\n * Configuration builder for creating project-specific configs\r\n */\r\nexport class ConfigBuilder {\r\n private config: AppConfig;\r\n\r\n constructor() {\r\n this.config = {\r\n server: { ...DEFAULT_SERVER_CONFIG },\r\n database: { ...DEFAULT_DATABASE_CONFIG },\r\n auth: { ...DEFAULT_AUTH_CONFIG },\r\n logging: { ...DEFAULT_LOGGING_CONFIG },\r\n cors: { ...DEFAULT_CORS_ORIGINS },\r\n rateLimit: { ...DEFAULT_RATE_LIMIT_CONFIG },\r\n };\r\n }\r\n\r\n /**\r\n * Set server configuration\r\n */\r\n setServer(config: Partial<ServerConfig>): this {\r\n this.config.server = deepMerge(this.config.server, config);\r\n return this;\r\n }\r\n\r\n /**\r\n * Set database configuration\r\n */\r\n setDatabase(config: Partial<DatabaseConfig>): this {\r\n this.config.database = deepMerge(this.config.database, config);\r\n return this;\r\n }\r\n\r\n /**\r\n * Set auth configuration\r\n */\r\n setAuth(config: Partial<AuthConfig>): this {\r\n this.config.auth = deepMerge(this.config.auth, config);\r\n return this;\r\n }\r\n\r\n /**\r\n * Set logging configuration\r\n */\r\n setLogging(config: Partial<LoggingConfig>): this {\r\n this.config.logging = deepMerge(this.config.logging, config);\r\n return this;\r\n }\r\n\r\n /**\r\n * Set CORS origins\r\n */\r\n setCorsOrigins(config: Partial<CorsOriginsConfig>): this {\r\n this.config.cors = deepMerge(this.config.cors, config);\r\n return this;\r\n }\r\n\r\n /**\r\n * Add CORS production origin\r\n */\r\n addProductionOrigin(origin: string): this {\r\n if (!this.config.cors.production.includes(origin)) {\r\n this.config.cors.production.push(origin);\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Add CORS development origin\r\n */\r\n addDevelopmentOrigin(origin: string): this {\r\n if (!this.config.cors.development.includes(origin)) {\r\n this.config.cors.development.push(origin);\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Add CORS pattern\r\n */\r\n addCorsPattern(pattern: string): this {\r\n if (!this.config.cors.patterns.includes(pattern)) {\r\n this.config.cors.patterns.push(pattern);\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Set rate limit configuration\r\n */\r\n setRateLimit(config: Partial<RateLimitConfig>): this {\r\n this.config.rateLimit = deepMerge(this.config.rateLimit, config);\r\n return this;\r\n }\r\n\r\n /**\r\n * Add custom rate limit tier\r\n */\r\n addRateLimitTier(name: string, tier: RateLimitTier): this {\r\n if (!this.config.rateLimit.custom) {\r\n this.config.rateLimit.custom = {};\r\n }\r\n this.config.rateLimit.custom[name] = tier;\r\n return this;\r\n }\r\n\r\n /**\r\n * Set custom configuration\r\n */\r\n setCustom(key: string, value: unknown): this {\r\n if (!this.config.custom) {\r\n this.config.custom = {};\r\n }\r\n this.config.custom[key] = value;\r\n return this;\r\n }\r\n\r\n /**\r\n * Load configuration from environment variables\r\n */\r\n loadFromEnv(): this {\r\n // Server\r\n if (process.env.SERVER_NAME) this.config.server.name = process.env.SERVER_NAME;\r\n if (process.env.SERVER_VERSION) this.config.server.version = process.env.SERVER_VERSION;\r\n if (process.env.PORT) this.config.server.port = parseInt(process.env.PORT, 10);\r\n if (process.env.HOST) this.config.server.host = process.env.HOST;\r\n if (process.env.BASE_PATH) this.config.server.basePath = process.env.BASE_PATH;\r\n \r\n // Database\r\n if (process.env.DATABASE_URL) this.config.database.uri = process.env.DATABASE_URL;\r\n if (process.env.MONGODB_URI) this.config.database.uri = process.env.MONGODB_URI;\r\n if (process.env.DATABASE_NAME) this.config.database.name = process.env.DATABASE_NAME;\r\n \r\n // Auth\r\n if (process.env.JWT_SECRET) this.config.auth.jwtSecret = process.env.JWT_SECRET;\r\n if (process.env.JWT_EXPIRES_IN) this.config.auth.jwtExpiresIn = process.env.JWT_EXPIRES_IN;\r\n \r\n // Logging\r\n if (process.env.LOG_LEVEL) this.config.logging.level = process.env.LOG_LEVEL as LogLevel;\r\n if (process.env.LOGS_DIR) this.config.logging.logsDir = process.env.LOGS_DIR;\r\n \r\n // CORS origins from env (comma-separated)\r\n if (process.env.CORS_ORIGINS) {\r\n const origins = process.env.CORS_ORIGINS.split(',').map(o => o.trim());\r\n this.config.cors.production.push(...origins);\r\n }\r\n \r\n return this;\r\n }\r\n\r\n /**\r\n * Validate configuration\r\n */\r\n validate(): { valid: boolean; errors: string[] } {\r\n const errors: string[] = [];\r\n \r\n // Validate server config\r\n if (!this.config.server.name) errors.push('Server name is required');\r\n if (this.config.server.port < 1 || this.config.server.port > 65535) {\r\n errors.push('Server port must be between 1 and 65535');\r\n }\r\n \r\n // Validate auth config in production\r\n if (this.config.server.environment === 'production') {\r\n if (!this.config.auth.jwtSecret || this.config.auth.jwtSecret.length < 32) {\r\n errors.push('JWT secret must be at least 32 characters in production');\r\n }\r\n }\r\n \r\n return { valid: errors.length === 0, errors };\r\n }\r\n\r\n /**\r\n * Build the final configuration\r\n */\r\n build(): AppConfig {\r\n return { ...this.config };\r\n }\r\n}\r\n\r\n/**\r\n * Create a new configuration builder\r\n */\r\nexport const createConfig = (): ConfigBuilder => {\r\n return new ConfigBuilder();\r\n};\r\n\r\n/**\r\n * Create config from partial object\r\n */\r\nexport const buildConfig = (partial: Partial<AppConfig> = {}): AppConfig => {\r\n const builder = createConfig().loadFromEnv();\r\n \r\n if (partial.server) builder.setServer(partial.server);\r\n if (partial.database) builder.setDatabase(partial.database);\r\n if (partial.auth) builder.setAuth(partial.auth);\r\n if (partial.logging) builder.setLogging(partial.logging);\r\n if (partial.cors) builder.setCorsOrigins(partial.cors);\r\n if (partial.rateLimit) builder.setRateLimit(partial.rateLimit);\r\n \r\n return builder.build();\r\n};\r\n\r\n// =============================================================================\r\n// HELPERS\r\n// =============================================================================\r\n\r\n/**\r\n * Check if current environment is production\r\n */\r\nexport const isProduction = (config?: ServerConfig): boolean => {\r\n return (config?.environment || process.env.NODE_ENV) === 'production';\r\n};\r\n\r\n/**\r\n * Check if current environment is development\r\n */\r\nexport const isDevelopment = (config?: ServerConfig): boolean => {\r\n return (config?.environment || process.env.NODE_ENV) === 'development';\r\n};\r\n\r\n/**\r\n * Check if current environment is test\r\n */\r\nexport const isTest = (config?: ServerConfig): boolean => {\r\n return (config?.environment || process.env.NODE_ENV) === 'test';\r\n};\r\n\r\n/**\r\n * Get database options for mongoose connect\r\n */\r\nexport const getDatabaseOptions = (config: DatabaseConfig): Record<string, unknown> => {\r\n return {\r\n maxPoolSize: config.maxPoolSize,\r\n minPoolSize: config.minPoolSize,\r\n socketTimeoutMS: config.socketTimeoutMS,\r\n serverSelectionTimeoutMS: config.serverSelectionTimeoutMS,\r\n maxIdleTimeMS: config.maxIdleTimeMS,\r\n retryWrites: config.retryWrites,\r\n retryReads: config.retryReads,\r\n w: config.writeConcern,\r\n };\r\n};\r\n\r\nexport default {\r\n ConfigBuilder,\r\n createConfig,\r\n buildConfig,\r\n isProduction,\r\n isDevelopment,\r\n isTest,\r\n getDatabaseOptions,\r\n DEFAULT_SERVER_CONFIG,\r\n DEFAULT_DATABASE_CONFIG,\r\n DEFAULT_AUTH_CONFIG,\r\n DEFAULT_LOGGING_CONFIG,\r\n DEFAULT_CORS_ORIGINS,\r\n DEFAULT_RATE_LIMIT_CONFIG,\r\n};\r\n"]}