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
+40 -62
View File
@@ -1,67 +1,45 @@
import { ApiProperty } from '@nestjs/swagger';
import { Type } from 'class-transformer';
import { IsLatitude, IsLongitude } from 'class-validator';
import { ValidateBoolean, ValidateDate } from 'src/validation';
import { createZodDto } from 'nestjs-zod';
import { isoDatetimeToDate, latitudeSchema, longitudeSchema, stringToBool } from 'src/validation';
import z from 'zod';
export class MapReverseGeocodeDto {
@ApiProperty({ format: 'double', description: 'Latitude (-90 to 90)' })
@Type(() => Number)
@IsLatitude({ message: ({ property }) => `${property} must be a number between -90 and 90` })
lat!: number;
const MapReverseGeocodeSchema = z
.object({
lat: z.coerce.number().meta({ format: 'double' }).pipe(latitudeSchema).describe('Latitude (-90 to 90)'),
lon: z.coerce.number().meta({ format: 'double' }).pipe(longitudeSchema).describe('Longitude (-180 to 180)'),
})
.meta({ id: 'MapReverseGeocodeDto' });
@ApiProperty({ format: 'double', description: 'Longitude (-180 to 180)' })
@Type(() => Number)
@IsLongitude({ message: ({ property }) => `${property} must be a number between -180 and 180` })
lon!: number;
}
const MapReverseGeocodeResponseSchema = z
.object({
city: z.string().nullable().describe('City name'),
state: z.string().nullable().describe('State/Province name'),
country: z.string().nullable().describe('Country name'),
})
.meta({ id: 'MapReverseGeocodeResponseDto' });
export class MapReverseGeocodeResponseDto {
@ApiProperty({ description: 'City name' })
city!: string | null;
const MapMarkerSchema = z
.object({
isArchived: stringToBool.optional().describe('Filter by archived status'),
isFavorite: stringToBool.optional().describe('Filter by favorite status'),
fileCreatedAfter: isoDatetimeToDate.optional().describe('Filter assets created after this date'),
fileCreatedBefore: isoDatetimeToDate.optional().describe('Filter assets created before this date'),
withPartners: stringToBool.optional().describe('Include partner assets'),
withSharedAlbums: stringToBool.optional().describe('Include shared album assets'),
})
.meta({ id: 'MapMarkerDto' });
@ApiProperty({ description: 'State/Province name' })
state!: string | null;
const MapMarkerResponseSchema = z
.object({
id: z.string().describe('Asset ID'),
lat: z.number().meta({ format: 'double' }).describe('Latitude'),
lon: z.number().meta({ format: 'double' }).describe('Longitude'),
city: z.string().nullable().describe('City name'),
state: z.string().nullable().describe('State/Province name'),
country: z.string().nullable().describe('Country name'),
})
.meta({ id: 'MapMarkerResponseDto' });
@ApiProperty({ description: 'Country name' })
country!: string | null;
}
export class MapMarkerDto {
@ValidateBoolean({ optional: true, description: 'Filter by archived status' })
isArchived?: boolean;
@ValidateBoolean({ optional: true, description: 'Filter by favorite status' })
isFavorite?: boolean;
@ValidateDate({ optional: true, description: 'Filter assets created after this date' })
fileCreatedAfter?: Date;
@ValidateDate({ optional: true, description: 'Filter assets created before this date' })
fileCreatedBefore?: Date;
@ValidateBoolean({ optional: true, description: 'Include partner assets' })
withPartners?: boolean;
@ValidateBoolean({ optional: true, description: 'Include shared album assets' })
withSharedAlbums?: boolean;
}
export class MapMarkerResponseDto {
@ApiProperty({ description: 'Asset ID' })
id!: string;
@ApiProperty({ format: 'double', description: 'Latitude' })
lat!: number;
@ApiProperty({ format: 'double', description: 'Longitude' })
lon!: number;
@ApiProperty({ description: 'City name' })
city!: string | null;
@ApiProperty({ description: 'State/Province name' })
state!: string | null;
@ApiProperty({ description: 'Country name' })
country!: string | null;
}
export class MapReverseGeocodeDto extends createZodDto(MapReverseGeocodeSchema) {}
export class MapReverseGeocodeResponseDto extends createZodDto(MapReverseGeocodeResponseSchema) {}
export class MapMarkerDto extends createZodDto(MapMarkerSchema) {}
export class MapMarkerResponseDto extends createZodDto(MapMarkerResponseSchema) {}