mirror of
				https://github.com/immich-app/immich.git
				synced 2025-10-31 02:39:03 -04:00 
			
		
		
		
	chore(server): consolidate dto files (#8201)
chore: conoslidate dto files
This commit is contained in:
		
							parent
							
								
									75aa8e6621
								
							
						
					
					
						commit
						b6e4be72f0
					
				| @ -1,8 +1,6 @@ | ||||
| import { Body, Controller, Get, Put, Query } from '@nestjs/common'; | ||||
| import { ApiTags } from '@nestjs/swagger'; | ||||
| import { MapThemeDto } from 'src/dtos/system-config-map-theme.dto'; | ||||
| import { SystemConfigTemplateStorageOptionDto } from 'src/dtos/system-config-storage-template.dto'; | ||||
| import { SystemConfigDto } from 'src/dtos/system-config.dto'; | ||||
| import { MapThemeDto, SystemConfigDto, SystemConfigTemplateStorageOptionDto } from 'src/dtos/system-config.dto'; | ||||
| import { AdminRoute, Authenticated } from 'src/middleware/auth.guard'; | ||||
| import { SystemConfigService } from 'src/services/system-config.service'; | ||||
| 
 | ||||
|  | ||||
| @ -1,7 +1,7 @@ | ||||
| import { ApiProperty, ApiResponseProperty } from '@nestjs/swagger'; | ||||
| import type { DateTime } from 'luxon'; | ||||
| import { FeatureFlags } from 'src/cores/system-config.core'; | ||||
| import { SystemConfigThemeDto } from 'src/dtos/system-config-theme.dto'; | ||||
| import { SystemConfigThemeDto } from 'src/dtos/system-config.dto'; | ||||
| import { IVersion, VersionType } from 'src/utils/version'; | ||||
| 
 | ||||
| export class ServerPingResponse { | ||||
|  | ||||
| @ -1,103 +0,0 @@ | ||||
| import { ApiProperty } from '@nestjs/swagger'; | ||||
| import { Type } from 'class-transformer'; | ||||
| import { IsEnum, IsInt, IsString, Max, Min } from 'class-validator'; | ||||
| import { | ||||
|   AudioCodec, | ||||
|   CQMode, | ||||
|   ToneMapping, | ||||
|   TranscodeHWAccel, | ||||
|   TranscodePolicy, | ||||
|   VideoCodec, | ||||
| } from 'src/entities/system-config.entity'; | ||||
| import { ValidateBoolean } from 'src/validation'; | ||||
| 
 | ||||
| export class SystemConfigFFmpegDto { | ||||
|   @IsInt() | ||||
|   @Min(0) | ||||
|   @Max(51) | ||||
|   @Type(() => Number) | ||||
|   @ApiProperty({ type: 'integer' }) | ||||
|   crf!: number; | ||||
| 
 | ||||
|   @IsInt() | ||||
|   @Min(0) | ||||
|   @Type(() => Number) | ||||
|   @ApiProperty({ type: 'integer' }) | ||||
|   threads!: number; | ||||
| 
 | ||||
|   @IsString() | ||||
|   preset!: string; | ||||
| 
 | ||||
|   @IsEnum(VideoCodec) | ||||
|   @ApiProperty({ enumName: 'VideoCodec', enum: VideoCodec }) | ||||
|   targetVideoCodec!: VideoCodec; | ||||
| 
 | ||||
|   @IsEnum(VideoCodec, { each: true }) | ||||
|   @ApiProperty({ enumName: 'VideoCodec', enum: VideoCodec, isArray: true }) | ||||
|   acceptedVideoCodecs!: VideoCodec[]; | ||||
| 
 | ||||
|   @IsEnum(AudioCodec) | ||||
|   @ApiProperty({ enumName: 'AudioCodec', enum: AudioCodec }) | ||||
|   targetAudioCodec!: AudioCodec; | ||||
| 
 | ||||
|   @IsEnum(AudioCodec, { each: true }) | ||||
|   @ApiProperty({ enumName: 'AudioCodec', enum: AudioCodec, isArray: true }) | ||||
|   acceptedAudioCodecs!: AudioCodec[]; | ||||
| 
 | ||||
|   @IsString() | ||||
|   targetResolution!: string; | ||||
| 
 | ||||
|   @IsString() | ||||
|   maxBitrate!: string; | ||||
| 
 | ||||
|   @IsInt() | ||||
|   @Min(-1) | ||||
|   @Max(16) | ||||
|   @Type(() => Number) | ||||
|   @ApiProperty({ type: 'integer' }) | ||||
|   bframes!: number; | ||||
| 
 | ||||
|   @IsInt() | ||||
|   @Min(0) | ||||
|   @Max(6) | ||||
|   @Type(() => Number) | ||||
|   @ApiProperty({ type: 'integer' }) | ||||
|   refs!: number; | ||||
| 
 | ||||
|   @IsInt() | ||||
|   @Min(0) | ||||
|   @Type(() => Number) | ||||
|   @ApiProperty({ type: 'integer' }) | ||||
|   gopSize!: number; | ||||
| 
 | ||||
|   @IsInt() | ||||
|   @Min(0) | ||||
|   @Type(() => Number) | ||||
|   @ApiProperty({ type: 'integer' }) | ||||
|   npl!: number; | ||||
| 
 | ||||
|   @ValidateBoolean() | ||||
|   temporalAQ!: boolean; | ||||
| 
 | ||||
|   @IsEnum(CQMode) | ||||
|   @ApiProperty({ enumName: 'CQMode', enum: CQMode }) | ||||
|   cqMode!: CQMode; | ||||
| 
 | ||||
|   @ValidateBoolean() | ||||
|   twoPass!: boolean; | ||||
| 
 | ||||
|   @IsString() | ||||
|   preferredHwDevice!: string; | ||||
| 
 | ||||
|   @IsEnum(TranscodePolicy) | ||||
|   @ApiProperty({ enumName: 'TranscodePolicy', enum: TranscodePolicy }) | ||||
|   transcode!: TranscodePolicy; | ||||
| 
 | ||||
|   @IsEnum(TranscodeHWAccel) | ||||
|   @ApiProperty({ enumName: 'TranscodeHWAccel', enum: TranscodeHWAccel }) | ||||
|   accel!: TranscodeHWAccel; | ||||
| 
 | ||||
|   @IsEnum(ToneMapping) | ||||
|   @ApiProperty({ enumName: 'ToneMapping', enum: ToneMapping }) | ||||
|   tonemap!: ToneMapping; | ||||
| } | ||||
| @ -1,73 +0,0 @@ | ||||
| import { ApiProperty } from '@nestjs/swagger'; | ||||
| import { Type } from 'class-transformer'; | ||||
| import { IsInt, IsObject, IsPositive, ValidateNested } from 'class-validator'; | ||||
| import { ConcurrentQueueName, QueueName } from 'src/interfaces/job.interface'; | ||||
| 
 | ||||
| export class JobSettingsDto { | ||||
|   @IsInt() | ||||
|   @IsPositive() | ||||
|   @ApiProperty({ type: 'integer' }) | ||||
|   concurrency!: number; | ||||
| } | ||||
| 
 | ||||
| export class SystemConfigJobDto implements Record<ConcurrentQueueName, JobSettingsDto> { | ||||
|   @ApiProperty({ type: JobSettingsDto }) | ||||
|   @ValidateNested() | ||||
|   @IsObject() | ||||
|   @Type(() => JobSettingsDto) | ||||
|   [QueueName.THUMBNAIL_GENERATION]!: JobSettingsDto; | ||||
| 
 | ||||
|   @ApiProperty({ type: JobSettingsDto }) | ||||
|   @ValidateNested() | ||||
|   @IsObject() | ||||
|   @Type(() => JobSettingsDto) | ||||
|   [QueueName.METADATA_EXTRACTION]!: JobSettingsDto; | ||||
| 
 | ||||
|   @ApiProperty({ type: JobSettingsDto }) | ||||
|   @ValidateNested() | ||||
|   @IsObject() | ||||
|   @Type(() => JobSettingsDto) | ||||
|   [QueueName.VIDEO_CONVERSION]!: JobSettingsDto; | ||||
| 
 | ||||
|   @ApiProperty({ type: JobSettingsDto }) | ||||
|   @ValidateNested() | ||||
|   @IsObject() | ||||
|   @Type(() => JobSettingsDto) | ||||
|   [QueueName.SMART_SEARCH]!: JobSettingsDto; | ||||
| 
 | ||||
|   @ApiProperty({ type: JobSettingsDto }) | ||||
|   @ValidateNested() | ||||
|   @IsObject() | ||||
|   @Type(() => JobSettingsDto) | ||||
|   [QueueName.MIGRATION]!: JobSettingsDto; | ||||
| 
 | ||||
|   @ApiProperty({ type: JobSettingsDto }) | ||||
|   @ValidateNested() | ||||
|   @IsObject() | ||||
|   @Type(() => JobSettingsDto) | ||||
|   [QueueName.BACKGROUND_TASK]!: JobSettingsDto; | ||||
| 
 | ||||
|   @ApiProperty({ type: JobSettingsDto }) | ||||
|   @ValidateNested() | ||||
|   @IsObject() | ||||
|   @Type(() => JobSettingsDto) | ||||
|   [QueueName.SEARCH]!: JobSettingsDto; | ||||
| 
 | ||||
|   @ApiProperty({ type: JobSettingsDto }) | ||||
|   @ValidateNested() | ||||
|   @IsObject() | ||||
|   @Type(() => JobSettingsDto) | ||||
|   [QueueName.FACE_DETECTION]!: JobSettingsDto; | ||||
| 
 | ||||
|   @ApiProperty({ type: JobSettingsDto }) | ||||
|   @ValidateNested() | ||||
|   @IsObject() | ||||
|   @Type(() => JobSettingsDto) | ||||
|   [QueueName.SIDECAR]!: JobSettingsDto; | ||||
| 
 | ||||
|   @ApiProperty({ type: JobSettingsDto }) | ||||
|   @ValidateNested() | ||||
|   @IsObject() | ||||
|   @Type(() => JobSettingsDto) | ||||
|   [QueueName.LIBRARY]!: JobSettingsDto; | ||||
| } | ||||
| @ -1,49 +0,0 @@ | ||||
| import { Type } from 'class-transformer'; | ||||
| import { | ||||
|   IsNotEmpty, | ||||
|   IsObject, | ||||
|   IsString, | ||||
|   Validate, | ||||
|   ValidateIf, | ||||
|   ValidateNested, | ||||
|   ValidatorConstraint, | ||||
|   ValidatorConstraintInterface, | ||||
| } from 'class-validator'; | ||||
| import { ValidateBoolean, validateCronExpression } from 'src/validation'; | ||||
| 
 | ||||
| const isEnabled = (config: SystemConfigLibraryScanDto) => config.enabled; | ||||
| 
 | ||||
| @ValidatorConstraint({ name: 'cronValidator' }) | ||||
| class CronValidator implements ValidatorConstraintInterface { | ||||
|   validate(expression: string): boolean { | ||||
|     return validateCronExpression(expression); | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| export class SystemConfigLibraryScanDto { | ||||
|   @ValidateBoolean() | ||||
|   enabled!: boolean; | ||||
| 
 | ||||
|   @ValidateIf(isEnabled) | ||||
|   @IsNotEmpty() | ||||
|   @Validate(CronValidator, { message: 'Invalid cron expression' }) | ||||
|   @IsString() | ||||
|   cronExpression!: string; | ||||
| } | ||||
| 
 | ||||
| export class SystemConfigLibraryWatchDto { | ||||
|   @ValidateBoolean() | ||||
|   enabled!: boolean; | ||||
| } | ||||
| 
 | ||||
| export class SystemConfigLibraryDto { | ||||
|   @Type(() => SystemConfigLibraryScanDto) | ||||
|   @ValidateNested() | ||||
|   @IsObject() | ||||
|   scan!: SystemConfigLibraryScanDto; | ||||
| 
 | ||||
|   @Type(() => SystemConfigLibraryWatchDto) | ||||
|   @ValidateNested() | ||||
|   @IsObject() | ||||
|   watch!: SystemConfigLibraryWatchDto; | ||||
| } | ||||
| @ -1,13 +0,0 @@ | ||||
| import { ApiProperty } from '@nestjs/swagger'; | ||||
| import { IsEnum } from 'class-validator'; | ||||
| import { LogLevel } from 'src/entities/system-config.entity'; | ||||
| import { ValidateBoolean } from 'src/validation'; | ||||
| 
 | ||||
| export class SystemConfigLoggingDto { | ||||
|   @ValidateBoolean() | ||||
|   enabled!: boolean; | ||||
| 
 | ||||
|   @ApiProperty({ enum: LogLevel, enumName: 'LogLevel' }) | ||||
|   @IsEnum(LogLevel) | ||||
|   level!: LogLevel; | ||||
| } | ||||
| @ -1,23 +0,0 @@ | ||||
| import { Type } from 'class-transformer'; | ||||
| import { IsObject, IsUrl, ValidateIf, ValidateNested } from 'class-validator'; | ||||
| import { CLIPConfig, RecognitionConfig } from 'src/dtos/model-config.dto'; | ||||
| import { ValidateBoolean } from 'src/validation'; | ||||
| 
 | ||||
| export class SystemConfigMachineLearningDto { | ||||
|   @ValidateBoolean() | ||||
|   enabled!: boolean; | ||||
| 
 | ||||
|   @IsUrl({ require_tld: false, allow_underscores: true }) | ||||
|   @ValidateIf((dto) => dto.enabled) | ||||
|   url!: string; | ||||
| 
 | ||||
|   @Type(() => CLIPConfig) | ||||
|   @ValidateNested() | ||||
|   @IsObject() | ||||
|   clip!: CLIPConfig; | ||||
| 
 | ||||
|   @Type(() => RecognitionConfig) | ||||
|   @ValidateNested() | ||||
|   @IsObject() | ||||
|   facialRecognition!: RecognitionConfig; | ||||
| } | ||||
| @ -1,13 +0,0 @@ | ||||
| import { ApiProperty } from '@nestjs/swagger'; | ||||
| import { IsEnum } from 'class-validator'; | ||||
| 
 | ||||
| export enum MapTheme { | ||||
|   LIGHT = 'light', | ||||
|   DARK = 'dark', | ||||
| } | ||||
| 
 | ||||
| export class MapThemeDto { | ||||
|   @IsEnum(MapTheme) | ||||
|   @ApiProperty({ enum: MapTheme, enumName: 'MapTheme' }) | ||||
|   theme!: MapTheme; | ||||
| } | ||||
| @ -1,13 +0,0 @@ | ||||
| import { IsString } from 'class-validator'; | ||||
| import { ValidateBoolean } from 'src/validation'; | ||||
| 
 | ||||
| export class SystemConfigMapDto { | ||||
|   @ValidateBoolean() | ||||
|   enabled!: boolean; | ||||
| 
 | ||||
|   @IsString() | ||||
|   lightStyle!: string; | ||||
| 
 | ||||
|   @IsString() | ||||
|   darkStyle!: string; | ||||
| } | ||||
| @ -1,6 +0,0 @@ | ||||
| import { ValidateBoolean } from 'src/validation'; | ||||
| 
 | ||||
| export class SystemConfigNewVersionCheckDto { | ||||
|   @ValidateBoolean() | ||||
|   enabled!: boolean; | ||||
| } | ||||
| @ -1,58 +0,0 @@ | ||||
| import { IsNotEmpty, IsNumber, IsString, IsUrl, Min, ValidateIf } from 'class-validator'; | ||||
| import { ValidateBoolean } from 'src/validation'; | ||||
| 
 | ||||
| const isEnabled = (config: SystemConfigOAuthDto) => config.enabled; | ||||
| const isOverrideEnabled = (config: SystemConfigOAuthDto) => config.mobileOverrideEnabled; | ||||
| 
 | ||||
| export class SystemConfigOAuthDto { | ||||
|   @ValidateBoolean() | ||||
|   autoLaunch!: boolean; | ||||
| 
 | ||||
|   @ValidateBoolean() | ||||
|   autoRegister!: boolean; | ||||
| 
 | ||||
|   @IsString() | ||||
|   buttonText!: string; | ||||
| 
 | ||||
|   @ValidateIf(isEnabled) | ||||
|   @IsNotEmpty() | ||||
|   @IsString() | ||||
|   clientId!: string; | ||||
| 
 | ||||
|   @ValidateIf(isEnabled) | ||||
|   @IsNotEmpty() | ||||
|   @IsString() | ||||
|   clientSecret!: string; | ||||
| 
 | ||||
|   @IsNumber() | ||||
|   @Min(0) | ||||
|   defaultStorageQuota!: number; | ||||
| 
 | ||||
|   @ValidateBoolean() | ||||
|   enabled!: boolean; | ||||
| 
 | ||||
|   @ValidateIf(isEnabled) | ||||
|   @IsNotEmpty() | ||||
|   @IsString() | ||||
|   issuerUrl!: string; | ||||
| 
 | ||||
|   @ValidateBoolean() | ||||
|   mobileOverrideEnabled!: boolean; | ||||
| 
 | ||||
|   @ValidateIf(isOverrideEnabled) | ||||
|   @IsUrl() | ||||
|   mobileRedirectUri!: string; | ||||
| 
 | ||||
|   @IsString() | ||||
|   scope!: string; | ||||
| 
 | ||||
|   @IsString() | ||||
|   @IsNotEmpty() | ||||
|   signingAlgorithm!: string; | ||||
| 
 | ||||
|   @IsString() | ||||
|   storageLabelClaim!: string; | ||||
| 
 | ||||
|   @IsString() | ||||
|   storageQuotaClaim!: string; | ||||
| } | ||||
| @ -1,6 +0,0 @@ | ||||
| import { ValidateBoolean } from 'src/validation'; | ||||
| 
 | ||||
| export class SystemConfigPasswordLoginDto { | ||||
|   @ValidateBoolean() | ||||
|   enabled!: boolean; | ||||
| } | ||||
| @ -1,6 +0,0 @@ | ||||
| import { ValidateBoolean } from 'src/validation'; | ||||
| 
 | ||||
| export class SystemConfigReverseGeocodingDto { | ||||
|   @ValidateBoolean() | ||||
|   enabled!: boolean; | ||||
| } | ||||
| @ -1,9 +0,0 @@ | ||||
| import { IsString } from 'class-validator'; | ||||
| 
 | ||||
| export class SystemConfigServerDto { | ||||
|   @IsString() | ||||
|   externalDomain!: string; | ||||
| 
 | ||||
|   @IsString() | ||||
|   loginPageMessage!: string; | ||||
| } | ||||
| @ -1,25 +0,0 @@ | ||||
| import { IsNotEmpty, IsString } from 'class-validator'; | ||||
| import { ValidateBoolean } from 'src/validation'; | ||||
| 
 | ||||
| export class SystemConfigStorageTemplateDto { | ||||
|   @ValidateBoolean() | ||||
|   enabled!: boolean; | ||||
| 
 | ||||
|   @ValidateBoolean() | ||||
|   hashVerificationEnabled!: boolean; | ||||
| 
 | ||||
|   @IsNotEmpty() | ||||
|   @IsString() | ||||
|   template!: string; | ||||
| } | ||||
| 
 | ||||
| export class SystemConfigTemplateStorageOptionDto { | ||||
|   yearOptions!: string[]; | ||||
|   monthOptions!: string[]; | ||||
|   weekOptions!: string[]; | ||||
|   dayOptions!: string[]; | ||||
|   hourOptions!: string[]; | ||||
|   minuteOptions!: string[]; | ||||
|   secondOptions!: string[]; | ||||
|   presetOptions!: string[]; | ||||
| } | ||||
| @ -1,6 +0,0 @@ | ||||
| import { IsString } from 'class-validator'; | ||||
| 
 | ||||
| export class SystemConfigThemeDto { | ||||
|   @IsString() | ||||
|   customCss!: string; | ||||
| } | ||||
| @ -1,29 +0,0 @@ | ||||
| import { ApiProperty } from '@nestjs/swagger'; | ||||
| import { Type } from 'class-transformer'; | ||||
| import { IsEnum, IsInt, Max, Min } from 'class-validator'; | ||||
| import { Colorspace } from 'src/entities/system-config.entity'; | ||||
| 
 | ||||
| export class SystemConfigThumbnailDto { | ||||
|   @IsInt() | ||||
|   @Min(1) | ||||
|   @Type(() => Number) | ||||
|   @ApiProperty({ type: 'integer' }) | ||||
|   webpSize!: number; | ||||
| 
 | ||||
|   @IsInt() | ||||
|   @Min(1) | ||||
|   @Type(() => Number) | ||||
|   @ApiProperty({ type: 'integer' }) | ||||
|   jpegSize!: number; | ||||
| 
 | ||||
|   @IsInt() | ||||
|   @Min(1) | ||||
|   @Max(100) | ||||
|   @Type(() => Number) | ||||
|   @ApiProperty({ type: 'integer' }) | ||||
|   quality!: number; | ||||
| 
 | ||||
|   @IsEnum(Colorspace) | ||||
|   @ApiProperty({ enumName: 'Colorspace', enum: Colorspace }) | ||||
|   colorspace!: Colorspace; | ||||
| } | ||||
| @ -1,15 +0,0 @@ | ||||
| import { ApiProperty } from '@nestjs/swagger'; | ||||
| import { Type } from 'class-transformer'; | ||||
| import { IsInt, Min } from 'class-validator'; | ||||
| import { ValidateBoolean } from 'src/validation'; | ||||
| 
 | ||||
| export class SystemConfigTrashDto { | ||||
|   @ValidateBoolean() | ||||
|   enabled!: boolean; | ||||
| 
 | ||||
|   @IsInt() | ||||
|   @Min(0) | ||||
|   @Type(() => Number) | ||||
|   @ApiProperty({ type: 'integer' }) | ||||
|   days!: number; | ||||
| } | ||||
| @ -1,11 +0,0 @@ | ||||
| import { ApiProperty } from '@nestjs/swagger'; | ||||
| import { Type } from 'class-transformer'; | ||||
| import { IsInt, Min } from 'class-validator'; | ||||
| 
 | ||||
| export class SystemConfigUserDto { | ||||
|   @IsInt() | ||||
|   @Min(1) | ||||
|   @Type(() => Number) | ||||
|   @ApiProperty({ type: 'integer' }) | ||||
|   deleteDelay!: number; | ||||
| } | ||||
| @ -1,22 +1,433 @@ | ||||
| import { ApiProperty } from '@nestjs/swagger'; | ||||
| import { Type } from 'class-transformer'; | ||||
| import { IsObject, ValidateNested } from 'class-validator'; | ||||
| import { SystemConfigFFmpegDto } from 'src/dtos/system-config-ffmpeg.dto'; | ||||
| import { SystemConfigJobDto } from 'src/dtos/system-config-job.dto'; | ||||
| import { SystemConfigLibraryDto } from 'src/dtos/system-config-library.dto'; | ||||
| import { SystemConfigLoggingDto } from 'src/dtos/system-config-logging.dto'; | ||||
| import { SystemConfigMachineLearningDto } from 'src/dtos/system-config-machine-learning.dto'; | ||||
| import { SystemConfigMapDto } from 'src/dtos/system-config-map.dto'; | ||||
| import { SystemConfigNewVersionCheckDto } from 'src/dtos/system-config-new-version-check.dto'; | ||||
| import { SystemConfigOAuthDto } from 'src/dtos/system-config-oauth.dto'; | ||||
| import { SystemConfigPasswordLoginDto } from 'src/dtos/system-config-password-login.dto'; | ||||
| import { SystemConfigReverseGeocodingDto } from 'src/dtos/system-config-reverse-geocoding.dto'; | ||||
| import { SystemConfigServerDto } from 'src/dtos/system-config-server.dto'; | ||||
| import { SystemConfigStorageTemplateDto } from 'src/dtos/system-config-storage-template.dto'; | ||||
| import { SystemConfigThemeDto } from 'src/dtos/system-config-theme.dto'; | ||||
| import { SystemConfigThumbnailDto } from 'src/dtos/system-config-thumbnail.dto'; | ||||
| import { SystemConfigTrashDto } from 'src/dtos/system-config-trash.dto'; | ||||
| import { SystemConfigUserDto } from 'src/dtos/system-config-user.dto'; | ||||
| import { SystemConfig } from 'src/entities/system-config.entity'; | ||||
| import { | ||||
|   IsEnum, | ||||
|   IsInt, | ||||
|   IsNotEmpty, | ||||
|   IsNumber, | ||||
|   IsObject, | ||||
|   IsPositive, | ||||
|   IsString, | ||||
|   IsUrl, | ||||
|   Max, | ||||
|   Min, | ||||
|   Validate, | ||||
|   ValidateIf, | ||||
|   ValidateNested, | ||||
|   ValidatorConstraint, | ||||
|   ValidatorConstraintInterface, | ||||
| } from 'class-validator'; | ||||
| import { CLIPConfig, RecognitionConfig } from 'src/dtos/model-config.dto'; | ||||
| import { | ||||
|   AudioCodec, | ||||
|   CQMode, | ||||
|   Colorspace, | ||||
|   LogLevel, | ||||
|   SystemConfig, | ||||
|   ToneMapping, | ||||
|   TranscodeHWAccel, | ||||
|   TranscodePolicy, | ||||
|   VideoCodec, | ||||
| } from 'src/entities/system-config.entity'; | ||||
| import { ConcurrentQueueName, QueueName } from 'src/interfaces/job.interface'; | ||||
| import { ValidateBoolean, validateCronExpression } from 'src/validation'; | ||||
| 
 | ||||
| @ValidatorConstraint({ name: 'cronValidator' }) | ||||
| class CronValidator implements ValidatorConstraintInterface { | ||||
|   validate(expression: string): boolean { | ||||
|     return validateCronExpression(expression); | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| const isLibraryScanEnabled = (config: SystemConfigLibraryScanDto) => config.enabled; | ||||
| const isOAuthEnabled = (config: SystemConfigOAuthDto) => config.enabled; | ||||
| const isOAuthOverrideEnabled = (config: SystemConfigOAuthDto) => config.mobileOverrideEnabled; | ||||
| 
 | ||||
| export class SystemConfigFFmpegDto { | ||||
|   @IsInt() | ||||
|   @Min(0) | ||||
|   @Max(51) | ||||
|   @Type(() => Number) | ||||
|   @ApiProperty({ type: 'integer' }) | ||||
|   crf!: number; | ||||
| 
 | ||||
|   @IsInt() | ||||
|   @Min(0) | ||||
|   @Type(() => Number) | ||||
|   @ApiProperty({ type: 'integer' }) | ||||
|   threads!: number; | ||||
| 
 | ||||
|   @IsString() | ||||
|   preset!: string; | ||||
| 
 | ||||
|   @IsEnum(VideoCodec) | ||||
|   @ApiProperty({ enumName: 'VideoCodec', enum: VideoCodec }) | ||||
|   targetVideoCodec!: VideoCodec; | ||||
| 
 | ||||
|   @IsEnum(VideoCodec, { each: true }) | ||||
|   @ApiProperty({ enumName: 'VideoCodec', enum: VideoCodec, isArray: true }) | ||||
|   acceptedVideoCodecs!: VideoCodec[]; | ||||
| 
 | ||||
|   @IsEnum(AudioCodec) | ||||
|   @ApiProperty({ enumName: 'AudioCodec', enum: AudioCodec }) | ||||
|   targetAudioCodec!: AudioCodec; | ||||
| 
 | ||||
|   @IsEnum(AudioCodec, { each: true }) | ||||
|   @ApiProperty({ enumName: 'AudioCodec', enum: AudioCodec, isArray: true }) | ||||
|   acceptedAudioCodecs!: AudioCodec[]; | ||||
| 
 | ||||
|   @IsString() | ||||
|   targetResolution!: string; | ||||
| 
 | ||||
|   @IsString() | ||||
|   maxBitrate!: string; | ||||
| 
 | ||||
|   @IsInt() | ||||
|   @Min(-1) | ||||
|   @Max(16) | ||||
|   @Type(() => Number) | ||||
|   @ApiProperty({ type: 'integer' }) | ||||
|   bframes!: number; | ||||
| 
 | ||||
|   @IsInt() | ||||
|   @Min(0) | ||||
|   @Max(6) | ||||
|   @Type(() => Number) | ||||
|   @ApiProperty({ type: 'integer' }) | ||||
|   refs!: number; | ||||
| 
 | ||||
|   @IsInt() | ||||
|   @Min(0) | ||||
|   @Type(() => Number) | ||||
|   @ApiProperty({ type: 'integer' }) | ||||
|   gopSize!: number; | ||||
| 
 | ||||
|   @IsInt() | ||||
|   @Min(0) | ||||
|   @Type(() => Number) | ||||
|   @ApiProperty({ type: 'integer' }) | ||||
|   npl!: number; | ||||
| 
 | ||||
|   @ValidateBoolean() | ||||
|   temporalAQ!: boolean; | ||||
| 
 | ||||
|   @IsEnum(CQMode) | ||||
|   @ApiProperty({ enumName: 'CQMode', enum: CQMode }) | ||||
|   cqMode!: CQMode; | ||||
| 
 | ||||
|   @ValidateBoolean() | ||||
|   twoPass!: boolean; | ||||
| 
 | ||||
|   @IsString() | ||||
|   preferredHwDevice!: string; | ||||
| 
 | ||||
|   @IsEnum(TranscodePolicy) | ||||
|   @ApiProperty({ enumName: 'TranscodePolicy', enum: TranscodePolicy }) | ||||
|   transcode!: TranscodePolicy; | ||||
| 
 | ||||
|   @IsEnum(TranscodeHWAccel) | ||||
|   @ApiProperty({ enumName: 'TranscodeHWAccel', enum: TranscodeHWAccel }) | ||||
|   accel!: TranscodeHWAccel; | ||||
| 
 | ||||
|   @IsEnum(ToneMapping) | ||||
|   @ApiProperty({ enumName: 'ToneMapping', enum: ToneMapping }) | ||||
|   tonemap!: ToneMapping; | ||||
| } | ||||
| 
 | ||||
| class JobSettingsDto { | ||||
|   @IsInt() | ||||
|   @IsPositive() | ||||
|   @ApiProperty({ type: 'integer' }) | ||||
|   concurrency!: number; | ||||
| } | ||||
| 
 | ||||
| class SystemConfigJobDto implements Record<ConcurrentQueueName, JobSettingsDto> { | ||||
|   @ApiProperty({ type: JobSettingsDto }) | ||||
|   @ValidateNested() | ||||
|   @IsObject() | ||||
|   @Type(() => JobSettingsDto) | ||||
|   [QueueName.THUMBNAIL_GENERATION]!: JobSettingsDto; | ||||
| 
 | ||||
|   @ApiProperty({ type: JobSettingsDto }) | ||||
|   @ValidateNested() | ||||
|   @IsObject() | ||||
|   @Type(() => JobSettingsDto) | ||||
|   [QueueName.METADATA_EXTRACTION]!: JobSettingsDto; | ||||
| 
 | ||||
|   @ApiProperty({ type: JobSettingsDto }) | ||||
|   @ValidateNested() | ||||
|   @IsObject() | ||||
|   @Type(() => JobSettingsDto) | ||||
|   [QueueName.VIDEO_CONVERSION]!: JobSettingsDto; | ||||
| 
 | ||||
|   @ApiProperty({ type: JobSettingsDto }) | ||||
|   @ValidateNested() | ||||
|   @IsObject() | ||||
|   @Type(() => JobSettingsDto) | ||||
|   [QueueName.SMART_SEARCH]!: JobSettingsDto; | ||||
| 
 | ||||
|   @ApiProperty({ type: JobSettingsDto }) | ||||
|   @ValidateNested() | ||||
|   @IsObject() | ||||
|   @Type(() => JobSettingsDto) | ||||
|   [QueueName.MIGRATION]!: JobSettingsDto; | ||||
| 
 | ||||
|   @ApiProperty({ type: JobSettingsDto }) | ||||
|   @ValidateNested() | ||||
|   @IsObject() | ||||
|   @Type(() => JobSettingsDto) | ||||
|   [QueueName.BACKGROUND_TASK]!: JobSettingsDto; | ||||
| 
 | ||||
|   @ApiProperty({ type: JobSettingsDto }) | ||||
|   @ValidateNested() | ||||
|   @IsObject() | ||||
|   @Type(() => JobSettingsDto) | ||||
|   [QueueName.SEARCH]!: JobSettingsDto; | ||||
| 
 | ||||
|   @ApiProperty({ type: JobSettingsDto }) | ||||
|   @ValidateNested() | ||||
|   @IsObject() | ||||
|   @Type(() => JobSettingsDto) | ||||
|   [QueueName.FACE_DETECTION]!: JobSettingsDto; | ||||
| 
 | ||||
|   @ApiProperty({ type: JobSettingsDto }) | ||||
|   @ValidateNested() | ||||
|   @IsObject() | ||||
|   @Type(() => JobSettingsDto) | ||||
|   [QueueName.SIDECAR]!: JobSettingsDto; | ||||
| 
 | ||||
|   @ApiProperty({ type: JobSettingsDto }) | ||||
|   @ValidateNested() | ||||
|   @IsObject() | ||||
|   @Type(() => JobSettingsDto) | ||||
|   [QueueName.LIBRARY]!: JobSettingsDto; | ||||
| } | ||||
| 
 | ||||
| class SystemConfigLibraryScanDto { | ||||
|   @ValidateBoolean() | ||||
|   enabled!: boolean; | ||||
| 
 | ||||
|   @ValidateIf(isLibraryScanEnabled) | ||||
|   @IsNotEmpty() | ||||
|   @Validate(CronValidator, { message: 'Invalid cron expression' }) | ||||
|   @IsString() | ||||
|   cronExpression!: string; | ||||
| } | ||||
| 
 | ||||
| class SystemConfigLibraryWatchDto { | ||||
|   @ValidateBoolean() | ||||
|   enabled!: boolean; | ||||
| } | ||||
| 
 | ||||
| class SystemConfigLibraryDto { | ||||
|   @Type(() => SystemConfigLibraryScanDto) | ||||
|   @ValidateNested() | ||||
|   @IsObject() | ||||
|   scan!: SystemConfigLibraryScanDto; | ||||
| 
 | ||||
|   @Type(() => SystemConfigLibraryWatchDto) | ||||
|   @ValidateNested() | ||||
|   @IsObject() | ||||
|   watch!: SystemConfigLibraryWatchDto; | ||||
| } | ||||
| 
 | ||||
| class SystemConfigLoggingDto { | ||||
|   @ValidateBoolean() | ||||
|   enabled!: boolean; | ||||
| 
 | ||||
|   @ApiProperty({ enum: LogLevel, enumName: 'LogLevel' }) | ||||
|   @IsEnum(LogLevel) | ||||
|   level!: LogLevel; | ||||
| } | ||||
| 
 | ||||
| class SystemConfigMachineLearningDto { | ||||
|   @ValidateBoolean() | ||||
|   enabled!: boolean; | ||||
| 
 | ||||
|   @IsUrl({ require_tld: false, allow_underscores: true }) | ||||
|   @ValidateIf((dto) => dto.enabled) | ||||
|   url!: string; | ||||
| 
 | ||||
|   @Type(() => CLIPConfig) | ||||
|   @ValidateNested() | ||||
|   @IsObject() | ||||
|   clip!: CLIPConfig; | ||||
| 
 | ||||
|   @Type(() => RecognitionConfig) | ||||
|   @ValidateNested() | ||||
|   @IsObject() | ||||
|   facialRecognition!: RecognitionConfig; | ||||
| } | ||||
| 
 | ||||
| enum MapTheme { | ||||
|   LIGHT = 'light', | ||||
|   DARK = 'dark', | ||||
| } | ||||
| 
 | ||||
| export class MapThemeDto { | ||||
|   @IsEnum(MapTheme) | ||||
|   @ApiProperty({ enum: MapTheme, enumName: 'MapTheme' }) | ||||
|   theme!: MapTheme; | ||||
| } | ||||
| 
 | ||||
| class SystemConfigMapDto { | ||||
|   @ValidateBoolean() | ||||
|   enabled!: boolean; | ||||
| 
 | ||||
|   @IsString() | ||||
|   lightStyle!: string; | ||||
| 
 | ||||
|   @IsString() | ||||
|   darkStyle!: string; | ||||
| } | ||||
| 
 | ||||
| class SystemConfigNewVersionCheckDto { | ||||
|   @ValidateBoolean() | ||||
|   enabled!: boolean; | ||||
| } | ||||
| 
 | ||||
| class SystemConfigOAuthDto { | ||||
|   @ValidateBoolean() | ||||
|   autoLaunch!: boolean; | ||||
| 
 | ||||
|   @ValidateBoolean() | ||||
|   autoRegister!: boolean; | ||||
| 
 | ||||
|   @IsString() | ||||
|   buttonText!: string; | ||||
| 
 | ||||
|   @ValidateIf(isOAuthEnabled) | ||||
|   @IsNotEmpty() | ||||
|   @IsString() | ||||
|   clientId!: string; | ||||
| 
 | ||||
|   @ValidateIf(isOAuthEnabled) | ||||
|   @IsNotEmpty() | ||||
|   @IsString() | ||||
|   clientSecret!: string; | ||||
| 
 | ||||
|   @IsNumber() | ||||
|   @Min(0) | ||||
|   defaultStorageQuota!: number; | ||||
| 
 | ||||
|   @ValidateBoolean() | ||||
|   enabled!: boolean; | ||||
| 
 | ||||
|   @ValidateIf(isOAuthEnabled) | ||||
|   @IsNotEmpty() | ||||
|   @IsString() | ||||
|   issuerUrl!: string; | ||||
| 
 | ||||
|   @ValidateBoolean() | ||||
|   mobileOverrideEnabled!: boolean; | ||||
| 
 | ||||
|   @ValidateIf(isOAuthOverrideEnabled) | ||||
|   @IsUrl() | ||||
|   mobileRedirectUri!: string; | ||||
| 
 | ||||
|   @IsString() | ||||
|   scope!: string; | ||||
| 
 | ||||
|   @IsString() | ||||
|   @IsNotEmpty() | ||||
|   signingAlgorithm!: string; | ||||
| 
 | ||||
|   @IsString() | ||||
|   storageLabelClaim!: string; | ||||
| 
 | ||||
|   @IsString() | ||||
|   storageQuotaClaim!: string; | ||||
| } | ||||
| 
 | ||||
| class SystemConfigPasswordLoginDto { | ||||
|   @ValidateBoolean() | ||||
|   enabled!: boolean; | ||||
| } | ||||
| 
 | ||||
| class SystemConfigReverseGeocodingDto { | ||||
|   @ValidateBoolean() | ||||
|   enabled!: boolean; | ||||
| } | ||||
| 
 | ||||
| class SystemConfigServerDto { | ||||
|   @IsString() | ||||
|   externalDomain!: string; | ||||
| 
 | ||||
|   @IsString() | ||||
|   loginPageMessage!: string; | ||||
| } | ||||
| 
 | ||||
| class SystemConfigStorageTemplateDto { | ||||
|   @ValidateBoolean() | ||||
|   enabled!: boolean; | ||||
| 
 | ||||
|   @ValidateBoolean() | ||||
|   hashVerificationEnabled!: boolean; | ||||
| 
 | ||||
|   @IsNotEmpty() | ||||
|   @IsString() | ||||
|   template!: string; | ||||
| } | ||||
| 
 | ||||
| export class SystemConfigTemplateStorageOptionDto { | ||||
|   yearOptions!: string[]; | ||||
|   monthOptions!: string[]; | ||||
|   weekOptions!: string[]; | ||||
|   dayOptions!: string[]; | ||||
|   hourOptions!: string[]; | ||||
|   minuteOptions!: string[]; | ||||
|   secondOptions!: string[]; | ||||
|   presetOptions!: string[]; | ||||
| } | ||||
| 
 | ||||
| export class SystemConfigThemeDto { | ||||
|   @IsString() | ||||
|   customCss!: string; | ||||
| } | ||||
| 
 | ||||
| class SystemConfigThumbnailDto { | ||||
|   @IsInt() | ||||
|   @Min(1) | ||||
|   @Type(() => Number) | ||||
|   @ApiProperty({ type: 'integer' }) | ||||
|   webpSize!: number; | ||||
| 
 | ||||
|   @IsInt() | ||||
|   @Min(1) | ||||
|   @Type(() => Number) | ||||
|   @ApiProperty({ type: 'integer' }) | ||||
|   jpegSize!: number; | ||||
| 
 | ||||
|   @IsInt() | ||||
|   @Min(1) | ||||
|   @Max(100) | ||||
|   @Type(() => Number) | ||||
|   @ApiProperty({ type: 'integer' }) | ||||
|   quality!: number; | ||||
| 
 | ||||
|   @IsEnum(Colorspace) | ||||
|   @ApiProperty({ enumName: 'Colorspace', enum: Colorspace }) | ||||
|   colorspace!: Colorspace; | ||||
| } | ||||
| 
 | ||||
| class SystemConfigTrashDto { | ||||
|   @ValidateBoolean() | ||||
|   enabled!: boolean; | ||||
| 
 | ||||
|   @IsInt() | ||||
|   @Min(0) | ||||
|   @Type(() => Number) | ||||
|   @ApiProperty({ type: 'integer' }) | ||||
|   days!: number; | ||||
| } | ||||
| 
 | ||||
| class SystemConfigUserDto { | ||||
|   @IsInt() | ||||
|   @Min(1) | ||||
|   @Type(() => Number) | ||||
|   @ApiProperty({ type: 'integer' }) | ||||
|   deleteDelay!: number; | ||||
| } | ||||
| 
 | ||||
| export class SystemConfigDto implements SystemConfig { | ||||
|   @Type(() => SystemConfigFFmpegDto) | ||||
|  | ||||
| @ -1,7 +1,7 @@ | ||||
| import { Inject, Injectable, UnsupportedMediaTypeException } from '@nestjs/common'; | ||||
| import { StorageCore, StorageFolder } from 'src/cores/storage.core'; | ||||
| import { SystemConfigCore } from 'src/cores/system-config.core'; | ||||
| import { SystemConfigFFmpegDto } from 'src/dtos/system-config-ffmpeg.dto'; | ||||
| import { SystemConfigFFmpegDto } from 'src/dtos/system-config.dto'; | ||||
| import { AssetEntity, AssetType } from 'src/entities/asset.entity'; | ||||
| import { AssetPathType } from 'src/entities/move.entity'; | ||||
| import { | ||||
|  | ||||
| @ -13,8 +13,7 @@ import { | ||||
| } from 'src/constants'; | ||||
| import { SystemConfigCore } from 'src/cores/system-config.core'; | ||||
| import { OnEventInternal } from 'src/decorators'; | ||||
| import { SystemConfigTemplateStorageOptionDto } from 'src/dtos/system-config-storage-template.dto'; | ||||
| import { SystemConfigDto, mapConfig } from 'src/dtos/system-config.dto'; | ||||
| import { SystemConfigDto, SystemConfigTemplateStorageOptionDto, mapConfig } from 'src/dtos/system-config.dto'; | ||||
| import { LogLevel, SystemConfig } from 'src/entities/system-config.entity'; | ||||
| import { | ||||
|   ClientEvent, | ||||
|  | ||||
| @ -1,4 +1,4 @@ | ||||
| import { SystemConfigFFmpegDto } from 'src/dtos/system-config-ffmpeg.dto'; | ||||
| import { SystemConfigFFmpegDto } from 'src/dtos/system-config.dto'; | ||||
| import { CQMode, ToneMapping, TranscodeHWAccel, TranscodeTarget, VideoCodec } from 'src/entities/system-config.entity'; | ||||
| import { | ||||
|   AudioStreamInfo, | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user