mirror of
https://github.com/immich-app/immich.git
synced 2026-05-18 03:10:24 +03:00
refactor!: migrate class-validator to zod (#26597)
This commit is contained in:
+40
-62
@@ -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) {}
|
||||
|
||||
Reference in New Issue
Block a user