mirror of
				https://github.com/immich-app/immich.git
				synced 2025-10-31 10:49:11 -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 { Body, Controller, Get, Put, Query } from '@nestjs/common'; | ||||||
| import { ApiTags } from '@nestjs/swagger'; | import { ApiTags } from '@nestjs/swagger'; | ||||||
| import { MapThemeDto } from 'src/dtos/system-config-map-theme.dto'; | import { MapThemeDto, SystemConfigDto, SystemConfigTemplateStorageOptionDto } from 'src/dtos/system-config.dto'; | ||||||
| import { SystemConfigTemplateStorageOptionDto } from 'src/dtos/system-config-storage-template.dto'; |  | ||||||
| import { SystemConfigDto } from 'src/dtos/system-config.dto'; |  | ||||||
| import { AdminRoute, Authenticated } from 'src/middleware/auth.guard'; | import { AdminRoute, Authenticated } from 'src/middleware/auth.guard'; | ||||||
| import { SystemConfigService } from 'src/services/system-config.service'; | import { SystemConfigService } from 'src/services/system-config.service'; | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -1,7 +1,7 @@ | |||||||
| import { ApiProperty, ApiResponseProperty } from '@nestjs/swagger'; | import { ApiProperty, ApiResponseProperty } from '@nestjs/swagger'; | ||||||
| import type { DateTime } from 'luxon'; | import type { DateTime } from 'luxon'; | ||||||
| import { FeatureFlags } from 'src/cores/system-config.core'; | 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'; | import { IVersion, VersionType } from 'src/utils/version'; | ||||||
| 
 | 
 | ||||||
| export class ServerPingResponse { | 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 { Type } from 'class-transformer'; | ||||||
| import { IsObject, ValidateNested } from 'class-validator'; | import { | ||||||
| import { SystemConfigFFmpegDto } from 'src/dtos/system-config-ffmpeg.dto'; |   IsEnum, | ||||||
| import { SystemConfigJobDto } from 'src/dtos/system-config-job.dto'; |   IsInt, | ||||||
| import { SystemConfigLibraryDto } from 'src/dtos/system-config-library.dto'; |   IsNotEmpty, | ||||||
| import { SystemConfigLoggingDto } from 'src/dtos/system-config-logging.dto'; |   IsNumber, | ||||||
| import { SystemConfigMachineLearningDto } from 'src/dtos/system-config-machine-learning.dto'; |   IsObject, | ||||||
| import { SystemConfigMapDto } from 'src/dtos/system-config-map.dto'; |   IsPositive, | ||||||
| import { SystemConfigNewVersionCheckDto } from 'src/dtos/system-config-new-version-check.dto'; |   IsString, | ||||||
| import { SystemConfigOAuthDto } from 'src/dtos/system-config-oauth.dto'; |   IsUrl, | ||||||
| import { SystemConfigPasswordLoginDto } from 'src/dtos/system-config-password-login.dto'; |   Max, | ||||||
| import { SystemConfigReverseGeocodingDto } from 'src/dtos/system-config-reverse-geocoding.dto'; |   Min, | ||||||
| import { SystemConfigServerDto } from 'src/dtos/system-config-server.dto'; |   Validate, | ||||||
| import { SystemConfigStorageTemplateDto } from 'src/dtos/system-config-storage-template.dto'; |   ValidateIf, | ||||||
| import { SystemConfigThemeDto } from 'src/dtos/system-config-theme.dto'; |   ValidateNested, | ||||||
| import { SystemConfigThumbnailDto } from 'src/dtos/system-config-thumbnail.dto'; |   ValidatorConstraint, | ||||||
| import { SystemConfigTrashDto } from 'src/dtos/system-config-trash.dto'; |   ValidatorConstraintInterface, | ||||||
| import { SystemConfigUserDto } from 'src/dtos/system-config-user.dto'; | } from 'class-validator'; | ||||||
| import { SystemConfig } from 'src/entities/system-config.entity'; | 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 { | export class SystemConfigDto implements SystemConfig { | ||||||
|   @Type(() => SystemConfigFFmpegDto) |   @Type(() => SystemConfigFFmpegDto) | ||||||
|  | |||||||
| @ -1,7 +1,7 @@ | |||||||
| import { Inject, Injectable, UnsupportedMediaTypeException } from '@nestjs/common'; | import { Inject, Injectable, UnsupportedMediaTypeException } from '@nestjs/common'; | ||||||
| import { StorageCore, StorageFolder } from 'src/cores/storage.core'; | import { StorageCore, StorageFolder } from 'src/cores/storage.core'; | ||||||
| import { SystemConfigCore } from 'src/cores/system-config.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 { AssetEntity, AssetType } from 'src/entities/asset.entity'; | ||||||
| import { AssetPathType } from 'src/entities/move.entity'; | import { AssetPathType } from 'src/entities/move.entity'; | ||||||
| import { | import { | ||||||
|  | |||||||
| @ -13,8 +13,7 @@ import { | |||||||
| } from 'src/constants'; | } from 'src/constants'; | ||||||
| import { SystemConfigCore } from 'src/cores/system-config.core'; | import { SystemConfigCore } from 'src/cores/system-config.core'; | ||||||
| import { OnEventInternal } from 'src/decorators'; | import { OnEventInternal } from 'src/decorators'; | ||||||
| import { SystemConfigTemplateStorageOptionDto } from 'src/dtos/system-config-storage-template.dto'; | import { SystemConfigDto, SystemConfigTemplateStorageOptionDto, mapConfig } from 'src/dtos/system-config.dto'; | ||||||
| import { SystemConfigDto, mapConfig } from 'src/dtos/system-config.dto'; |  | ||||||
| import { LogLevel, SystemConfig } from 'src/entities/system-config.entity'; | import { LogLevel, SystemConfig } from 'src/entities/system-config.entity'; | ||||||
| import { | import { | ||||||
|   ClientEvent, |   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 { CQMode, ToneMapping, TranscodeHWAccel, TranscodeTarget, VideoCodec } from 'src/entities/system-config.entity'; | ||||||
| import { | import { | ||||||
|   AudioStreamInfo, |   AudioStreamInfo, | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user