При создании документации к приложению (на NestJS + PrismaORM) при помощи Swagger, я столкнулся с тем, что мне часто приходиться дублировать код, например на эндпоит приходит объект вида
{name: string}
, а вернуть нужно объект типа
{id: UUID, name: string}
. В таком случае, такие параметры, как пример и тип поля
name
придется продублировать из DTO в reponse.
Чтобы этого избежать, я создаю
*.entity.ts
и в нем прописываю валидацию и типизацию, например:
export class AchievementEntity implements Achievement {
@ApiProperty({ example: '4028949b-0931-4954-a522-b36afeeb84f4' })
id: string;
@ApiProperty({ example: 'ICPC winner' })
@IsNotEmpty()
@IsString()
data: string;
А в файлах
*.dto.ts
и
*.response.ts
с помощью
MappedTypes генерирую соответствующие DTO и reponse.
Так выглядит
*.dto.ts
:
export class CreateAchievementDTO extends PickType(AchievementEntity, ['data'] as const) {}
export class UpdateAchievementDTO extends PartialType(CreateAchievementDTO) {}
А так
*.response.ts
:
export class AchievementResponse extends AchievementEntity {
constructor(achievement: Partial<AchievementEntity>) {
super();
Object.assign(this, achievement);
}
}
Является ли такой подход к созданию документации оптимальным?