refactor!: migrate class-validator to zod (#26597)

This commit is contained in:
Timon
2026-04-14 23:39:03 +02:00
committed by GitHub
parent 3753b7a4d1
commit 7d8f843be6
318 changed files with 7830 additions and 8316 deletions
+31 -25
View File
@@ -1,34 +1,40 @@
import { ApiProperty } from '@nestjs/swagger';
import { ArrayMinSize } from 'class-validator';
import { createZodDto } from 'nestjs-zod';
import { Stack } from 'src/database';
import { AssetResponseDto, mapAsset } from 'src/dtos/asset-response.dto';
import { AssetResponseSchema, mapAsset } from 'src/dtos/asset-response.dto';
import { AuthDto } from 'src/dtos/auth.dto';
import { ValidateUUID } from 'src/validation';
import z from 'zod';
export class StackCreateDto {
@ValidateUUID({ each: true, description: 'Asset IDs (first becomes primary, min 2)' })
@ArrayMinSize(2)
assetIds!: string[];
}
const StackSearchSchema = z
.object({
primaryAssetId: z.uuidv4().optional().describe('Filter by primary asset ID'),
})
.meta({ id: 'StackSearchDto' });
export class StackSearchDto {
@ValidateUUID({ optional: true, description: 'Filter by primary asset ID' })
primaryAssetId?: string;
}
const StackCreateSchema = z
.object({
assetIds: z.array(z.uuidv4()).min(2).describe('Asset IDs (first becomes primary, min 2)'),
})
.meta({ id: 'StackCreateDto' });
export class StackUpdateDto {
@ValidateUUID({ optional: true, description: 'Primary asset ID' })
primaryAssetId?: string;
}
const StackUpdateSchema = z
.object({
primaryAssetId: z.uuidv4().optional().describe('Primary asset ID'),
})
.meta({ id: 'StackUpdateDto' });
export class StackResponseDto {
@ApiProperty({ description: 'Stack ID' })
id!: string;
@ApiProperty({ description: 'Primary asset ID' })
primaryAssetId!: string;
@ApiProperty({ description: 'Stack assets' })
assets!: AssetResponseDto[];
}
const StackResponseSchema = z
.object({
id: z.string().describe('Stack ID'),
primaryAssetId: z.string().describe('Primary asset ID'),
assets: z.array(AssetResponseSchema),
})
.describe('Stack response')
.meta({ id: 'StackResponseDto' });
export class StackSearchDto extends createZodDto(StackSearchSchema) {}
export class StackCreateDto extends createZodDto(StackCreateSchema) {}
export class StackUpdateDto extends createZodDto(StackUpdateSchema) {}
export class StackResponseDto extends createZodDto(StackResponseSchema) {}
export const mapStack = (stack: Stack, { auth }: { auth?: AuthDto }) => {
const primary = stack.assets.filter((asset) => asset.id === stack.primaryAssetId);