@ajayjbtickets/common 1.0.10 → 1.0.11
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.
- package/dist/index.js +0 -1
- package/dist/index.mjs +0 -1
- package/package.json +1 -1
- package/dist/index.js.map +0 -1
- package/dist/index.mjs.map +0 -1
package/dist/index.js
CHANGED
package/dist/index.mjs
CHANGED
package/package.json
CHANGED
package/dist/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/constants/environments.ts","../src/core/ApiResponse.ts","../src/config/config.ts","../src/core/ApiError.ts","../src/core/Logger.ts","../src/middlewares/schemaValidator.ts","../src/middlewares/verifyToken.ts","../src/services/jwt.service.ts","../src/services/password.service.ts","../src/types/validation.ts","../src/utils/asyncHandler.ts"],"sourcesContent":["export * from \"./constants/environments\"\nexport * from \"./core/ApiError\"\nexport * from \"./core/ApiResponse\"\nexport * from \"./core/Logger\"\nexport * from \"./middlewares/schemaValidator\"\nexport * from \"./middlewares/verifyToken\"\nexport * from \"./services/jwt.service\"\nexport * from \"./services/password.service\"\nexport * from \"./types/validation\"\nexport * from \"./utils/asyncHandler\"\n","export const ENVIRONMENTS = {\n production: \"production\",\n development: \"development\",\n testing: \"testing\",\n};\n","import { Response } from \"express\";\nimport { ErrorDetailType } from \"@/core/ApiError\";\n\nexport enum StatusCode {\n SUCCESS = \"10000\",\n FAILURE = \"10001\",\n RETRY = \"10002\",\n IN_VALID_ACCESS_TOKEN = \"10003\",\n}\n\nexport enum ResponseStatusCode {\n SUCCESS = 200,\n CREATED = 201,\n ACCEPTED = 202,\n NO_CONTENT = 204,\n\n MOVED_PERMANENTLY = 301,\n FOUND = 302,\n NOT_MODIFIED = 304,\n TEMPORARY_REDIRECT = 307,\n PERMANENT_REDIRECT = 308,\n\n BAD_REQUEST = 400,\n UNAUTHORIZED = 401,\n PAYMENT_REQUIRED = 402,\n FORBIDDEN = 403,\n NOT_FOUND = 404,\n METHOD_NOT_ALLOWED = 405,\n NOT_ACCEPTABLE = 406,\n CONFLICT = 409,\n GONE = 410,\n PAYLOAD_TOO_LARGE = 413,\n UNSUPPORTED_MEDIA_TYPE = 415,\n UNPROCESSABLE_ENTITY = 422,\n TOO_MANY_REQUESTS = 429,\n\n INTERNAL_ERROR = 500,\n NOT_IMPLEMENTED = 501,\n BAD_GATEWAY = 502,\n SERVICE_UNAVAILABLE = 503,\n GATEWAY_TIMEOUT = 504,\n}\n\nexport abstract class ApiResponse {\n public message: string;\n public statusCode: string | undefined;\n public status: number;\n\n constructor(status: number, message: string, statusCode?: string) {\n this.message = message;\n this.status = status;\n if (statusCode) {\n this.statusCode = statusCode;\n }\n }\n\n public prepare<T extends ApiResponse>(\n res: Response,\n response: T,\n headers: { [key: string]: string } = {}\n ) {\n for (const [key, value] of Object.entries(headers)) {\n res.append(key, value);\n }\n res.status(this.status).send(this.sanitize(response));\n }\n\n public send(res: Response, headers: { [key: string]: string } = {}) {\n this.prepare<ApiResponse>(res, this, headers);\n }\n\n private sanitize<T extends ApiResponse>(response: T) {\n const clone = {} as T;\n Object.assign(clone, response);\n\n delete clone[\"statusCode\"];\n\n for (const key in clone) {\n const typedKey = key as keyof T;\n if (clone[typedKey] === undefined) {\n delete clone[typedKey];\n }\n }\n return clone;\n }\n}\n\nexport class SuccessResponse<T> extends ApiResponse {\n constructor(\n responseStatusCode:\n | ResponseStatusCode.SUCCESS\n | ResponseStatusCode.CREATED\n | ResponseStatusCode.ACCEPTED\n | ResponseStatusCode.NO_CONTENT,\n message: string,\n public data: T\n ) {\n super(responseStatusCode, message, StatusCode.SUCCESS);\n this.data = data;\n }\n\n send(res: Response) {\n this.prepare<SuccessResponse<T>>(res, this, {});\n }\n}\n\nexport class AccessTokenErrorResponse extends ApiResponse {\n protected instruction: string = \"refresh_token\";\n public errors: ErrorDetailType[];\n\n constructor(message: string, errors: ErrorDetailType[]) {\n super(\n ResponseStatusCode.UNAUTHORIZED,\n message,\n StatusCode.IN_VALID_ACCESS_TOKEN\n );\n this.errors = errors || [];\n }\n\n send(res: Response, headers: { [key: string]: string } = {}) {\n headers.instruction = this.instruction;\n this.prepare<AccessTokenErrorResponse>(res, this, headers);\n }\n}\n\nexport class BadTokenResponse extends ApiResponse {\n public errors: ErrorDetailType[];\n\n constructor(message: string, errors: ErrorDetailType[]) {\n super(ResponseStatusCode.UNAUTHORIZED, message, StatusCode.FAILURE);\n this.errors = errors || [];\n }\n}\n\nexport class BadRequestResponse extends ApiResponse {\n public errors: ErrorDetailType[];\n\n constructor(message: string, errors: ErrorDetailType[]) {\n super(ResponseStatusCode.BAD_REQUEST, message, StatusCode.FAILURE);\n this.errors = errors || [];\n }\n}\n\nexport class InternalErrorResponse extends ApiResponse {\n public errors: ErrorDetailType[];\n\n constructor(message: string, errors: ErrorDetailType[]) {\n super(ResponseStatusCode.INTERNAL_ERROR, message, StatusCode.FAILURE);\n this.errors = errors || [];\n }\n}\n\nexport class NoFoundResponse extends ApiResponse {\n public errors: ErrorDetailType[];\n\n constructor(message: string, errors: ErrorDetailType[]) {\n super(ResponseStatusCode.NOT_FOUND, message, StatusCode.FAILURE);\n this.errors = errors || [];\n }\n}\n\nexport class ForbiddenResponse extends ApiResponse {\n public errors: ErrorDetailType[];\n\n constructor(message: string, errors: ErrorDetailType[]) {\n super(ResponseStatusCode.FORBIDDEN, message, StatusCode.FAILURE);\n this.errors = errors || [];\n }\n}\n","import \"dotenv/config\";\n\ninterface Env {\n ENVIRONMENT: string;\n LOG_DIR: string;\n LOG_LEVEL: string;\n SALT_ROUNDS: number;\n JWT_KEY: string;\n}\n\nconst getConfig = (): Env => {\n return {\n ENVIRONMENT: process.env.ENVIRONMENT,\n LOG_DIR: process.env.LOG_DIR,\n LOG_LEVEL: process.env.LOG_LEVEL,\n SALT_ROUNDS: parseInt(process.env.SALT_ROUNDS),\n JWT_KEY: process.env.JWT_KEY,\n };\n};\n\nconst getSanitizedConfig = (config: Env): Env => {\n for (const [key, value] of Object.entries(config)) {\n if (!value) {\n throw new Error(`Missing key ${key} in config.env`);\n }\n }\n\n return config;\n};\n\nconst config = getConfig();\nexport const sanitizedConfig = getSanitizedConfig(config);\n","import { Response } from \"express\";\n\nimport {\n AccessTokenErrorResponse,\n BadRequestResponse,\n BadTokenResponse,\n ForbiddenResponse,\n InternalErrorResponse,\n NoFoundResponse,\n} from \"@/core/ApiResponse\";\nimport { sanitizedConfig } from \"@/config/config\";\nimport { ENVIRONMENTS } from \"@/constants/environments\";\n\nexport enum ErrorType {\n BAD_TOKEN = \"BadTokenError\",\n TOKEN_EXPIRED = \"TokenExpiredError\",\n UNAUTHORIZED = \"AuthFailureError\",\n ACCESS_TOKEN = \"AccessTokenError\",\n INTERNAL = \"InternalError\",\n NOT_FOUND = \"NotFoundError\",\n NO_ENTRY = \"NoEntryError\",\n NO_DATA = \"NoDataError\",\n BAD_REQUEST = \"BadRequestError\",\n FORBIDDEN = \"ForbiddenError\",\n}\n\nexport type ErrorDetailType = {\n field: string | number;\n message?: (string | number)[];\n};\n\nexport abstract class ApiError extends Error {\n constructor(\n public type: ErrorType,\n public message: string = \"Error\",\n public errors: ErrorDetailType[]\n ) {\n super(type);\n this.type = type;\n this.message = message;\n this.errors = errors;\n }\n\n public static handle(err: ApiError, res: Response) {\n switch (err.type) {\n case ErrorType.BAD_TOKEN:\n case ErrorType.TOKEN_EXPIRED:\n case ErrorType.UNAUTHORIZED:\n new BadTokenResponse(err.message, err.errors).send(res);\n break;\n case ErrorType.ACCESS_TOKEN:\n new AccessTokenErrorResponse(err.message, err.errors).send(res);\n break;\n case ErrorType.INTERNAL:\n new InternalErrorResponse(err.message, err.errors).send(res);\n break;\n case ErrorType.NOT_FOUND:\n case ErrorType.NO_ENTRY:\n case ErrorType.NO_DATA:\n new NoFoundResponse(err.message, err.errors).send(res);\n break;\n case ErrorType.BAD_REQUEST:\n new BadRequestResponse(err.message, err.errors).send(res);\n break;\n case ErrorType.FORBIDDEN:\n new ForbiddenResponse(err.message, err.errors).send(res);\n break;\n default:\n let messsage = err.message;\n messsage =\n sanitizedConfig.ENVIRONMENT !== ENVIRONMENTS.production\n ? messsage\n : \"Something went wrong!\";\n new InternalErrorResponse(messsage, err.errors).send(res);\n break;\n }\n }\n}\n\nexport class BadTokenError extends ApiError {\n constructor(\n message: string = \"Invalid token\",\n errors: ErrorDetailType[] = []\n ) {\n super(ErrorType.BAD_TOKEN, message, errors);\n }\n}\n\nexport class TokenExpiredError extends ApiError {\n constructor(\n message: string = \"Token expired\",\n errors: ErrorDetailType[] = []\n ) {\n super(ErrorType.TOKEN_EXPIRED, message, errors);\n }\n}\n\nexport class AuthFailureError extends ApiError {\n constructor(\n message: string = \"Invalid Credentials\",\n errors: ErrorDetailType[] = []\n ) {\n super(ErrorType.UNAUTHORIZED, message, errors);\n }\n}\n\nexport class AccessTokenError extends ApiError {\n constructor(\n message: string = \"Invalid access token\",\n errors: ErrorDetailType[] = []\n ) {\n super(ErrorType.ACCESS_TOKEN, message, errors);\n }\n}\nexport class InternalError extends ApiError {\n constructor(\n message: string = \"Internal error\",\n errors: ErrorDetailType[] = []\n ) {\n message =\n sanitizedConfig.ENVIRONMENT !== ENVIRONMENTS.production\n ? message\n : \"Something went wrong!\";\n super(ErrorType.INTERNAL, message, errors);\n }\n}\n\nexport class NotFoundError extends ApiError {\n constructor(message: string = \"Not found\", errors: ErrorDetailType[] = []) {\n super(ErrorType.NOT_FOUND, message, errors);\n }\n}\n\nexport class NoEntryError extends ApiError {\n constructor(\n message: string = \"Entry don't exists\",\n errors: ErrorDetailType[] = []\n ) {\n super(ErrorType.NO_ENTRY, message, errors);\n }\n}\n\nexport class NoDataError extends ApiError {\n constructor(message: string = \"No data\", errors: ErrorDetailType[] = []) {\n super(ErrorType.NO_DATA, message, errors);\n }\n}\n\nexport class BadRequestError extends ApiError {\n constructor(message: string = \"Bad request\", errors: ErrorDetailType[] = []) {\n super(ErrorType.BAD_REQUEST, message, errors);\n }\n}\n\nexport class ForbiddenError extends ApiError {\n constructor(\n message: string = \"Permission denied\",\n errors: ErrorDetailType[] = []\n ) {\n super(ErrorType.FORBIDDEN, message, errors);\n }\n}\n","import winston, { format } from \"winston\";\nimport fs from \"fs\";\nimport path from \"path\";\nimport DailyRotateFile from \"winston-daily-rotate-file\";\nimport { sanitizedConfig } from \"@/config/config\";\n\nlet dir = sanitizedConfig.LOG_DIR;\nif (!dir) {\n dir = path.resolve(\"logs\");\n}\n\nif (!fs.existsSync(dir)) {\n fs.mkdirSync(dir);\n}\n\nconst logfileRotateTransport = new DailyRotateFile({\n level: sanitizedConfig.LOG_LEVEL,\n // @ts-ignore\n filename: dir + \"/%DATE%.log\",\n datePattern: \"YYYY-MM-DD\",\n zippedArchive: true,\n handleExceptions: true,\n maxSize: \"20m\",\n maxFiles: \"14d\",\n format: format.combine(\n format.errors({ stack: true }),\n format.timestamp(),\n format.json()\n ),\n});\n\nconst consoleTransport = new winston.transports.Console({\n level: process.env.LOG_LEVEL,\n format: format.combine(\n format.colorize({ all: true }),\n format.timestamp({\n format: \"YYYY-MM-DD hh:mm:ss.SSS A\",\n }),\n format.align(),\n format.printf(\n (info) => `[${info.timestamp}] ${info.level}: ${info.message}`\n )\n ),\n});\n\nexport const logger = winston.createLogger({\n transports: [consoleTransport, logfileRotateTransport],\n exceptionHandlers: [logfileRotateTransport],\n exitOnError: false,\n});\n","import { Request, Response, NextFunction } from \"express\";\nimport { ZodSchema } from \"zod\";\n\nimport { BadRequestError } from \"@/core/ApiError\";\nimport { ValidationSource } from \"@/types/validation\";\n\nexport const schemaValidator = (type: ValidationSource, schema: ZodSchema) => {\n return (req: Request, res: Response, next: NextFunction) => {\n const result = schema.safeParse(req[type]);\n\n if (!result.success) {\n const errors = Object.entries(result.error.flatten().fieldErrors).map(\n ([key, value]) => ({\n field: key,\n message: value,\n })\n );\n next(new BadRequestError(\"Bad request\", errors));\n } else {\n next();\n }\n };\n};\n\n","import jsonwebtoken from \"jsonwebtoken\";\nimport { Request, Response, NextFunction } from \"express\";\n\nimport { BadTokenError, TokenExpiredError } from \"@/core/ApiError\";\nimport { JwtPayload, JwtService } from \"@/services/jwt.service\";\n\nexport const verifyToken = async (\n req: Request,\n res: Response,\n next: NextFunction\n) => {\n try {\n const { token } = req?.session;\n if (!token) {\n next(new BadTokenError(\"Authentication token is missing\"));\n }\n\n const decoded = JwtService.verify(token) as JwtPayload;\n\n req.user = decoded;\n next();\n } catch (error) {\n if (error instanceof jsonwebtoken.TokenExpiredError) {\n next(new TokenExpiredError());\n } else if (error instanceof jsonwebtoken.JsonWebTokenError) {\n next(new BadTokenError());\n } else {\n next(new BadTokenError());\n }\n }\n};\n","import { sanitizedConfig } from \"@/config/config\";\nimport jsonwebtoken, { SignOptions, VerifyOptions } from \"jsonwebtoken\";\n\nexport interface JwtPayload {\n _id: string;\n email: string;\n}\n\nexport class JwtService {\n static sign(\n payload: string | Buffer | object,\n signOptions: SignOptions = {}\n ): string {\n const token = jsonwebtoken.sign(\n payload,\n sanitizedConfig.JWT_KEY,\n signOptions\n );\n return token;\n }\n\n static verify(token: string, verifyOptions?: VerifyOptions) {\n const decoded = jsonwebtoken.verify(\n token,\n sanitizedConfig.JWT_KEY,\n verifyOptions\n );\n return decoded;\n }\n\n static generatePayload<T extends JwtPayload>(user: T): T {\n return {\n _id: user._id.toString(),\n email: user.email,\n } as T;\n }\n}\n","import { sanitizedConfig } from \"@/config/config\";\nimport bcrypt from \"bcrypt\";\n\nexport class Password {\n static hashPassword(password: string): Promise<string> {\n return new Promise((resolve, reject) => {\n bcrypt.hash(password, sanitizedConfig.SALT_ROUNDS, function (err, hash) {\n if (err) {\n reject(err.message);\n }\n resolve(hash);\n });\n });\n }\n\n static comparePassword(\n password: string,\n hashedPassword: string\n ): Promise<string | boolean> {\n return new Promise((resolve, reject) => {\n bcrypt.compare(password, hashedPassword, function (err, result) {\n if (err) {\n reject(err.message);\n }\n resolve(result);\n });\n });\n }\n}\n\n","export enum ValidationSource {\n BODY = 'body',\n HEADER = 'headers',\n QUERY = 'query',\n PARAM = 'params',\n }","import { Request, Response, NextFunction } from \"express\";\n\ntype AsyncFunction = (\n req: Request,\n res: Response,\n next: NextFunction\n) => Promise<any>;\n\nexport const asyncHandler =\n (execution: AsyncFunction) =>\n async (req: Request, res: Response, next: NextFunction) => {\n try {\n await execution(req, res, next);\n } catch (err) {\n next(err);\n }\n };\n"],"mappings":"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","names":["StatusCode","ResponseStatusCode","config","ErrorType","path","fs","DailyRotateFile","winston","import_jsonwebtoken","jsonwebtoken","jsonwebtoken","bcrypt","ValidationSource"]}
|
package/dist/index.mjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/constants/environments.ts","../src/core/ApiResponse.ts","../src/config/config.ts","../src/core/ApiError.ts","../src/core/Logger.ts","../src/middlewares/schemaValidator.ts","../src/middlewares/verifyToken.ts","../src/services/jwt.service.ts","../src/services/password.service.ts","../src/types/validation.ts","../src/utils/asyncHandler.ts"],"sourcesContent":["export const ENVIRONMENTS = {\n production: \"production\",\n development: \"development\",\n testing: \"testing\",\n};\n","import { Response } from \"express\";\nimport { ErrorDetailType } from \"@/core/ApiError\";\n\nexport enum StatusCode {\n SUCCESS = \"10000\",\n FAILURE = \"10001\",\n RETRY = \"10002\",\n IN_VALID_ACCESS_TOKEN = \"10003\",\n}\n\nexport enum ResponseStatusCode {\n SUCCESS = 200,\n CREATED = 201,\n ACCEPTED = 202,\n NO_CONTENT = 204,\n\n MOVED_PERMANENTLY = 301,\n FOUND = 302,\n NOT_MODIFIED = 304,\n TEMPORARY_REDIRECT = 307,\n PERMANENT_REDIRECT = 308,\n\n BAD_REQUEST = 400,\n UNAUTHORIZED = 401,\n PAYMENT_REQUIRED = 402,\n FORBIDDEN = 403,\n NOT_FOUND = 404,\n METHOD_NOT_ALLOWED = 405,\n NOT_ACCEPTABLE = 406,\n CONFLICT = 409,\n GONE = 410,\n PAYLOAD_TOO_LARGE = 413,\n UNSUPPORTED_MEDIA_TYPE = 415,\n UNPROCESSABLE_ENTITY = 422,\n TOO_MANY_REQUESTS = 429,\n\n INTERNAL_ERROR = 500,\n NOT_IMPLEMENTED = 501,\n BAD_GATEWAY = 502,\n SERVICE_UNAVAILABLE = 503,\n GATEWAY_TIMEOUT = 504,\n}\n\nexport abstract class ApiResponse {\n public message: string;\n public statusCode: string | undefined;\n public status: number;\n\n constructor(status: number, message: string, statusCode?: string) {\n this.message = message;\n this.status = status;\n if (statusCode) {\n this.statusCode = statusCode;\n }\n }\n\n public prepare<T extends ApiResponse>(\n res: Response,\n response: T,\n headers: { [key: string]: string } = {}\n ) {\n for (const [key, value] of Object.entries(headers)) {\n res.append(key, value);\n }\n res.status(this.status).send(this.sanitize(response));\n }\n\n public send(res: Response, headers: { [key: string]: string } = {}) {\n this.prepare<ApiResponse>(res, this, headers);\n }\n\n private sanitize<T extends ApiResponse>(response: T) {\n const clone = {} as T;\n Object.assign(clone, response);\n\n delete clone[\"statusCode\"];\n\n for (const key in clone) {\n const typedKey = key as keyof T;\n if (clone[typedKey] === undefined) {\n delete clone[typedKey];\n }\n }\n return clone;\n }\n}\n\nexport class SuccessResponse<T> extends ApiResponse {\n constructor(\n responseStatusCode:\n | ResponseStatusCode.SUCCESS\n | ResponseStatusCode.CREATED\n | ResponseStatusCode.ACCEPTED\n | ResponseStatusCode.NO_CONTENT,\n message: string,\n public data: T\n ) {\n super(responseStatusCode, message, StatusCode.SUCCESS);\n this.data = data;\n }\n\n send(res: Response) {\n this.prepare<SuccessResponse<T>>(res, this, {});\n }\n}\n\nexport class AccessTokenErrorResponse extends ApiResponse {\n protected instruction: string = \"refresh_token\";\n public errors: ErrorDetailType[];\n\n constructor(message: string, errors: ErrorDetailType[]) {\n super(\n ResponseStatusCode.UNAUTHORIZED,\n message,\n StatusCode.IN_VALID_ACCESS_TOKEN\n );\n this.errors = errors || [];\n }\n\n send(res: Response, headers: { [key: string]: string } = {}) {\n headers.instruction = this.instruction;\n this.prepare<AccessTokenErrorResponse>(res, this, headers);\n }\n}\n\nexport class BadTokenResponse extends ApiResponse {\n public errors: ErrorDetailType[];\n\n constructor(message: string, errors: ErrorDetailType[]) {\n super(ResponseStatusCode.UNAUTHORIZED, message, StatusCode.FAILURE);\n this.errors = errors || [];\n }\n}\n\nexport class BadRequestResponse extends ApiResponse {\n public errors: ErrorDetailType[];\n\n constructor(message: string, errors: ErrorDetailType[]) {\n super(ResponseStatusCode.BAD_REQUEST, message, StatusCode.FAILURE);\n this.errors = errors || [];\n }\n}\n\nexport class InternalErrorResponse extends ApiResponse {\n public errors: ErrorDetailType[];\n\n constructor(message: string, errors: ErrorDetailType[]) {\n super(ResponseStatusCode.INTERNAL_ERROR, message, StatusCode.FAILURE);\n this.errors = errors || [];\n }\n}\n\nexport class NoFoundResponse extends ApiResponse {\n public errors: ErrorDetailType[];\n\n constructor(message: string, errors: ErrorDetailType[]) {\n super(ResponseStatusCode.NOT_FOUND, message, StatusCode.FAILURE);\n this.errors = errors || [];\n }\n}\n\nexport class ForbiddenResponse extends ApiResponse {\n public errors: ErrorDetailType[];\n\n constructor(message: string, errors: ErrorDetailType[]) {\n super(ResponseStatusCode.FORBIDDEN, message, StatusCode.FAILURE);\n this.errors = errors || [];\n }\n}\n","import \"dotenv/config\";\n\ninterface Env {\n ENVIRONMENT: string;\n LOG_DIR: string;\n LOG_LEVEL: string;\n SALT_ROUNDS: number;\n JWT_KEY: string;\n}\n\nconst getConfig = (): Env => {\n return {\n ENVIRONMENT: process.env.ENVIRONMENT,\n LOG_DIR: process.env.LOG_DIR,\n LOG_LEVEL: process.env.LOG_LEVEL,\n SALT_ROUNDS: parseInt(process.env.SALT_ROUNDS),\n JWT_KEY: process.env.JWT_KEY,\n };\n};\n\nconst getSanitizedConfig = (config: Env): Env => {\n for (const [key, value] of Object.entries(config)) {\n if (!value) {\n throw new Error(`Missing key ${key} in config.env`);\n }\n }\n\n return config;\n};\n\nconst config = getConfig();\nexport const sanitizedConfig = getSanitizedConfig(config);\n","import { Response } from \"express\";\n\nimport {\n AccessTokenErrorResponse,\n BadRequestResponse,\n BadTokenResponse,\n ForbiddenResponse,\n InternalErrorResponse,\n NoFoundResponse,\n} from \"@/core/ApiResponse\";\nimport { sanitizedConfig } from \"@/config/config\";\nimport { ENVIRONMENTS } from \"@/constants/environments\";\n\nexport enum ErrorType {\n BAD_TOKEN = \"BadTokenError\",\n TOKEN_EXPIRED = \"TokenExpiredError\",\n UNAUTHORIZED = \"AuthFailureError\",\n ACCESS_TOKEN = \"AccessTokenError\",\n INTERNAL = \"InternalError\",\n NOT_FOUND = \"NotFoundError\",\n NO_ENTRY = \"NoEntryError\",\n NO_DATA = \"NoDataError\",\n BAD_REQUEST = \"BadRequestError\",\n FORBIDDEN = \"ForbiddenError\",\n}\n\nexport type ErrorDetailType = {\n field: string | number;\n message?: (string | number)[];\n};\n\nexport abstract class ApiError extends Error {\n constructor(\n public type: ErrorType,\n public message: string = \"Error\",\n public errors: ErrorDetailType[]\n ) {\n super(type);\n this.type = type;\n this.message = message;\n this.errors = errors;\n }\n\n public static handle(err: ApiError, res: Response) {\n switch (err.type) {\n case ErrorType.BAD_TOKEN:\n case ErrorType.TOKEN_EXPIRED:\n case ErrorType.UNAUTHORIZED:\n new BadTokenResponse(err.message, err.errors).send(res);\n break;\n case ErrorType.ACCESS_TOKEN:\n new AccessTokenErrorResponse(err.message, err.errors).send(res);\n break;\n case ErrorType.INTERNAL:\n new InternalErrorResponse(err.message, err.errors).send(res);\n break;\n case ErrorType.NOT_FOUND:\n case ErrorType.NO_ENTRY:\n case ErrorType.NO_DATA:\n new NoFoundResponse(err.message, err.errors).send(res);\n break;\n case ErrorType.BAD_REQUEST:\n new BadRequestResponse(err.message, err.errors).send(res);\n break;\n case ErrorType.FORBIDDEN:\n new ForbiddenResponse(err.message, err.errors).send(res);\n break;\n default:\n let messsage = err.message;\n messsage =\n sanitizedConfig.ENVIRONMENT !== ENVIRONMENTS.production\n ? messsage\n : \"Something went wrong!\";\n new InternalErrorResponse(messsage, err.errors).send(res);\n break;\n }\n }\n}\n\nexport class BadTokenError extends ApiError {\n constructor(\n message: string = \"Invalid token\",\n errors: ErrorDetailType[] = []\n ) {\n super(ErrorType.BAD_TOKEN, message, errors);\n }\n}\n\nexport class TokenExpiredError extends ApiError {\n constructor(\n message: string = \"Token expired\",\n errors: ErrorDetailType[] = []\n ) {\n super(ErrorType.TOKEN_EXPIRED, message, errors);\n }\n}\n\nexport class AuthFailureError extends ApiError {\n constructor(\n message: string = \"Invalid Credentials\",\n errors: ErrorDetailType[] = []\n ) {\n super(ErrorType.UNAUTHORIZED, message, errors);\n }\n}\n\nexport class AccessTokenError extends ApiError {\n constructor(\n message: string = \"Invalid access token\",\n errors: ErrorDetailType[] = []\n ) {\n super(ErrorType.ACCESS_TOKEN, message, errors);\n }\n}\nexport class InternalError extends ApiError {\n constructor(\n message: string = \"Internal error\",\n errors: ErrorDetailType[] = []\n ) {\n message =\n sanitizedConfig.ENVIRONMENT !== ENVIRONMENTS.production\n ? message\n : \"Something went wrong!\";\n super(ErrorType.INTERNAL, message, errors);\n }\n}\n\nexport class NotFoundError extends ApiError {\n constructor(message: string = \"Not found\", errors: ErrorDetailType[] = []) {\n super(ErrorType.NOT_FOUND, message, errors);\n }\n}\n\nexport class NoEntryError extends ApiError {\n constructor(\n message: string = \"Entry don't exists\",\n errors: ErrorDetailType[] = []\n ) {\n super(ErrorType.NO_ENTRY, message, errors);\n }\n}\n\nexport class NoDataError extends ApiError {\n constructor(message: string = \"No data\", errors: ErrorDetailType[] = []) {\n super(ErrorType.NO_DATA, message, errors);\n }\n}\n\nexport class BadRequestError extends ApiError {\n constructor(message: string = \"Bad request\", errors: ErrorDetailType[] = []) {\n super(ErrorType.BAD_REQUEST, message, errors);\n }\n}\n\nexport class ForbiddenError extends ApiError {\n constructor(\n message: string = \"Permission denied\",\n errors: ErrorDetailType[] = []\n ) {\n super(ErrorType.FORBIDDEN, message, errors);\n }\n}\n","import winston, { format } from \"winston\";\nimport fs from \"fs\";\nimport path from \"path\";\nimport DailyRotateFile from \"winston-daily-rotate-file\";\nimport { sanitizedConfig } from \"@/config/config\";\n\nlet dir = sanitizedConfig.LOG_DIR;\nif (!dir) {\n dir = path.resolve(\"logs\");\n}\n\nif (!fs.existsSync(dir)) {\n fs.mkdirSync(dir);\n}\n\nconst logfileRotateTransport = new DailyRotateFile({\n level: sanitizedConfig.LOG_LEVEL,\n // @ts-ignore\n filename: dir + \"/%DATE%.log\",\n datePattern: \"YYYY-MM-DD\",\n zippedArchive: true,\n handleExceptions: true,\n maxSize: \"20m\",\n maxFiles: \"14d\",\n format: format.combine(\n format.errors({ stack: true }),\n format.timestamp(),\n format.json()\n ),\n});\n\nconst consoleTransport = new winston.transports.Console({\n level: process.env.LOG_LEVEL,\n format: format.combine(\n format.colorize({ all: true }),\n format.timestamp({\n format: \"YYYY-MM-DD hh:mm:ss.SSS A\",\n }),\n format.align(),\n format.printf(\n (info) => `[${info.timestamp}] ${info.level}: ${info.message}`\n )\n ),\n});\n\nexport const logger = winston.createLogger({\n transports: [consoleTransport, logfileRotateTransport],\n exceptionHandlers: [logfileRotateTransport],\n exitOnError: false,\n});\n","import { Request, Response, NextFunction } from \"express\";\nimport { ZodSchema } from \"zod\";\n\nimport { BadRequestError } from \"@/core/ApiError\";\nimport { ValidationSource } from \"@/types/validation\";\n\nexport const schemaValidator = (type: ValidationSource, schema: ZodSchema) => {\n return (req: Request, res: Response, next: NextFunction) => {\n const result = schema.safeParse(req[type]);\n\n if (!result.success) {\n const errors = Object.entries(result.error.flatten().fieldErrors).map(\n ([key, value]) => ({\n field: key,\n message: value,\n })\n );\n next(new BadRequestError(\"Bad request\", errors));\n } else {\n next();\n }\n };\n};\n\n","import jsonwebtoken from \"jsonwebtoken\";\nimport { Request, Response, NextFunction } from \"express\";\n\nimport { BadTokenError, TokenExpiredError } from \"@/core/ApiError\";\nimport { JwtPayload, JwtService } from \"@/services/jwt.service\";\n\nexport const verifyToken = async (\n req: Request,\n res: Response,\n next: NextFunction\n) => {\n try {\n const { token } = req?.session;\n if (!token) {\n next(new BadTokenError(\"Authentication token is missing\"));\n }\n\n const decoded = JwtService.verify(token) as JwtPayload;\n\n req.user = decoded;\n next();\n } catch (error) {\n if (error instanceof jsonwebtoken.TokenExpiredError) {\n next(new TokenExpiredError());\n } else if (error instanceof jsonwebtoken.JsonWebTokenError) {\n next(new BadTokenError());\n } else {\n next(new BadTokenError());\n }\n }\n};\n","import { sanitizedConfig } from \"@/config/config\";\nimport jsonwebtoken, { SignOptions, VerifyOptions } from \"jsonwebtoken\";\n\nexport interface JwtPayload {\n _id: string;\n email: string;\n}\n\nexport class JwtService {\n static sign(\n payload: string | Buffer | object,\n signOptions: SignOptions = {}\n ): string {\n const token = jsonwebtoken.sign(\n payload,\n sanitizedConfig.JWT_KEY,\n signOptions\n );\n return token;\n }\n\n static verify(token: string, verifyOptions?: VerifyOptions) {\n const decoded = jsonwebtoken.verify(\n token,\n sanitizedConfig.JWT_KEY,\n verifyOptions\n );\n return decoded;\n }\n\n static generatePayload<T extends JwtPayload>(user: T): T {\n return {\n _id: user._id.toString(),\n email: user.email,\n } as T;\n }\n}\n","import { sanitizedConfig } from \"@/config/config\";\nimport bcrypt from \"bcrypt\";\n\nexport class Password {\n static hashPassword(password: string): Promise<string> {\n return new Promise((resolve, reject) => {\n bcrypt.hash(password, sanitizedConfig.SALT_ROUNDS, function (err, hash) {\n if (err) {\n reject(err.message);\n }\n resolve(hash);\n });\n });\n }\n\n static comparePassword(\n password: string,\n hashedPassword: string\n ): Promise<string | boolean> {\n return new Promise((resolve, reject) => {\n bcrypt.compare(password, hashedPassword, function (err, result) {\n if (err) {\n reject(err.message);\n }\n resolve(result);\n });\n });\n }\n}\n\n","export enum ValidationSource {\n BODY = 'body',\n HEADER = 'headers',\n QUERY = 'query',\n PARAM = 'params',\n }","import { Request, Response, NextFunction } from \"express\";\n\ntype AsyncFunction = (\n req: Request,\n res: Response,\n next: NextFunction\n) => Promise<any>;\n\nexport const asyncHandler =\n (execution: AsyncFunction) =>\n async (req: Request, res: Response, next: NextFunction) => {\n try {\n await execution(req, res, next);\n } catch (err) {\n next(err);\n }\n };\n"],"mappings":"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","names":["StatusCode","ResponseStatusCode","config","ErrorType","jsonwebtoken","jsonwebtoken","ValidationSource"]}
|