如何防止swagger传播嵌套的DTO属性

l2osamch  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(188)

我正在创建一个查询:@Query() query: AnalyticsRequestDTO<G>用于我的GET端点,它包含一个DTO,如下所示:

export class AnalyticsRequestDTO<
        G extends GroupableKeys,
        P extends PopulateableKeys<G> | undefined = undefined
    >
    implements AggregateRunLogAnalyticsOptions<G, P>
{
    @IsObject()
    @IsOptional()
    @ApiProperty({
        description: 'Filters to apply logs',
        required: false,
    })
    filter: AnalyticsFilterDTO = {}

    @IsArray()
    @ApiProperty({
        description: 'The fields to group by',
        required: false,
    })
    groupBy: G[]

    @IsArray()
    @IsOptional()
    @ApiProperty({
        description: 'The fields to populate',
        type: [String],
        required: false,
    })
    populate?: P[]
}

这里的问题是AnalyticsFilterDTO正在扩散,就像你在下一张图片中看到的那样:

我想知道如何防止这种情况发生,因为正常的行为是发送 Package 在过滤器对象中的查询(即,{ filter:{ ruleId:“...”,appId:'..',... })。如果你按照斯瓦格的建议发送,它会失败。
下面是完整的控制器:

@Get('/app/:appId/pages')
    @ApiOperation({
        summary: 'Get rule statistics for all components in an application',
    })
    @ApiResponse({
        description: 'Aggregated analytics',
        type: AnalyticsResultsDTO,
        status: HttpStatus.OK,
    })
    @HttpCode(HttpStatus.OK)
    @ApiQuery({ type: AnalyticsRequestDTO })
    public async getPageRuleStatistics<G extends GroupableKeys>(
        @Param('appId', MongoIdPipe) applicationId: string,
        @Query() query: AnalyticsRequestDTO<G>,
        @Query('forceRebuild', new DefaultValuePipe(false), ParseBoolPipe)
        forceRebuild = false
    ): Promise<AnalyticsResultsDTO<G>> {
        const { filter, groupBy, populate } = query
        // check groupBy
        if (!AnalyticsController.isGroupableKeyArray(groupBy)) {
            throw new BadRequestException(
                'groupBy must be an array of groupable keys'
            )
        }

        const runId = filter['runId']
        if (runId) {
            if (!isMongoId(runId))
                throw new BadRequestException(`Invalid runId ${runId}`)
            await this.analytics.buildRunLogAnalytics(runId, forceRebuild)
        }

        const analytics = await this.analytics.aggregateComponentAnalytics<G>(
            applicationId,
            'page',
            { filter, groupBy, populate }
        )

        return new AnalyticsResultsDTO(analytics)
    }

这是正在传播的DTO:

export class AnalyticsFilterDTO {
    @IsOptional()
    @IsMongoId()
    @ApiProperty({
        type: String,
        required: false,
    })
    runId?: string | Types.ObjectId

    @IsOptional()
    @IsMongoId()
    @ApiProperty({
        type: String,
        required: false,
    })
    ruleId?: string | Types.ObjectId

    @IsOptional()
    @IsEnum(RuleType)
    @ApiProperty({
        enum: RuleType,
        required: false,
    })
    ruleType?: RuleType

    @IsOptional()
    @IsUUID()
    @ApiProperty({ required: false })
    pageId?: string

    @IsOptional()
    @IsString()
    @ApiProperty({ required: false })
    componentId?: string

    @IsOptional()
    @IsEnum(PageComponentType)
    @ApiProperty({
        enum: PageComponentType,
        required: false,
    })
    componentType?: PageComponentType
}

有什么预防方法吗?

gt0wga4j

gt0wga4j1#

既然你使用dto作为查询,我认为它不可能有一个嵌套对象。
如果你在请求的主体中使用它,你可以设置属性类型,这将正确地显示所需的有效负载:

@ApiProperty({
    description: 'Filters to apply logs',
    required: false,
    type: AnalyticsFilterDTO,
})

相关问题