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
+221 -2
View File
@@ -1,8 +1,12 @@
import z from 'zod';
export enum AuthType {
Password = 'password',
OAuth = 'oauth',
}
export const AuthTypeSchema = z.enum(AuthType).describe('Auth type').meta({ id: 'AuthType' });
export enum ImmichCookie {
AccessToken = 'immich_access_token',
MaintenanceToken = 'immich_maintenance_token',
@@ -13,6 +17,8 @@ export enum ImmichCookie {
OAuthCodeVerifier = 'immich_oauth_code_verifier',
}
export const ImmichCookieSchema = z.enum(ImmichCookie).describe('Immich cookie').meta({ id: 'ImmichCookie' });
export enum ImmichHeader {
ApiKey = 'x-api-key',
UserToken = 'x-immich-user-token',
@@ -23,6 +29,8 @@ export enum ImmichHeader {
Cid = 'x-immich-cid',
}
export const ImmichHeaderSchema = z.enum(ImmichHeader).describe('Immich header').meta({ id: 'ImmichHeader' });
export enum ImmichQuery {
SharedLinkKey = 'key',
SharedLinkSlug = 'slug',
@@ -30,6 +38,8 @@ export enum ImmichQuery {
SessionKey = 'sessionKey',
}
export const ImmichQuerySchema = z.enum(ImmichQuery).describe('Immich query').meta({ id: 'ImmichQuery' });
export enum AssetType {
Image = 'IMAGE',
Video = 'VIDEO',
@@ -37,11 +47,20 @@ export enum AssetType {
Other = 'OTHER',
}
export const AssetTypeSchema = z.enum(AssetType).describe('Asset type').meta({ id: 'AssetTypeEnum' });
export enum ChecksumAlgorithm {
sha1File = 'sha1', // sha1 checksum of the whole file contents
sha1Path = 'sha1-path', // sha1 checksum of "path:" plus the file path, currently used in external libraries, deprecated
/** sha1 checksum of the whole file contents */
sha1File = 'sha1',
/** sha1 checksum of "path:" plus the file path, currently used in external libraries, deprecated */
sha1Path = 'sha1-path',
}
export const ChecksumAlgorithmSchema = z
.enum(ChecksumAlgorithm)
.describe('Checksum algorithm')
.meta({ id: 'ChecksumAlgorithmEnum' });
export enum AssetFileType {
/**
* An full/large-size image extracted/converted from RAW photos
@@ -53,32 +72,44 @@ export enum AssetFileType {
EncodedVideo = 'encoded_video',
}
export const AssetFileTypeSchema = z.enum(AssetFileType).describe('Asset file type').meta({ id: 'AssetFileType' });
export enum AlbumUserRole {
Editor = 'editor',
Viewer = 'viewer',
}
export const AlbumUserRoleSchema = z.enum(AlbumUserRole).describe('Album user role').meta({ id: 'AlbumUserRole' });
export enum AssetOrder {
Asc = 'asc',
Desc = 'desc',
}
export const AssetOrderSchema = z.enum(AssetOrder).describe('Asset sort order').meta({ id: 'AssetOrder' });
export enum DatabaseAction {
Create = 'CREATE',
Update = 'UPDATE',
Delete = 'DELETE',
}
export const DatabaseActionSchema = z.enum(DatabaseAction).describe('Database action').meta({ id: 'DatabaseAction' });
export enum EntityType {
Asset = 'ASSET',
Album = 'ALBUM',
}
export const EntityTypeSchema = z.enum(EntityType).describe('Entity type').meta({ id: 'EntityType' });
export enum MemoryType {
/** pictures taken on this day X years ago */
OnThisDay = 'on_this_day',
}
export const MemoryTypeSchema = z.enum(MemoryType).describe('Memory type').meta({ id: 'MemoryType' });
export enum AssetOrderWithRandom {
// Include existing values
Asc = AssetOrder.Asc,
@@ -87,6 +118,11 @@ export enum AssetOrderWithRandom {
Random = 'random',
}
export const AssetOrderWithRandomSchema = z
.enum(AssetOrderWithRandom)
.describe('Sort order')
.meta({ id: 'MemorySearchOrder' });
export enum Permission {
All = 'all',
@@ -293,6 +329,8 @@ export enum Permission {
AdminAuthUnlinkAll = 'adminAuth.unlinkAll',
}
export const PermissionSchema = z.enum(Permission).describe('Permission').meta({ id: 'Permission' });
export enum SharedLinkType {
Album = 'ALBUM',
@@ -303,6 +341,8 @@ export enum SharedLinkType {
Individual = 'INDIVIDUAL',
}
export const SharedLinkTypeSchema = z.enum(SharedLinkType).describe('Shared link type').meta({ id: 'SharedLinkType' });
export enum StorageFolder {
EncodedVideo = 'encoded-video',
Library = 'library',
@@ -312,6 +352,8 @@ export enum StorageFolder {
Backups = 'backups',
}
export const StorageFolderSchema = z.enum(StorageFolder).describe('Storage folder').meta({ id: 'StorageFolder' });
export enum SystemMetadataKey {
MediaLocation = 'MediaLocation',
ReverseGeocodingState = 'reverse-geocoding-state',
@@ -325,16 +367,31 @@ export enum SystemMetadataKey {
License = 'license',
}
export const SystemMetadataKeySchema = z
.enum(SystemMetadataKey)
.describe('System metadata key')
.meta({ id: 'SystemMetadataKey' });
export enum UserMetadataKey {
Preferences = 'preferences',
License = 'license',
Onboarding = 'onboarding',
}
export const UserMetadataKeySchema = z
.enum(UserMetadataKey)
.describe('User metadata key')
.meta({ id: 'UserMetadataKey' });
export enum AssetMetadataKey {
MobileApp = 'mobile-app',
}
export const AssetMetadataKeySchema = z
.enum(AssetMetadataKey)
.describe('Asset metadata key')
.meta({ id: 'AssetMetadataKey' });
export enum UserAvatarColor {
Primary = 'primary',
Pink = 'pink',
@@ -348,24 +405,35 @@ export enum UserAvatarColor {
Amber = 'amber',
}
export const UserAvatarColorSchema = z
.enum(UserAvatarColor)
.describe('User avatar color')
.meta({ id: 'UserAvatarColor' });
export enum UserStatus {
Active = 'active',
Removing = 'removing',
Deleted = 'deleted',
}
export const UserStatusSchema = z.enum(UserStatus).describe('User status').meta({ id: 'UserStatus' });
export enum AssetStatus {
Active = 'active',
Trashed = 'trashed',
Deleted = 'deleted',
}
export const AssetStatusSchema = z.enum(AssetStatus).describe('Asset status').meta({ id: 'AssetStatus' });
export enum SourceType {
MachineLearning = 'machine-learning',
Exif = 'exif',
Manual = 'manual',
}
export const SourceTypeSchema = z.enum(SourceType).describe('Face detection source type').meta({ id: 'SourceType' });
export enum ManualJobName {
PersonCleanup = 'person-cleanup',
TagCleanup = 'tag-cleanup',
@@ -375,19 +443,27 @@ export enum ManualJobName {
BackupDatabase = 'backup-database',
}
export const ManualJobNameSchema = z.enum(ManualJobName).describe('Manual job name').meta({ id: 'ManualJobName' });
export enum AssetPathType {
Original = 'original',
EncodedVideo = 'encoded_video',
}
export const AssetPathTypeSchema = z.enum(AssetPathType).describe('Asset path type').meta({ id: 'AssetPathType' });
export enum PersonPathType {
Face = 'face',
}
export const PersonPathTypeSchema = z.enum(PersonPathType).describe('Person path type').meta({ id: 'PersonPathType' });
export enum UserPathType {
Profile = 'profile',
}
export const UserPathTypeSchema = z.enum(UserPathType).describe('User path type').meta({ id: 'UserPathType' });
export type PathType = AssetFileType | AssetPathType | PersonPathType | UserPathType;
export enum TranscodePolicy {
@@ -398,6 +474,11 @@ export enum TranscodePolicy {
Disabled = 'disabled',
}
export const TranscodePolicySchema = z
.enum(TranscodePolicy)
.describe('Transcode policy')
.meta({ id: 'TranscodePolicy' });
export enum TranscodeTarget {
None = 'NONE',
Audio = 'AUDIO',
@@ -405,6 +486,11 @@ export enum TranscodeTarget {
All = 'ALL',
}
export const TranscodeTargetSchema = z
.enum(TranscodeTarget)
.describe('Transcode target')
.meta({ id: 'TranscodeTarget' });
export enum VideoCodec {
H264 = 'h264',
Hevc = 'hevc',
@@ -412,6 +498,8 @@ export enum VideoCodec {
Av1 = 'av1',
}
export const VideoCodecSchema = z.enum(VideoCodec).describe('Target video codec').meta({ id: 'VideoCodec' });
export enum AudioCodec {
Mp3 = 'mp3',
Aac = 'aac',
@@ -421,6 +509,8 @@ export enum AudioCodec {
PcmS16le = 'pcm_s16le',
}
export const AudioCodecSchema = z.enum(AudioCodec).describe('Target audio codec').meta({ id: 'AudioCodec' });
export enum VideoContainer {
Mov = 'mov',
Mp4 = 'mp4',
@@ -428,6 +518,11 @@ export enum VideoContainer {
Webm = 'webm',
}
export const VideoContainerSchema = z
.enum(VideoContainer)
.describe('Accepted video containers')
.meta({ id: 'VideoContainer' });
export enum TranscodeHardwareAcceleration {
Nvenc = 'nvenc',
Qsv = 'qsv',
@@ -436,6 +531,11 @@ export enum TranscodeHardwareAcceleration {
Disabled = 'disabled',
}
export const TranscodeHardwareAccelerationSchema = z
.enum(TranscodeHardwareAcceleration)
.describe('Transcode hardware acceleration')
.meta({ id: 'TranscodeHWAccel' });
export enum ToneMapping {
Hable = 'hable',
Mobius = 'mobius',
@@ -443,27 +543,40 @@ export enum ToneMapping {
Disabled = 'disabled',
}
export const ToneMappingSchema = z.enum(ToneMapping).describe('Tone mapping').meta({ id: 'ToneMapping' });
export enum CQMode {
Auto = 'auto',
Cqp = 'cqp',
Icq = 'icq',
}
export const CQModeSchema = z.enum(CQMode).describe('CQ mode').meta({ id: 'CQMode' });
export enum Colorspace {
Srgb = 'srgb',
P3 = 'p3',
}
export const ColorspaceSchema = z.enum(Colorspace).describe('Colorspace').meta({ id: 'Colorspace' });
export enum ImageFormat {
Jpeg = 'jpeg',
Webp = 'webp',
}
export const ImageFormatSchema = z.enum(ImageFormat).describe('Image format').meta({ id: 'ImageFormat' });
export enum RawExtractedFormat {
Jpeg = 'jpeg',
Jxl = 'jxl',
}
export const RawExtractedFormatSchema = z
.enum(RawExtractedFormat)
.describe('Raw extracted format')
.meta({ id: 'RawExtractedFormat' });
export enum LogLevel {
Verbose = 'verbose',
Debug = 'debug',
@@ -473,11 +586,15 @@ export enum LogLevel {
Fatal = 'fatal',
}
export const LogLevelSchema = z.enum(LogLevel).describe('Log level').meta({ id: 'LogLevel' });
export enum LogFormat {
Console = 'console',
Json = 'json',
}
export const LogFormatSchema = z.enum(LogFormat).describe('Log format').meta({ id: 'LogFormat' });
export enum ApiCustomExtension {
Permission = 'x-immich-permission',
AdminOnly = 'x-immich-admin-only',
@@ -485,6 +602,11 @@ export enum ApiCustomExtension {
State = 'x-immich-state',
}
export const ApiCustomExtensionSchema = z
.enum(ApiCustomExtension)
.describe('API custom extension')
.meta({ id: 'ApiCustomExtension' });
export enum MetadataKey {
AuthRoute = 'auth_route',
AdminRoute = 'admin_route',
@@ -495,29 +617,42 @@ export enum MetadataKey {
TelemetryEnabled = 'telemetry_enabled',
}
export const MetadataKeySchema = z.enum(MetadataKey).describe('Metadata key').meta({ id: 'MetadataKey' });
export enum RouteKey {
Asset = 'assets',
User = 'users',
}
export const RouteKeySchema = z.enum(RouteKey).describe('Route key').meta({ id: 'RouteKey' });
export enum CacheControl {
PrivateWithCache = 'private_with_cache',
PrivateWithoutCache = 'private_without_cache',
None = 'none',
}
export const CacheControlSchema = z.enum(CacheControl).describe('Cache control').meta({ id: 'CacheControl' });
export enum ImmichEnvironment {
Development = 'development',
Testing = 'testing',
Production = 'production',
}
export const ImmichEnvironmentSchema = z
.enum(ImmichEnvironment)
.describe('Immich environment')
.meta({ id: 'ImmichEnvironment' });
export enum ImmichWorker {
Api = 'api',
Maintenance = 'maintenance',
Microservices = 'microservices',
}
export const ImmichWorkerSchema = z.enum(ImmichWorker).describe('Immich worker').meta({ id: 'ImmichWorker' });
export enum ImmichTelemetry {
Host = 'host',
Api = 'api',
@@ -526,6 +661,11 @@ export enum ImmichTelemetry {
Job = 'job',
}
export const ImmichTelemetrySchema = z
.enum(ImmichTelemetry)
.describe('Immich telemetry')
.meta({ id: 'ImmichTelemetry' });
export enum ExifOrientation {
Horizontal = 1,
MirrorHorizontal = 2,
@@ -537,6 +677,11 @@ export enum ExifOrientation {
Rotate270CW = 8,
}
export const ExifOrientationSchema = z
.enum(ExifOrientation)
.describe('EXIF orientation')
.meta({ id: 'ExifOrientation' });
export enum DatabaseExtension {
Cube = 'cube',
EarthDistance = 'earthdistance',
@@ -545,6 +690,11 @@ export enum DatabaseExtension {
VectorChord = 'vchord',
}
export const DatabaseExtensionSchema = z
.enum(DatabaseExtension)
.describe('Database extension')
.meta({ id: 'DatabaseExtension' });
export enum BootstrapEventPriority {
// Database service should be initialized before anything else, most other services need database access
DatabaseService = -200,
@@ -556,6 +706,11 @@ export enum BootstrapEventPriority {
SystemConfig = 100,
}
export const BootstrapEventPrioritySchema = z
.enum(BootstrapEventPriority)
.describe('Bootstrap event priority')
.meta({ id: 'BootstrapEventPriority' });
export enum QueueName {
ThumbnailGeneration = 'thumbnailGeneration',
MetadataExtraction = 'metadataExtraction',
@@ -577,6 +732,8 @@ export enum QueueName {
Editor = 'editor',
}
export const QueueNameSchema = z.enum(QueueName).describe('Queue name').meta({ id: 'QueueName' });
export enum QueueJobStatus {
Active = 'active',
Failed = 'failed',
@@ -586,6 +743,8 @@ export enum QueueJobStatus {
Paused = 'paused',
}
export const QueueJobStatusSchema = z.enum(QueueJobStatus).describe('Queue job status').meta({ id: 'QueueJobStatus' });
export enum JobName {
AssetDelete = 'AssetDelete',
AssetDeleteCheck = 'AssetDeleteCheck',
@@ -666,6 +825,8 @@ export enum JobName {
WorkflowRun = 'WorkflowRun',
}
export const JobNameSchema = z.enum(JobName).describe('Job name').meta({ id: 'JobName' });
export enum QueueCommand {
Start = 'start',
/** @deprecated Use `updateQueue` instead */
@@ -678,21 +839,32 @@ export enum QueueCommand {
ClearFailed = 'clear-failed',
}
export const QueueCommandSchema = z
.enum(QueueCommand)
.describe('Queue command to execute')
.meta({ id: 'QueueCommand' });
export enum JobStatus {
Success = 'success',
Failed = 'failed',
Skipped = 'skipped',
}
export const JobStatusSchema = z.enum(JobStatus).describe('Job status').meta({ id: 'JobStatus' });
export enum QueueCleanType {
Failed = 'failed',
}
export const QueueCleanTypeSchema = z.enum(QueueCleanType).describe('Queue clean type').meta({ id: 'QueueCleanType' });
export enum VectorIndex {
Clip = 'clip_index',
Face = 'face_index',
}
export const VectorIndexSchema = z.enum(VectorIndex).describe('Vector index').meta({ id: 'VectorIndex' });
export enum DatabaseLock {
GeodataImport = 100,
Migrations = 200,
@@ -710,6 +882,8 @@ export enum DatabaseLock {
VersionCheck = 800,
}
export const DatabaseLockSchema = z.enum(DatabaseLock).describe('Database lock').meta({ id: 'DatabaseLock' });
export enum MaintenanceAction {
Start = 'start',
End = 'end',
@@ -717,10 +891,17 @@ export enum MaintenanceAction {
RestoreDatabase = 'restore_database',
}
export const MaintenanceActionSchema = z
.enum(MaintenanceAction)
.describe('Maintenance action')
.meta({ id: 'MaintenanceAction' });
export enum ExitCode {
AppRestart = 7,
}
export const ExitCodeSchema = z.enum(ExitCode).describe('Exit code').meta({ id: 'ExitCode' });
export enum SyncRequestType {
AlbumsV1 = 'AlbumsV1',
AlbumUsersV1 = 'AlbumUsersV1',
@@ -746,6 +927,11 @@ export enum SyncRequestType {
UserMetadataV1 = 'UserMetadataV1',
}
export const SyncRequestTypeSchema = z
.enum(SyncRequestType)
.describe('Sync request type')
.meta({ id: 'SyncRequestType' });
export enum SyncEntityType {
AuthUserV1 = 'AuthUserV1',
@@ -814,6 +1000,8 @@ export enum SyncEntityType {
SyncCompleteV1 = 'SyncCompleteV1',
}
export const SyncEntityTypeSchema = z.enum(SyncEntityType).describe('Sync entity type').meta({ id: 'SyncEntityType' });
export enum NotificationLevel {
Success = 'success',
Error = 'error',
@@ -821,6 +1009,11 @@ export enum NotificationLevel {
Info = 'info',
}
export const NotificationLevelSchema = z
.enum(NotificationLevel)
.describe('Notification level')
.meta({ id: 'NotificationLevel' });
export enum NotificationType {
JobFailed = 'JobFailed',
BackupFailed = 'BackupFailed',
@@ -830,11 +1023,21 @@ export enum NotificationType {
Custom = 'Custom',
}
export const NotificationTypeSchema = z
.enum(NotificationType)
.describe('Notification type')
.meta({ id: 'NotificationType' });
export enum OAuthTokenEndpointAuthMethod {
ClientSecretPost = 'client_secret_post',
ClientSecretBasic = 'client_secret_basic',
}
export const OAuthTokenEndpointAuthMethodSchema = z
.enum(OAuthTokenEndpointAuthMethod)
.describe('OAuth token endpoint auth method')
.meta({ id: 'OAuthTokenEndpointAuthMethod' });
export enum AssetVisibility {
Archive = 'archive',
Timeline = 'timeline',
@@ -846,12 +1049,19 @@ export enum AssetVisibility {
Locked = 'locked',
}
export const AssetVisibilitySchema = z
.enum(AssetVisibility)
.describe('Asset visibility')
.meta({ id: 'AssetVisibility' });
export enum CronJob {
LibraryScan = 'LibraryScan',
NightlyJobs = 'NightlyJobs',
VersionCheck = 'VersionCheck',
}
export const CronJobSchema = z.enum(CronJob).describe('Cron job').meta({ id: 'CronJob' });
export enum ApiTag {
Activities = 'Activities',
Albums = 'Albums',
@@ -892,13 +1102,22 @@ export enum ApiTag {
Workflows = 'Workflows',
}
export const ApiTagSchema = z.enum(ApiTag).describe('API tag').meta({ id: 'ApiTag' });
export enum PluginContext {
Asset = 'asset',
Album = 'album',
Person = 'person',
}
export const PluginContextSchema = z.enum(PluginContext).describe('Plugin context').meta({ id: 'PluginContextType' });
export enum PluginTriggerType {
AssetCreate = 'AssetCreate',
PersonRecognized = 'PersonRecognized',
}
export const PluginTriggerTypeSchema = z
.enum(PluginTriggerType)
.describe('Plugin trigger type')
.meta({ id: 'PluginTriggerType' });