mirror of
https://github.com/immich-app/immich.git
synced 2024-11-28 09:33:27 +02: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…
Reference in New Issue
Block a user