프로그래밍/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이 아니면 동작하지 않겠지만, 필요로 하는 사람들이 있을 거 같아 공유한다.
반응형