kakasoo

동일한 400 코드에 대해서 스웨거 에러 스키마 작성하기 본문

프로그래밍/NestJS

동일한 400 코드에 대해서 스웨거 에러 스키마 작성하기

카카수(kakasoo) 2023. 2. 5. 23:34
반응형
import { SchemaObject } from '@nestjs/swagger/dist/interfaces/open-api-spec.interface';

export const ERROR = {
  ALREADY_CREATED_EMAIL: { code: 4001, message: '이미 생성된 이메일입니다.' },
  NO_AUTH_TOKEN: { code: 4002, message: '인증이 필요합니다.' },
  IS_SAME_POSITION: { code: 4003, message: '이미지의 정렬 값이 동일한 경우가 존재합니다.' },
  CANNOT_FINDONE_ARTICLE: { code: 4004, message: '게시글을 찾지 못했습니다.' },
  SELECT_MORE_THAN_ONE_BODY_IMAGE: { code: 4005, message: '적어도 1장 이상의 이미지를 골라야 합니다.' },
  NOT_FOUND_ARTICLE_TO_COMMENT: { code: 4006, message: '댓글을 작성할 게시글을 찾지 못했습니다.' },
  TOO_MANY_REPORTED_ARTICLE: { code: 4007, message: '신고가 접수된 게시글이라 댓글 작성이 불가능합니다.' },
} as const;

type KeyOfError = keyof typeof ERROR;
type ValueOfError = (typeof ERROR)[KeyOfError];
type Push<T extends any[], U> = [...T, U];
type NTuple<N extends number, T extends any[] = []> = T['length'] extends N ? T : NTuple<N, Push<T, any>>;

export const createErrorSchemas = <T extends string[]>(errors: NTuple<T['length'], ValueOfError[]>): SchemaObject => {
  return {
    type: 'array',
    items: {
      anyOf: [...errors].map((error) => {
        return {
          properties: {
            code: { type: 'number', example: error['code'] },
            message: { type: 'string', example: error['message'] },
          },
        };
      }),
    },
  };
};

 

@ApiBadRequestResponse({
  schema: createErrorSchemas([ERROR.NOT_FOUND_ARTICLE_TO_COMMENT, ERROR.TOO_MANY_REPORTED_ARTICLE]),
})

 

더 나은 방법이 있을지 모르겠지만, 일단 swagger 문서의 표기에 맞게 anyOf에 프로퍼티를 가진 객체 배열을 주도록 만들었다.

주어진 form이 아니면 동작하지 않겠지만, 필요로 하는 사람들이 있을 거 같아 공유한다.

반응형