Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import { HttpStatus as status } from '@nestjs/common'
- import { OutgoingMessage } from 'node:http'
- import { Response } from 'express'
- import { IResponse } from '~/domain/interfaces/common.interface'
- import { Logger } from '~/infrastructure/common/helpers/logger.helper'
- import { ELoggerType } from '~/domain/enums/common.enum'
- const errorCodeMap: Record<number, string> = {
- 500: 'GENERAL_ERROR',
- 502: 'SERVICE_ERROR',
- 503: 'SERVICE_UNAVAILABLE',
- 504: 'SERVICE_TIMEOUT',
- 409: 'DUPLICATE_RESOURCE',
- 422: 'INVALID_REQUEST',
- 412: 'REQUEST_COULD_NOT_BE_PROCESSED',
- 403: 'ACCESS_DENIED',
- 401: 'UNAUTHORIZED_TOKEN',
- 404: 'UNKNOWN_RESOURCE',
- }
- const defaultErrorCode = 'GENERAL_ERROR'
- const defaultErrorMessage = 'Application is busy, please try again later!'
- const handleErrorLogging = (error: Error): void => {
- const message = `
- =============================================
- ======== Response Exception [Error] =========
- =============================================
- name: ${error.name}
- message: ${error.message}
- stack: ${error.stack}
- =============================================
- =============================================
- =============================================
- `
- Logger.log('AppErrorException', ELoggerType.ERROR, message, error)
- }
- const createErrorResponse = (error: Error): Partial<IResponse> => {
- const statCode = status.INTERNAL_SERVER_ERROR
- const errCode = errorCodeMap[statCode] || defaultErrorCode
- const errorMessage = error.message || defaultErrorMessage
- return { stat_code: statCode, err_code: errCode, error: errorMessage }
- }
- const createApiResponse = (options: Partial<IResponse>): Partial<IResponse> => {
- let apiResponse: Partial<IResponse> = { ...options }
- if (!options.stat_code && !options.message && !options.error) {
- apiResponse.err_code = defaultErrorCode
- apiResponse.error = defaultErrorMessage
- } else if (options.errors) {
- apiResponse = { errors: options.errors }
- } else {
- const statCode = options.stat_code || status.INTERNAL_SERVER_ERROR
- apiResponse.stat_code = statCode
- apiResponse.err_code = errorCodeMap[statCode] || defaultErrorCode
- apiResponse.error = options.error || defaultErrorMessage
- }
- for (const key in apiResponse) {
- if (apiResponse[key] === undefined && key !== 'info') {
- delete apiResponse[key]
- }
- }
- return apiResponse
- }
- export const response = <T = any>(options: Partial<IResponse> | Error, res?: Response): T => {
- let apiResponse: Partial<IResponse> = {}
- if (options instanceof Error) {
- handleErrorLogging(options)
- apiResponse = createErrorResponse(options)
- } else {
- apiResponse = createApiResponse(options)
- }
- if (res instanceof OutgoingMessage) {
- const statusCode = apiResponse.errors ? status.UNPROCESSABLE_ENTITY : apiResponse.stat_code || status.INTERNAL_SERVER_ERROR
- return res.status(statusCode).json(apiResponse) as any
- }
- return apiResponse as T
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement