mirror of
				https://github.com/immich-app/immich.git
				synced 2025-11-02 18:47:07 -05:00 
			
		
		
		
	
							parent
							
								
									2dcce03352
								
							
						
					
					
						commit
						84f7ca855a
					
				@ -4,9 +4,9 @@ import path from 'node:path';
 | 
				
			|||||||
import { LoginResponseDto } from 'src/domain/auth/auth.dto';
 | 
					import { LoginResponseDto } from 'src/domain/auth/auth.dto';
 | 
				
			||||||
import { LibraryResponseDto } from 'src/domain/library/library.dto';
 | 
					import { LibraryResponseDto } from 'src/domain/library/library.dto';
 | 
				
			||||||
import { LibraryService } from 'src/domain/library/library.service';
 | 
					import { LibraryService } from 'src/domain/library/library.service';
 | 
				
			||||||
import { StorageEventType } from 'src/domain/repositories/storage.repository';
 | 
					 | 
				
			||||||
import { AssetType } from 'src/infra/entities/asset.entity';
 | 
					import { AssetType } from 'src/infra/entities/asset.entity';
 | 
				
			||||||
import { LibraryType } from 'src/infra/entities/library.entity';
 | 
					import { LibraryType } from 'src/infra/entities/library.entity';
 | 
				
			||||||
 | 
					import { StorageEventType } from 'src/interfaces/storage.repository';
 | 
				
			||||||
import {
 | 
					import {
 | 
				
			||||||
  IMMICH_TEST_ASSET_PATH,
 | 
					  IMMICH_TEST_ASSET_PATH,
 | 
				
			||||||
  IMMICH_TEST_ASSET_TEMP_PATH,
 | 
					  IMMICH_TEST_ASSET_TEMP_PATH,
 | 
				
			||||||
 | 
				
			|||||||
@ -3,7 +3,7 @@ import { ApiQuery, ApiTags } from '@nestjs/swagger';
 | 
				
			|||||||
import { AuthDto } from 'src/domain/auth/auth.dto';
 | 
					import { AuthDto } from 'src/domain/auth/auth.dto';
 | 
				
			||||||
import { PartnerResponseDto, UpdatePartnerDto } from 'src/domain/partner/partner.dto';
 | 
					import { PartnerResponseDto, UpdatePartnerDto } from 'src/domain/partner/partner.dto';
 | 
				
			||||||
import { PartnerService } from 'src/domain/partner/partner.service';
 | 
					import { PartnerService } from 'src/domain/partner/partner.service';
 | 
				
			||||||
import { PartnerDirection } from 'src/domain/repositories/partner.repository';
 | 
					import { PartnerDirection } from 'src/interfaces/partner.repository';
 | 
				
			||||||
import { Auth, Authenticated } from 'src/middleware/auth.guard';
 | 
					import { Auth, Authenticated } from 'src/middleware/auth.guard';
 | 
				
			||||||
import { UUIDParamDto } from 'src/validation';
 | 
					import { UUIDParamDto } from 'src/validation';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -1,7 +1,7 @@
 | 
				
			|||||||
import { BadRequestException, UnauthorizedException } from '@nestjs/common';
 | 
					import { BadRequestException, UnauthorizedException } from '@nestjs/common';
 | 
				
			||||||
import { AuthDto } from 'src/domain/auth/auth.dto';
 | 
					import { AuthDto } from 'src/domain/auth/auth.dto';
 | 
				
			||||||
import { IAccessRepository } from 'src/domain/repositories/access.repository';
 | 
					 | 
				
			||||||
import { SharedLinkEntity } from 'src/infra/entities/shared-link.entity';
 | 
					import { SharedLinkEntity } from 'src/infra/entities/shared-link.entity';
 | 
				
			||||||
 | 
					import { IAccessRepository } from 'src/interfaces/access.repository';
 | 
				
			||||||
import { setDifference, setIsEqual, setUnion } from 'src/utils';
 | 
					import { setDifference, setIsEqual, setUnion } from 'src/utils';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export enum Permission {
 | 
					export enum Permission {
 | 
				
			||||||
 | 
				
			|||||||
@ -1,16 +1,16 @@
 | 
				
			|||||||
import { dirname, join, resolve } from 'node:path';
 | 
					import { dirname, join, resolve } from 'node:path';
 | 
				
			||||||
import { SystemConfigCore } from 'src/cores/system-config.core';
 | 
					import { SystemConfigCore } from 'src/cores/system-config.core';
 | 
				
			||||||
import { APP_MEDIA_LOCATION } from 'src/domain/domain.constant';
 | 
					import { APP_MEDIA_LOCATION } from 'src/domain/domain.constant';
 | 
				
			||||||
import { IAssetRepository } from 'src/domain/repositories/asset.repository';
 | 
					 | 
				
			||||||
import { ICryptoRepository } from 'src/domain/repositories/crypto.repository';
 | 
					 | 
				
			||||||
import { IMoveRepository } from 'src/domain/repositories/move.repository';
 | 
					 | 
				
			||||||
import { IPersonRepository } from 'src/domain/repositories/person.repository';
 | 
					 | 
				
			||||||
import { IStorageRepository } from 'src/domain/repositories/storage.repository';
 | 
					 | 
				
			||||||
import { ISystemConfigRepository } from 'src/domain/repositories/system-config.repository';
 | 
					 | 
				
			||||||
import { AssetEntity } from 'src/infra/entities/asset.entity';
 | 
					import { AssetEntity } from 'src/infra/entities/asset.entity';
 | 
				
			||||||
import { AssetPathType, PathType, PersonPathType } from 'src/infra/entities/move.entity';
 | 
					import { AssetPathType, PathType, PersonPathType } from 'src/infra/entities/move.entity';
 | 
				
			||||||
import { PersonEntity } from 'src/infra/entities/person.entity';
 | 
					import { PersonEntity } from 'src/infra/entities/person.entity';
 | 
				
			||||||
import { ImmichLogger } from 'src/infra/logger';
 | 
					import { ImmichLogger } from 'src/infra/logger';
 | 
				
			||||||
 | 
					import { IAssetRepository } from 'src/interfaces/asset.repository';
 | 
				
			||||||
 | 
					import { ICryptoRepository } from 'src/interfaces/crypto.repository';
 | 
				
			||||||
 | 
					import { IMoveRepository } from 'src/interfaces/move.repository';
 | 
				
			||||||
 | 
					import { IPersonRepository } from 'src/interfaces/person.repository';
 | 
				
			||||||
 | 
					import { IStorageRepository } from 'src/interfaces/storage.repository';
 | 
				
			||||||
 | 
					import { ISystemConfigRepository } from 'src/interfaces/system-config.repository';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export enum StorageFolder {
 | 
					export enum StorageFolder {
 | 
				
			||||||
  ENCODED_VIDEO = 'encoded-video',
 | 
					  ENCODED_VIDEO = 'encoded-video',
 | 
				
			||||||
 | 
				
			|||||||
@ -6,7 +6,6 @@ import { load as loadYaml } from 'js-yaml';
 | 
				
			|||||||
import * as _ from 'lodash';
 | 
					import * as _ from 'lodash';
 | 
				
			||||||
import { Subject } from 'rxjs';
 | 
					import { Subject } from 'rxjs';
 | 
				
			||||||
import { QueueName } from 'src/domain/job/job.constants';
 | 
					import { QueueName } from 'src/domain/job/job.constants';
 | 
				
			||||||
import { ISystemConfigRepository } from 'src/domain/repositories/system-config.repository';
 | 
					 | 
				
			||||||
import { SystemConfigDto } from 'src/domain/system-config/dto/system-config.dto';
 | 
					import { SystemConfigDto } from 'src/domain/system-config/dto/system-config.dto';
 | 
				
			||||||
import {
 | 
					import {
 | 
				
			||||||
  AudioCodec,
 | 
					  AudioCodec,
 | 
				
			||||||
@ -23,6 +22,7 @@ import {
 | 
				
			|||||||
  VideoCodec,
 | 
					  VideoCodec,
 | 
				
			||||||
} from 'src/infra/entities/system-config.entity';
 | 
					} from 'src/infra/entities/system-config.entity';
 | 
				
			||||||
import { ImmichLogger } from 'src/infra/logger';
 | 
					import { ImmichLogger } from 'src/infra/logger';
 | 
				
			||||||
 | 
					import { ISystemConfigRepository } from 'src/interfaces/system-config.repository';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export type SystemConfigValidator = (config: SystemConfig, newConfig: SystemConfig) => void | Promise<void>;
 | 
					export type SystemConfigValidator = (config: SystemConfig, newConfig: SystemConfig) => void | Promise<void>;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -1,11 +1,11 @@
 | 
				
			|||||||
import { BadRequestException, ForbiddenException } from '@nestjs/common';
 | 
					import { BadRequestException, ForbiddenException } from '@nestjs/common';
 | 
				
			||||||
import sanitize from 'sanitize-filename';
 | 
					import sanitize from 'sanitize-filename';
 | 
				
			||||||
import { ICryptoRepository } from 'src/domain/repositories/crypto.repository';
 | 
					 | 
				
			||||||
import { ILibraryRepository } from 'src/domain/repositories/library.repository';
 | 
					 | 
				
			||||||
import { IUserRepository } from 'src/domain/repositories/user.repository';
 | 
					 | 
				
			||||||
import { UserResponseDto } from 'src/domain/user/response-dto/user-response.dto';
 | 
					import { UserResponseDto } from 'src/domain/user/response-dto/user-response.dto';
 | 
				
			||||||
import { LibraryType } from 'src/infra/entities/library.entity';
 | 
					import { LibraryType } from 'src/infra/entities/library.entity';
 | 
				
			||||||
import { UserEntity } from 'src/infra/entities/user.entity';
 | 
					import { UserEntity } from 'src/infra/entities/user.entity';
 | 
				
			||||||
 | 
					import { ICryptoRepository } from 'src/interfaces/crypto.repository';
 | 
				
			||||||
 | 
					import { ILibraryRepository } from 'src/interfaces/library.repository';
 | 
				
			||||||
 | 
					import { IUserRepository } from 'src/interfaces/user.repository';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const SALT_ROUNDS = 10;
 | 
					const SALT_ROUNDS = 10;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -12,9 +12,9 @@ import {
 | 
				
			|||||||
  mapActivity,
 | 
					  mapActivity,
 | 
				
			||||||
} from 'src/domain/activity/activity.dto';
 | 
					} from 'src/domain/activity/activity.dto';
 | 
				
			||||||
import { AuthDto } from 'src/domain/auth/auth.dto';
 | 
					import { AuthDto } from 'src/domain/auth/auth.dto';
 | 
				
			||||||
import { IAccessRepository } from 'src/domain/repositories/access.repository';
 | 
					 | 
				
			||||||
import { IActivityRepository } from 'src/domain/repositories/activity.repository';
 | 
					 | 
				
			||||||
import { ActivityEntity } from 'src/infra/entities/activity.entity';
 | 
					import { ActivityEntity } from 'src/infra/entities/activity.entity';
 | 
				
			||||||
 | 
					import { IAccessRepository } from 'src/interfaces/access.repository';
 | 
				
			||||||
 | 
					import { IActivityRepository } from 'src/interfaces/activity.repository';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@Injectable()
 | 
					@Injectable()
 | 
				
			||||||
export class ActivityService {
 | 
					export class ActivityService {
 | 
				
			||||||
 | 
				
			|||||||
@ -1,7 +1,7 @@
 | 
				
			|||||||
import { BadRequestException } from '@nestjs/common';
 | 
					import { BadRequestException } from '@nestjs/common';
 | 
				
			||||||
import { ReactionType } from 'src/domain/activity/activity.dto';
 | 
					import { ReactionType } from 'src/domain/activity/activity.dto';
 | 
				
			||||||
import { ActivityService } from 'src/domain/activity/activity.service';
 | 
					import { ActivityService } from 'src/domain/activity/activity.service';
 | 
				
			||||||
import { IActivityRepository } from 'src/domain/repositories/activity.repository';
 | 
					import { IActivityRepository } from 'src/interfaces/activity.repository';
 | 
				
			||||||
import { activityStub } from 'test/fixtures/activity.stub';
 | 
					import { activityStub } from 'test/fixtures/activity.stub';
 | 
				
			||||||
import { authStub } from 'test/fixtures/auth.stub';
 | 
					import { authStub } from 'test/fixtures/auth.stub';
 | 
				
			||||||
import { IAccessRepositoryMock, newAccessRepositoryMock } from 'test/repositories/access.repository.mock';
 | 
					import { IAccessRepositoryMock, newAccessRepositoryMock } from 'test/repositories/access.repository.mock';
 | 
				
			||||||
 | 
				
			|||||||
@ -2,9 +2,9 @@ import { BadRequestException } from '@nestjs/common';
 | 
				
			|||||||
import _ from 'lodash';
 | 
					import _ from 'lodash';
 | 
				
			||||||
import { AlbumService } from 'src/domain/album/album.service';
 | 
					import { AlbumService } from 'src/domain/album/album.service';
 | 
				
			||||||
import { BulkIdErrorReason } from 'src/domain/asset/response-dto/asset-ids-response.dto';
 | 
					import { BulkIdErrorReason } from 'src/domain/asset/response-dto/asset-ids-response.dto';
 | 
				
			||||||
import { IAlbumRepository } from 'src/domain/repositories/album.repository';
 | 
					import { IAlbumRepository } from 'src/interfaces/album.repository';
 | 
				
			||||||
import { IAssetRepository } from 'src/domain/repositories/asset.repository';
 | 
					import { IAssetRepository } from 'src/interfaces/asset.repository';
 | 
				
			||||||
import { IUserRepository } from 'src/domain/repositories/user.repository';
 | 
					import { IUserRepository } from 'src/interfaces/user.repository';
 | 
				
			||||||
import { albumStub } from 'test/fixtures/album.stub';
 | 
					import { albumStub } from 'test/fixtures/album.stub';
 | 
				
			||||||
import { authStub } from 'test/fixtures/auth.stub';
 | 
					import { authStub } from 'test/fixtures/auth.stub';
 | 
				
			||||||
import { userStub } from 'test/fixtures/user.stub';
 | 
					import { userStub } from 'test/fixtures/user.stub';
 | 
				
			||||||
 | 
				
			|||||||
@ -14,13 +14,13 @@ import { AlbumInfoDto } from 'src/domain/album/dto/album.dto';
 | 
				
			|||||||
import { GetAlbumsDto } from 'src/domain/album/dto/get-albums.dto';
 | 
					import { GetAlbumsDto } from 'src/domain/album/dto/get-albums.dto';
 | 
				
			||||||
import { BulkIdErrorReason, BulkIdResponseDto, BulkIdsDto } from 'src/domain/asset/response-dto/asset-ids-response.dto';
 | 
					import { BulkIdErrorReason, BulkIdResponseDto, BulkIdsDto } from 'src/domain/asset/response-dto/asset-ids-response.dto';
 | 
				
			||||||
import { AuthDto } from 'src/domain/auth/auth.dto';
 | 
					import { AuthDto } from 'src/domain/auth/auth.dto';
 | 
				
			||||||
import { IAccessRepository } from 'src/domain/repositories/access.repository';
 | 
					 | 
				
			||||||
import { AlbumAssetCount, AlbumInfoOptions, IAlbumRepository } from 'src/domain/repositories/album.repository';
 | 
					 | 
				
			||||||
import { IAssetRepository } from 'src/domain/repositories/asset.repository';
 | 
					 | 
				
			||||||
import { IUserRepository } from 'src/domain/repositories/user.repository';
 | 
					 | 
				
			||||||
import { AlbumEntity } from 'src/infra/entities/album.entity';
 | 
					import { AlbumEntity } from 'src/infra/entities/album.entity';
 | 
				
			||||||
import { AssetEntity } from 'src/infra/entities/asset.entity';
 | 
					import { AssetEntity } from 'src/infra/entities/asset.entity';
 | 
				
			||||||
import { UserEntity } from 'src/infra/entities/user.entity';
 | 
					import { UserEntity } from 'src/infra/entities/user.entity';
 | 
				
			||||||
 | 
					import { IAccessRepository } from 'src/interfaces/access.repository';
 | 
				
			||||||
 | 
					import { AlbumAssetCount, AlbumInfoOptions, IAlbumRepository } from 'src/interfaces/album.repository';
 | 
				
			||||||
 | 
					import { IAssetRepository } from 'src/interfaces/asset.repository';
 | 
				
			||||||
 | 
					import { IUserRepository } from 'src/interfaces/user.repository';
 | 
				
			||||||
import { setUnion } from 'src/utils';
 | 
					import { setUnion } from 'src/utils';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@Injectable()
 | 
					@Injectable()
 | 
				
			||||||
 | 
				
			|||||||
@ -1,7 +1,7 @@
 | 
				
			|||||||
import { BadRequestException } from '@nestjs/common';
 | 
					import { BadRequestException } from '@nestjs/common';
 | 
				
			||||||
import { APIKeyService } from 'src/domain/api-key/api-key.service';
 | 
					import { APIKeyService } from 'src/domain/api-key/api-key.service';
 | 
				
			||||||
import { IKeyRepository } from 'src/domain/repositories/api-key.repository';
 | 
					import { IKeyRepository } from 'src/interfaces/api-key.repository';
 | 
				
			||||||
import { ICryptoRepository } from 'src/domain/repositories/crypto.repository';
 | 
					import { ICryptoRepository } from 'src/interfaces/crypto.repository';
 | 
				
			||||||
import { keyStub } from 'test/fixtures/api-key.stub';
 | 
					import { keyStub } from 'test/fixtures/api-key.stub';
 | 
				
			||||||
import { authStub } from 'test/fixtures/auth.stub';
 | 
					import { authStub } from 'test/fixtures/auth.stub';
 | 
				
			||||||
import { newKeyRepositoryMock } from 'test/repositories/api-key.repository.mock';
 | 
					import { newKeyRepositoryMock } from 'test/repositories/api-key.repository.mock';
 | 
				
			||||||
 | 
				
			|||||||
@ -1,9 +1,9 @@
 | 
				
			|||||||
import { BadRequestException, Inject, Injectable } from '@nestjs/common';
 | 
					import { BadRequestException, Inject, Injectable } from '@nestjs/common';
 | 
				
			||||||
import { APIKeyCreateDto, APIKeyCreateResponseDto, APIKeyResponseDto } from 'src/domain/api-key/api-key.dto';
 | 
					import { APIKeyCreateDto, APIKeyCreateResponseDto, APIKeyResponseDto } from 'src/domain/api-key/api-key.dto';
 | 
				
			||||||
import { AuthDto } from 'src/domain/auth/auth.dto';
 | 
					import { AuthDto } from 'src/domain/auth/auth.dto';
 | 
				
			||||||
import { IKeyRepository } from 'src/domain/repositories/api-key.repository';
 | 
					 | 
				
			||||||
import { ICryptoRepository } from 'src/domain/repositories/crypto.repository';
 | 
					 | 
				
			||||||
import { APIKeyEntity } from 'src/infra/entities/api-key.entity';
 | 
					import { APIKeyEntity } from 'src/infra/entities/api-key.entity';
 | 
				
			||||||
 | 
					import { IKeyRepository } from 'src/interfaces/api-key.repository';
 | 
				
			||||||
 | 
					import { ICryptoRepository } from 'src/interfaces/crypto.repository';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@Injectable()
 | 
					@Injectable()
 | 
				
			||||||
export class APIKeyService {
 | 
					export class APIKeyService {
 | 
				
			||||||
 | 
				
			|||||||
@ -5,15 +5,15 @@ import { AssetJobName } from 'src/domain/asset/dto/asset-ids.dto';
 | 
				
			|||||||
import { AssetStatsResponseDto } from 'src/domain/asset/dto/asset-statistics.dto';
 | 
					import { AssetStatsResponseDto } from 'src/domain/asset/dto/asset-statistics.dto';
 | 
				
			||||||
import { mapAsset } from 'src/domain/asset/response-dto/asset-response.dto';
 | 
					import { mapAsset } from 'src/domain/asset/response-dto/asset-response.dto';
 | 
				
			||||||
import { JobName } from 'src/domain/job/job.constants';
 | 
					import { JobName } from 'src/domain/job/job.constants';
 | 
				
			||||||
import { IAssetStackRepository } from 'src/domain/repositories/asset-stack.repository';
 | 
					 | 
				
			||||||
import { AssetStats, IAssetRepository, TimeBucketSize } from 'src/domain/repositories/asset.repository';
 | 
					 | 
				
			||||||
import { ClientEvent, ICommunicationRepository } from 'src/domain/repositories/communication.repository';
 | 
					 | 
				
			||||||
import { IJobRepository, JobItem } from 'src/domain/repositories/job.repository';
 | 
					 | 
				
			||||||
import { IPartnerRepository } from 'src/domain/repositories/partner.repository';
 | 
					 | 
				
			||||||
import { IStorageRepository } from 'src/domain/repositories/storage.repository';
 | 
					 | 
				
			||||||
import { ISystemConfigRepository } from 'src/domain/repositories/system-config.repository';
 | 
					 | 
				
			||||||
import { IUserRepository } from 'src/domain/repositories/user.repository';
 | 
					 | 
				
			||||||
import { AssetEntity, AssetType } from 'src/infra/entities/asset.entity';
 | 
					import { AssetEntity, AssetType } from 'src/infra/entities/asset.entity';
 | 
				
			||||||
 | 
					import { IAssetStackRepository } from 'src/interfaces/asset-stack.repository';
 | 
				
			||||||
 | 
					import { AssetStats, IAssetRepository, TimeBucketSize } from 'src/interfaces/asset.repository';
 | 
				
			||||||
 | 
					import { ClientEvent, ICommunicationRepository } from 'src/interfaces/communication.repository';
 | 
				
			||||||
 | 
					import { IJobRepository, JobItem } from 'src/interfaces/job.repository';
 | 
				
			||||||
 | 
					import { IPartnerRepository } from 'src/interfaces/partner.repository';
 | 
				
			||||||
 | 
					import { IStorageRepository } from 'src/interfaces/storage.repository';
 | 
				
			||||||
 | 
					import { ISystemConfigRepository } from 'src/interfaces/system-config.repository';
 | 
				
			||||||
 | 
					import { IUserRepository } from 'src/interfaces/user.repository';
 | 
				
			||||||
import { assetStackStub, assetStub } from 'test/fixtures/asset.stub';
 | 
					import { assetStackStub, assetStub } from 'test/fixtures/asset.stub';
 | 
				
			||||||
import { authStub } from 'test/fixtures/auth.stub';
 | 
					import { authStub } from 'test/fixtures/auth.stub';
 | 
				
			||||||
import { faceStub } from 'test/fixtures/face.stub';
 | 
					import { faceStub } from 'test/fixtures/face.stub';
 | 
				
			||||||
 | 
				
			|||||||
@ -25,18 +25,18 @@ import { AuthDto } from 'src/domain/auth/auth.dto';
 | 
				
			|||||||
import { mimeTypes } from 'src/domain/domain.constant';
 | 
					import { mimeTypes } from 'src/domain/domain.constant';
 | 
				
			||||||
import { JOBS_ASSET_PAGINATION_SIZE, JobName } from 'src/domain/job/job.constants';
 | 
					import { JOBS_ASSET_PAGINATION_SIZE, JobName } from 'src/domain/job/job.constants';
 | 
				
			||||||
import { IAssetDeletionJob, ISidecarWriteJob } from 'src/domain/job/job.interface';
 | 
					import { IAssetDeletionJob, ISidecarWriteJob } from 'src/domain/job/job.interface';
 | 
				
			||||||
import { IAccessRepository } from 'src/domain/repositories/access.repository';
 | 
					 | 
				
			||||||
import { IAssetStackRepository } from 'src/domain/repositories/asset-stack.repository';
 | 
					 | 
				
			||||||
import { IAssetRepository, TimeBucketOptions } from 'src/domain/repositories/asset.repository';
 | 
					 | 
				
			||||||
import { ClientEvent, ICommunicationRepository } from 'src/domain/repositories/communication.repository';
 | 
					 | 
				
			||||||
import { IJobRepository, JobItem, JobStatus } from 'src/domain/repositories/job.repository';
 | 
					 | 
				
			||||||
import { IPartnerRepository } from 'src/domain/repositories/partner.repository';
 | 
					 | 
				
			||||||
import { IStorageRepository } from 'src/domain/repositories/storage.repository';
 | 
					 | 
				
			||||||
import { ISystemConfigRepository } from 'src/domain/repositories/system-config.repository';
 | 
					 | 
				
			||||||
import { IUserRepository } from 'src/domain/repositories/user.repository';
 | 
					 | 
				
			||||||
import { AssetEntity } from 'src/infra/entities/asset.entity';
 | 
					import { AssetEntity } from 'src/infra/entities/asset.entity';
 | 
				
			||||||
import { LibraryType } from 'src/infra/entities/library.entity';
 | 
					import { LibraryType } from 'src/infra/entities/library.entity';
 | 
				
			||||||
import { ImmichLogger } from 'src/infra/logger';
 | 
					import { ImmichLogger } from 'src/infra/logger';
 | 
				
			||||||
 | 
					import { IAccessRepository } from 'src/interfaces/access.repository';
 | 
				
			||||||
 | 
					import { IAssetStackRepository } from 'src/interfaces/asset-stack.repository';
 | 
				
			||||||
 | 
					import { IAssetRepository, TimeBucketOptions } from 'src/interfaces/asset.repository';
 | 
				
			||||||
 | 
					import { ClientEvent, ICommunicationRepository } from 'src/interfaces/communication.repository';
 | 
				
			||||||
 | 
					import { IJobRepository, JobItem, JobStatus } from 'src/interfaces/job.repository';
 | 
				
			||||||
 | 
					import { IPartnerRepository } from 'src/interfaces/partner.repository';
 | 
				
			||||||
 | 
					import { IStorageRepository } from 'src/interfaces/storage.repository';
 | 
				
			||||||
 | 
					import { ISystemConfigRepository } from 'src/interfaces/system-config.repository';
 | 
				
			||||||
 | 
					import { IUserRepository } from 'src/interfaces/user.repository';
 | 
				
			||||||
import { usePagination } from 'src/utils';
 | 
					import { usePagination } from 'src/utils';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export enum UploadFieldName {
 | 
					export enum UploadFieldName {
 | 
				
			||||||
 | 
				
			|||||||
@ -1,6 +1,6 @@
 | 
				
			|||||||
import { ApiProperty } from '@nestjs/swagger';
 | 
					import { ApiProperty } from '@nestjs/swagger';
 | 
				
			||||||
import { AssetStats } from 'src/domain/repositories/asset.repository';
 | 
					 | 
				
			||||||
import { AssetType } from 'src/infra/entities/asset.entity';
 | 
					import { AssetType } from 'src/infra/entities/asset.entity';
 | 
				
			||||||
 | 
					import { AssetStats } from 'src/interfaces/asset.repository';
 | 
				
			||||||
import { ValidateBoolean } from 'src/validation';
 | 
					import { ValidateBoolean } from 'src/validation';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export class AssetStatsDto {
 | 
					export class AssetStatsDto {
 | 
				
			||||||
 | 
				
			|||||||
@ -1,7 +1,7 @@
 | 
				
			|||||||
import { ApiProperty } from '@nestjs/swagger';
 | 
					import { ApiProperty } from '@nestjs/swagger';
 | 
				
			||||||
import { IsEnum, IsNotEmpty, IsString } from 'class-validator';
 | 
					import { IsEnum, IsNotEmpty, IsString } from 'class-validator';
 | 
				
			||||||
import { TimeBucketSize } from 'src/domain/repositories/asset.repository';
 | 
					 | 
				
			||||||
import { AssetOrder } from 'src/infra/entities/album.entity';
 | 
					import { AssetOrder } from 'src/infra/entities/album.entity';
 | 
				
			||||||
 | 
					import { TimeBucketSize } from 'src/interfaces/asset.repository';
 | 
				
			||||||
import { Optional, ValidateBoolean, ValidateUUID } from 'src/validation';
 | 
					import { Optional, ValidateBoolean, ValidateUUID } from 'src/validation';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export class TimeBucketDto {
 | 
					export class TimeBucketDto {
 | 
				
			||||||
 | 
				
			|||||||
@ -1,12 +1,12 @@
 | 
				
			|||||||
import { AuditService } from 'src/domain/audit/audit.service';
 | 
					import { AuditService } from 'src/domain/audit/audit.service';
 | 
				
			||||||
import { IAssetRepository } from 'src/domain/repositories/asset.repository';
 | 
					 | 
				
			||||||
import { IAuditRepository } from 'src/domain/repositories/audit.repository';
 | 
					 | 
				
			||||||
import { ICryptoRepository } from 'src/domain/repositories/crypto.repository';
 | 
					 | 
				
			||||||
import { JobStatus } from 'src/domain/repositories/job.repository';
 | 
					 | 
				
			||||||
import { IPersonRepository } from 'src/domain/repositories/person.repository';
 | 
					 | 
				
			||||||
import { IStorageRepository } from 'src/domain/repositories/storage.repository';
 | 
					 | 
				
			||||||
import { IUserRepository } from 'src/domain/repositories/user.repository';
 | 
					 | 
				
			||||||
import { DatabaseAction, EntityType } from 'src/infra/entities/audit.entity';
 | 
					import { DatabaseAction, EntityType } from 'src/infra/entities/audit.entity';
 | 
				
			||||||
 | 
					import { IAssetRepository } from 'src/interfaces/asset.repository';
 | 
				
			||||||
 | 
					import { IAuditRepository } from 'src/interfaces/audit.repository';
 | 
				
			||||||
 | 
					import { ICryptoRepository } from 'src/interfaces/crypto.repository';
 | 
				
			||||||
 | 
					import { JobStatus } from 'src/interfaces/job.repository';
 | 
				
			||||||
 | 
					import { IPersonRepository } from 'src/interfaces/person.repository';
 | 
				
			||||||
 | 
					import { IStorageRepository } from 'src/interfaces/storage.repository';
 | 
				
			||||||
 | 
					import { IUserRepository } from 'src/interfaces/user.repository';
 | 
				
			||||||
import { auditStub } from 'test/fixtures/audit.stub';
 | 
					import { auditStub } from 'test/fixtures/audit.stub';
 | 
				
			||||||
import { authStub } from 'test/fixtures/auth.stub';
 | 
					import { authStub } from 'test/fixtures/auth.stub';
 | 
				
			||||||
import { IAccessRepositoryMock, newAccessRepositoryMock } from 'test/repositories/access.repository.mock';
 | 
					import { IAccessRepositoryMock, newAccessRepositoryMock } from 'test/repositories/access.repository.mock';
 | 
				
			||||||
 | 
				
			|||||||
@ -14,17 +14,17 @@ import {
 | 
				
			|||||||
import { AuthDto } from 'src/domain/auth/auth.dto';
 | 
					import { AuthDto } from 'src/domain/auth/auth.dto';
 | 
				
			||||||
import { AUDIT_LOG_MAX_DURATION } from 'src/domain/domain.constant';
 | 
					import { AUDIT_LOG_MAX_DURATION } from 'src/domain/domain.constant';
 | 
				
			||||||
import { JOBS_ASSET_PAGINATION_SIZE } from 'src/domain/job/job.constants';
 | 
					import { JOBS_ASSET_PAGINATION_SIZE } from 'src/domain/job/job.constants';
 | 
				
			||||||
import { IAccessRepository } from 'src/domain/repositories/access.repository';
 | 
					 | 
				
			||||||
import { IAssetRepository } from 'src/domain/repositories/asset.repository';
 | 
					 | 
				
			||||||
import { IAuditRepository } from 'src/domain/repositories/audit.repository';
 | 
					 | 
				
			||||||
import { ICryptoRepository } from 'src/domain/repositories/crypto.repository';
 | 
					 | 
				
			||||||
import { JobStatus } from 'src/domain/repositories/job.repository';
 | 
					 | 
				
			||||||
import { IPersonRepository } from 'src/domain/repositories/person.repository';
 | 
					 | 
				
			||||||
import { IStorageRepository } from 'src/domain/repositories/storage.repository';
 | 
					 | 
				
			||||||
import { IUserRepository } from 'src/domain/repositories/user.repository';
 | 
					 | 
				
			||||||
import { DatabaseAction } from 'src/infra/entities/audit.entity';
 | 
					import { DatabaseAction } from 'src/infra/entities/audit.entity';
 | 
				
			||||||
import { AssetPathType, PersonPathType, UserPathType } from 'src/infra/entities/move.entity';
 | 
					import { AssetPathType, PersonPathType, UserPathType } from 'src/infra/entities/move.entity';
 | 
				
			||||||
import { ImmichLogger } from 'src/infra/logger';
 | 
					import { ImmichLogger } from 'src/infra/logger';
 | 
				
			||||||
 | 
					import { IAccessRepository } from 'src/interfaces/access.repository';
 | 
				
			||||||
 | 
					import { IAssetRepository } from 'src/interfaces/asset.repository';
 | 
				
			||||||
 | 
					import { IAuditRepository } from 'src/interfaces/audit.repository';
 | 
				
			||||||
 | 
					import { ICryptoRepository } from 'src/interfaces/crypto.repository';
 | 
				
			||||||
 | 
					import { JobStatus } from 'src/interfaces/job.repository';
 | 
				
			||||||
 | 
					import { IPersonRepository } from 'src/interfaces/person.repository';
 | 
				
			||||||
 | 
					import { IStorageRepository } from 'src/interfaces/storage.repository';
 | 
				
			||||||
 | 
					import { IUserRepository } from 'src/interfaces/user.repository';
 | 
				
			||||||
import { usePagination } from 'src/utils';
 | 
					import { usePagination } from 'src/utils';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@Injectable()
 | 
					@Injectable()
 | 
				
			||||||
 | 
				
			|||||||
@ -5,14 +5,14 @@ import { Socket } from 'socket.io';
 | 
				
			|||||||
import { AuthType } from 'src/domain/auth/auth.constant';
 | 
					import { AuthType } from 'src/domain/auth/auth.constant';
 | 
				
			||||||
import { AuthDto, SignUpDto } from 'src/domain/auth/auth.dto';
 | 
					import { AuthDto, SignUpDto } from 'src/domain/auth/auth.dto';
 | 
				
			||||||
import { AuthService } from 'src/domain/auth/auth.service';
 | 
					import { AuthService } from 'src/domain/auth/auth.service';
 | 
				
			||||||
import { IKeyRepository } from 'src/domain/repositories/api-key.repository';
 | 
					 | 
				
			||||||
import { ICryptoRepository } from 'src/domain/repositories/crypto.repository';
 | 
					 | 
				
			||||||
import { ILibraryRepository } from 'src/domain/repositories/library.repository';
 | 
					 | 
				
			||||||
import { ISharedLinkRepository } from 'src/domain/repositories/shared-link.repository';
 | 
					 | 
				
			||||||
import { ISystemConfigRepository } from 'src/domain/repositories/system-config.repository';
 | 
					 | 
				
			||||||
import { IUserTokenRepository } from 'src/domain/repositories/user-token.repository';
 | 
					 | 
				
			||||||
import { IUserRepository } from 'src/domain/repositories/user.repository';
 | 
					 | 
				
			||||||
import { UserEntity } from 'src/infra/entities/user.entity';
 | 
					import { UserEntity } from 'src/infra/entities/user.entity';
 | 
				
			||||||
 | 
					import { IKeyRepository } from 'src/interfaces/api-key.repository';
 | 
				
			||||||
 | 
					import { ICryptoRepository } from 'src/interfaces/crypto.repository';
 | 
				
			||||||
 | 
					import { ILibraryRepository } from 'src/interfaces/library.repository';
 | 
				
			||||||
 | 
					import { ISharedLinkRepository } from 'src/interfaces/shared-link.repository';
 | 
				
			||||||
 | 
					import { ISystemConfigRepository } from 'src/interfaces/system-config.repository';
 | 
				
			||||||
 | 
					import { IUserTokenRepository } from 'src/interfaces/user-token.repository';
 | 
				
			||||||
 | 
					import { IUserRepository } from 'src/interfaces/user.repository';
 | 
				
			||||||
import { keyStub } from 'test/fixtures/api-key.stub';
 | 
					import { keyStub } from 'test/fixtures/api-key.stub';
 | 
				
			||||||
import { authStub, loginResponseStub } from 'test/fixtures/auth.stub';
 | 
					import { authStub, loginResponseStub } from 'test/fixtures/auth.stub';
 | 
				
			||||||
import { sharedLinkStub } from 'test/fixtures/shared-link.stub';
 | 
					import { sharedLinkStub } from 'test/fixtures/shared-link.stub';
 | 
				
			||||||
 | 
				
			|||||||
@ -36,18 +36,18 @@ import {
 | 
				
			|||||||
  mapLoginResponse,
 | 
					  mapLoginResponse,
 | 
				
			||||||
  mapUserToken,
 | 
					  mapUserToken,
 | 
				
			||||||
} from 'src/domain/auth/auth.dto';
 | 
					} from 'src/domain/auth/auth.dto';
 | 
				
			||||||
import { IAccessRepository } from 'src/domain/repositories/access.repository';
 | 
					 | 
				
			||||||
import { IKeyRepository } from 'src/domain/repositories/api-key.repository';
 | 
					 | 
				
			||||||
import { ICryptoRepository } from 'src/domain/repositories/crypto.repository';
 | 
					 | 
				
			||||||
import { ILibraryRepository } from 'src/domain/repositories/library.repository';
 | 
					 | 
				
			||||||
import { ISharedLinkRepository } from 'src/domain/repositories/shared-link.repository';
 | 
					 | 
				
			||||||
import { ISystemConfigRepository } from 'src/domain/repositories/system-config.repository';
 | 
					 | 
				
			||||||
import { IUserTokenRepository } from 'src/domain/repositories/user-token.repository';
 | 
					 | 
				
			||||||
import { IUserRepository } from 'src/domain/repositories/user.repository';
 | 
					 | 
				
			||||||
import { UserResponseDto, mapUser } from 'src/domain/user/response-dto/user-response.dto';
 | 
					import { UserResponseDto, mapUser } from 'src/domain/user/response-dto/user-response.dto';
 | 
				
			||||||
import { SystemConfig } from 'src/infra/entities/system-config.entity';
 | 
					import { SystemConfig } from 'src/infra/entities/system-config.entity';
 | 
				
			||||||
import { UserEntity } from 'src/infra/entities/user.entity';
 | 
					import { UserEntity } from 'src/infra/entities/user.entity';
 | 
				
			||||||
import { ImmichLogger } from 'src/infra/logger';
 | 
					import { ImmichLogger } from 'src/infra/logger';
 | 
				
			||||||
 | 
					import { IAccessRepository } from 'src/interfaces/access.repository';
 | 
				
			||||||
 | 
					import { IKeyRepository } from 'src/interfaces/api-key.repository';
 | 
				
			||||||
 | 
					import { ICryptoRepository } from 'src/interfaces/crypto.repository';
 | 
				
			||||||
 | 
					import { ILibraryRepository } from 'src/interfaces/library.repository';
 | 
				
			||||||
 | 
					import { ISharedLinkRepository } from 'src/interfaces/shared-link.repository';
 | 
				
			||||||
 | 
					import { ISystemConfigRepository } from 'src/interfaces/system-config.repository';
 | 
				
			||||||
 | 
					import { IUserTokenRepository } from 'src/interfaces/user-token.repository';
 | 
				
			||||||
 | 
					import { IUserRepository } from 'src/interfaces/user.repository';
 | 
				
			||||||
import { HumanReadableSize } from 'src/utils';
 | 
					import { HumanReadableSize } from 'src/utils';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export interface LoginDetails {
 | 
					export interface LoginDetails {
 | 
				
			||||||
 | 
				
			|||||||
@ -1,7 +1,7 @@
 | 
				
			|||||||
import { DatabaseService } from 'src/domain/database/database.service';
 | 
					import { DatabaseService } from 'src/domain/database/database.service';
 | 
				
			||||||
import { Version, VersionType } from 'src/domain/domain.constant';
 | 
					import { Version, VersionType } from 'src/domain/domain.constant';
 | 
				
			||||||
import { DatabaseExtension, IDatabaseRepository, VectorIndex } from 'src/domain/repositories/database.repository';
 | 
					 | 
				
			||||||
import { ImmichLogger } from 'src/infra/logger';
 | 
					import { ImmichLogger } from 'src/infra/logger';
 | 
				
			||||||
 | 
					import { DatabaseExtension, IDatabaseRepository, VectorIndex } from 'src/interfaces/database.repository';
 | 
				
			||||||
import { newDatabaseRepositoryMock } from 'test/repositories/database.repository.mock';
 | 
					import { newDatabaseRepositoryMock } from 'test/repositories/database.repository.mock';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
describe(DatabaseService.name, () => {
 | 
					describe(DatabaseService.name, () => {
 | 
				
			||||||
 | 
				
			|||||||
@ -1,5 +1,6 @@
 | 
				
			|||||||
import { Inject, Injectable } from '@nestjs/common';
 | 
					import { Inject, Injectable } from '@nestjs/common';
 | 
				
			||||||
import { Version, VersionType } from 'src/domain/domain.constant';
 | 
					import { Version, VersionType } from 'src/domain/domain.constant';
 | 
				
			||||||
 | 
					import { ImmichLogger } from 'src/infra/logger';
 | 
				
			||||||
import {
 | 
					import {
 | 
				
			||||||
  DatabaseExtension,
 | 
					  DatabaseExtension,
 | 
				
			||||||
  DatabaseLock,
 | 
					  DatabaseLock,
 | 
				
			||||||
@ -7,8 +8,7 @@ import {
 | 
				
			|||||||
  VectorExtension,
 | 
					  VectorExtension,
 | 
				
			||||||
  VectorIndex,
 | 
					  VectorIndex,
 | 
				
			||||||
  extName,
 | 
					  extName,
 | 
				
			||||||
} from 'src/domain/repositories/database.repository';
 | 
					} from 'src/interfaces/database.repository';
 | 
				
			||||||
import { ImmichLogger } from 'src/infra/logger';
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
@Injectable()
 | 
					@Injectable()
 | 
				
			||||||
export class DatabaseService {
 | 
					export class DatabaseService {
 | 
				
			||||||
 | 
				
			|||||||
@ -2,8 +2,8 @@ import { BadRequestException } from '@nestjs/common';
 | 
				
			|||||||
import { when } from 'jest-when';
 | 
					import { when } from 'jest-when';
 | 
				
			||||||
import { DownloadResponseDto } from 'src/domain/download/download.dto';
 | 
					import { DownloadResponseDto } from 'src/domain/download/download.dto';
 | 
				
			||||||
import { DownloadService } from 'src/domain/download/download.service';
 | 
					import { DownloadService } from 'src/domain/download/download.service';
 | 
				
			||||||
import { IAssetRepository } from 'src/domain/repositories/asset.repository';
 | 
					import { IAssetRepository } from 'src/interfaces/asset.repository';
 | 
				
			||||||
import { IStorageRepository } from 'src/domain/repositories/storage.repository';
 | 
					import { IStorageRepository } from 'src/interfaces/storage.repository';
 | 
				
			||||||
import { CacheControl, ImmichFileResponse } from 'src/utils';
 | 
					import { CacheControl, ImmichFileResponse } from 'src/utils';
 | 
				
			||||||
import { assetStub } from 'test/fixtures/asset.stub';
 | 
					import { assetStub } from 'test/fixtures/asset.stub';
 | 
				
			||||||
import { authStub } from 'test/fixtures/auth.stub';
 | 
					import { authStub } from 'test/fixtures/auth.stub';
 | 
				
			||||||
 | 
				
			|||||||
@ -5,10 +5,10 @@ import { AssetIdsDto } from 'src/domain/asset/dto/asset-ids.dto';
 | 
				
			|||||||
import { AuthDto } from 'src/domain/auth/auth.dto';
 | 
					import { AuthDto } from 'src/domain/auth/auth.dto';
 | 
				
			||||||
import { mimeTypes } from 'src/domain/domain.constant';
 | 
					import { mimeTypes } from 'src/domain/domain.constant';
 | 
				
			||||||
import { DownloadArchiveInfo, DownloadInfoDto, DownloadResponseDto } from 'src/domain/download/download.dto';
 | 
					import { DownloadArchiveInfo, DownloadInfoDto, DownloadResponseDto } from 'src/domain/download/download.dto';
 | 
				
			||||||
import { IAccessRepository } from 'src/domain/repositories/access.repository';
 | 
					 | 
				
			||||||
import { IAssetRepository } from 'src/domain/repositories/asset.repository';
 | 
					 | 
				
			||||||
import { IStorageRepository, ImmichReadStream } from 'src/domain/repositories/storage.repository';
 | 
					 | 
				
			||||||
import { AssetEntity } from 'src/infra/entities/asset.entity';
 | 
					import { AssetEntity } from 'src/infra/entities/asset.entity';
 | 
				
			||||||
 | 
					import { IAccessRepository } from 'src/interfaces/access.repository';
 | 
				
			||||||
 | 
					import { IAssetRepository } from 'src/interfaces/asset.repository';
 | 
				
			||||||
 | 
					import { IStorageRepository, ImmichReadStream } from 'src/interfaces/storage.repository';
 | 
				
			||||||
import { CacheControl, HumanReadableSize, ImmichFileResponse, usePagination } from 'src/utils';
 | 
					import { CacheControl, HumanReadableSize, ImmichFileResponse, usePagination } from 'src/utils';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@Injectable()
 | 
					@Injectable()
 | 
				
			||||||
 | 
				
			|||||||
@ -2,12 +2,12 @@ import { BadRequestException } from '@nestjs/common';
 | 
				
			|||||||
import { FeatureFlag, SystemConfigCore } from 'src/cores/system-config.core';
 | 
					import { FeatureFlag, SystemConfigCore } from 'src/cores/system-config.core';
 | 
				
			||||||
import { JobCommand, JobName, QueueName } from 'src/domain/job/job.constants';
 | 
					import { JobCommand, JobName, QueueName } from 'src/domain/job/job.constants';
 | 
				
			||||||
import { JobService } from 'src/domain/job/job.service';
 | 
					import { JobService } from 'src/domain/job/job.service';
 | 
				
			||||||
import { IAssetRepository } from 'src/domain/repositories/asset.repository';
 | 
					 | 
				
			||||||
import { ICommunicationRepository } from 'src/domain/repositories/communication.repository';
 | 
					 | 
				
			||||||
import { IJobRepository, JobHandler, JobItem, JobStatus } from 'src/domain/repositories/job.repository';
 | 
					 | 
				
			||||||
import { IPersonRepository } from 'src/domain/repositories/person.repository';
 | 
					 | 
				
			||||||
import { ISystemConfigRepository } from 'src/domain/repositories/system-config.repository';
 | 
					 | 
				
			||||||
import { SystemConfig, SystemConfigKey } from 'src/infra/entities/system-config.entity';
 | 
					import { SystemConfig, SystemConfigKey } from 'src/infra/entities/system-config.entity';
 | 
				
			||||||
 | 
					import { IAssetRepository } from 'src/interfaces/asset.repository';
 | 
				
			||||||
 | 
					import { ICommunicationRepository } from 'src/interfaces/communication.repository';
 | 
				
			||||||
 | 
					import { IJobRepository, JobHandler, JobItem, JobStatus } from 'src/interfaces/job.repository';
 | 
				
			||||||
 | 
					import { IPersonRepository } from 'src/interfaces/person.repository';
 | 
				
			||||||
 | 
					import { ISystemConfigRepository } from 'src/interfaces/system-config.repository';
 | 
				
			||||||
import { assetStub } from 'test/fixtures/asset.stub';
 | 
					import { assetStub } from 'test/fixtures/asset.stub';
 | 
				
			||||||
import { newAssetRepositoryMock } from 'test/repositories/asset.repository.mock';
 | 
					import { newAssetRepositoryMock } from 'test/repositories/asset.repository.mock';
 | 
				
			||||||
import { newCommunicationRepositoryMock } from 'test/repositories/communication.repository.mock';
 | 
					import { newCommunicationRepositoryMock } from 'test/repositories/communication.repository.mock';
 | 
				
			||||||
 | 
				
			|||||||
@ -3,13 +3,13 @@ import { FeatureFlag, SystemConfigCore } from 'src/cores/system-config.core';
 | 
				
			|||||||
import { mapAsset } from 'src/domain/asset/response-dto/asset-response.dto';
 | 
					import { mapAsset } from 'src/domain/asset/response-dto/asset-response.dto';
 | 
				
			||||||
import { ConcurrentQueueName, JobCommand, JobName, QueueName } from 'src/domain/job/job.constants';
 | 
					import { ConcurrentQueueName, JobCommand, JobName, QueueName } from 'src/domain/job/job.constants';
 | 
				
			||||||
import { AllJobStatusResponseDto, JobCommandDto, JobStatusDto } from 'src/domain/job/job.dto';
 | 
					import { AllJobStatusResponseDto, JobCommandDto, JobStatusDto } from 'src/domain/job/job.dto';
 | 
				
			||||||
import { IAssetRepository } from 'src/domain/repositories/asset.repository';
 | 
					 | 
				
			||||||
import { ClientEvent, ICommunicationRepository } from 'src/domain/repositories/communication.repository';
 | 
					 | 
				
			||||||
import { IJobRepository, JobHandler, JobItem, JobStatus, QueueCleanType } from 'src/domain/repositories/job.repository';
 | 
					 | 
				
			||||||
import { IPersonRepository } from 'src/domain/repositories/person.repository';
 | 
					 | 
				
			||||||
import { ISystemConfigRepository } from 'src/domain/repositories/system-config.repository';
 | 
					 | 
				
			||||||
import { AssetType } from 'src/infra/entities/asset.entity';
 | 
					import { AssetType } from 'src/infra/entities/asset.entity';
 | 
				
			||||||
import { ImmichLogger } from 'src/infra/logger';
 | 
					import { ImmichLogger } from 'src/infra/logger';
 | 
				
			||||||
 | 
					import { IAssetRepository } from 'src/interfaces/asset.repository';
 | 
				
			||||||
 | 
					import { ClientEvent, ICommunicationRepository } from 'src/interfaces/communication.repository';
 | 
				
			||||||
 | 
					import { IJobRepository, JobHandler, JobItem, JobStatus, QueueCleanType } from 'src/interfaces/job.repository';
 | 
				
			||||||
 | 
					import { IPersonRepository } from 'src/interfaces/person.repository';
 | 
				
			||||||
 | 
					import { ISystemConfigRepository } from 'src/interfaces/system-config.repository';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@Injectable()
 | 
					@Injectable()
 | 
				
			||||||
export class JobService {
 | 
					export class JobService {
 | 
				
			||||||
 | 
				
			|||||||
@ -7,17 +7,17 @@ import { JobName } from 'src/domain/job/job.constants';
 | 
				
			|||||||
import { ILibraryFileJob, ILibraryRefreshJob } from 'src/domain/job/job.interface';
 | 
					import { ILibraryFileJob, ILibraryRefreshJob } from 'src/domain/job/job.interface';
 | 
				
			||||||
import { mapLibrary } from 'src/domain/library/library.dto';
 | 
					import { mapLibrary } from 'src/domain/library/library.dto';
 | 
				
			||||||
import { LibraryService } from 'src/domain/library/library.service';
 | 
					import { LibraryService } from 'src/domain/library/library.service';
 | 
				
			||||||
import { IAssetRepository } from 'src/domain/repositories/asset.repository';
 | 
					 | 
				
			||||||
import { ICryptoRepository } from 'src/domain/repositories/crypto.repository';
 | 
					 | 
				
			||||||
import { IDatabaseRepository } from 'src/domain/repositories/database.repository';
 | 
					 | 
				
			||||||
import { IJobRepository, JobStatus } from 'src/domain/repositories/job.repository';
 | 
					 | 
				
			||||||
import { ILibraryRepository } from 'src/domain/repositories/library.repository';
 | 
					 | 
				
			||||||
import { IStorageRepository, StorageEventType } from 'src/domain/repositories/storage.repository';
 | 
					 | 
				
			||||||
import { ISystemConfigRepository } from 'src/domain/repositories/system-config.repository';
 | 
					 | 
				
			||||||
import { AssetType } from 'src/infra/entities/asset.entity';
 | 
					import { AssetType } from 'src/infra/entities/asset.entity';
 | 
				
			||||||
import { LibraryType } from 'src/infra/entities/library.entity';
 | 
					import { LibraryType } from 'src/infra/entities/library.entity';
 | 
				
			||||||
import { SystemConfig, SystemConfigKey } from 'src/infra/entities/system-config.entity';
 | 
					import { SystemConfig, SystemConfigKey } from 'src/infra/entities/system-config.entity';
 | 
				
			||||||
import { UserEntity } from 'src/infra/entities/user.entity';
 | 
					import { UserEntity } from 'src/infra/entities/user.entity';
 | 
				
			||||||
 | 
					import { IAssetRepository } from 'src/interfaces/asset.repository';
 | 
				
			||||||
 | 
					import { ICryptoRepository } from 'src/interfaces/crypto.repository';
 | 
				
			||||||
 | 
					import { IDatabaseRepository } from 'src/interfaces/database.repository';
 | 
				
			||||||
 | 
					import { IJobRepository, JobStatus } from 'src/interfaces/job.repository';
 | 
				
			||||||
 | 
					import { ILibraryRepository } from 'src/interfaces/library.repository';
 | 
				
			||||||
 | 
					import { IStorageRepository, StorageEventType } from 'src/interfaces/storage.repository';
 | 
				
			||||||
 | 
					import { ISystemConfigRepository } from 'src/interfaces/system-config.repository';
 | 
				
			||||||
import { assetStub } from 'test/fixtures/asset.stub';
 | 
					import { assetStub } from 'test/fixtures/asset.stub';
 | 
				
			||||||
import { authStub } from 'test/fixtures/auth.stub';
 | 
					import { authStub } from 'test/fixtures/auth.stub';
 | 
				
			||||||
import { libraryStub } from 'test/fixtures/library.stub';
 | 
					import { libraryStub } from 'test/fixtures/library.stub';
 | 
				
			||||||
 | 
				
			|||||||
@ -23,17 +23,17 @@ import {
 | 
				
			|||||||
  ValidateLibraryResponseDto,
 | 
					  ValidateLibraryResponseDto,
 | 
				
			||||||
  mapLibrary,
 | 
					  mapLibrary,
 | 
				
			||||||
} from 'src/domain/library/library.dto';
 | 
					} from 'src/domain/library/library.dto';
 | 
				
			||||||
import { IAssetRepository, WithProperty } from 'src/domain/repositories/asset.repository';
 | 
					 | 
				
			||||||
import { InternalEvent, InternalEventMap } from 'src/domain/repositories/communication.repository';
 | 
					 | 
				
			||||||
import { ICryptoRepository } from 'src/domain/repositories/crypto.repository';
 | 
					 | 
				
			||||||
import { DatabaseLock, IDatabaseRepository } from 'src/domain/repositories/database.repository';
 | 
					 | 
				
			||||||
import { IJobRepository, JobStatus } from 'src/domain/repositories/job.repository';
 | 
					 | 
				
			||||||
import { ILibraryRepository } from 'src/domain/repositories/library.repository';
 | 
					 | 
				
			||||||
import { IStorageRepository, StorageEventType } from 'src/domain/repositories/storage.repository';
 | 
					 | 
				
			||||||
import { ISystemConfigRepository } from 'src/domain/repositories/system-config.repository';
 | 
					 | 
				
			||||||
import { AssetType } from 'src/infra/entities/asset.entity';
 | 
					import { AssetType } from 'src/infra/entities/asset.entity';
 | 
				
			||||||
import { LibraryEntity, LibraryType } from 'src/infra/entities/library.entity';
 | 
					import { LibraryEntity, LibraryType } from 'src/infra/entities/library.entity';
 | 
				
			||||||
import { ImmichLogger } from 'src/infra/logger';
 | 
					import { ImmichLogger } from 'src/infra/logger';
 | 
				
			||||||
 | 
					import { IAssetRepository, WithProperty } from 'src/interfaces/asset.repository';
 | 
				
			||||||
 | 
					import { InternalEvent, InternalEventMap } from 'src/interfaces/communication.repository';
 | 
				
			||||||
 | 
					import { ICryptoRepository } from 'src/interfaces/crypto.repository';
 | 
				
			||||||
 | 
					import { DatabaseLock, IDatabaseRepository } from 'src/interfaces/database.repository';
 | 
				
			||||||
 | 
					import { IJobRepository, JobStatus } from 'src/interfaces/job.repository';
 | 
				
			||||||
 | 
					import { ILibraryRepository } from 'src/interfaces/library.repository';
 | 
				
			||||||
 | 
					import { IStorageRepository, StorageEventType } from 'src/interfaces/storage.repository';
 | 
				
			||||||
 | 
					import { ISystemConfigRepository } from 'src/interfaces/system-config.repository';
 | 
				
			||||||
import { handlePromiseError, usePagination } from 'src/utils';
 | 
					import { handlePromiseError, usePagination } from 'src/utils';
 | 
				
			||||||
import { validateCronExpression } from 'src/validation';
 | 
					import { validateCronExpression } from 'src/validation';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -1,14 +1,6 @@
 | 
				
			|||||||
import { Stats } from 'node:fs';
 | 
					import { Stats } from 'node:fs';
 | 
				
			||||||
import { JobName } from 'src/domain/job/job.constants';
 | 
					import { JobName } from 'src/domain/job/job.constants';
 | 
				
			||||||
import { MediaService } from 'src/domain/media/media.service';
 | 
					import { MediaService } from 'src/domain/media/media.service';
 | 
				
			||||||
import { IAssetRepository, WithoutProperty } from 'src/domain/repositories/asset.repository';
 | 
					 | 
				
			||||||
import { ICryptoRepository } from 'src/domain/repositories/crypto.repository';
 | 
					 | 
				
			||||||
import { IJobRepository, JobStatus } from 'src/domain/repositories/job.repository';
 | 
					 | 
				
			||||||
import { IMediaRepository } from 'src/domain/repositories/media.repository';
 | 
					 | 
				
			||||||
import { IMoveRepository } from 'src/domain/repositories/move.repository';
 | 
					 | 
				
			||||||
import { IPersonRepository } from 'src/domain/repositories/person.repository';
 | 
					 | 
				
			||||||
import { IStorageRepository } from 'src/domain/repositories/storage.repository';
 | 
					 | 
				
			||||||
import { ISystemConfigRepository } from 'src/domain/repositories/system-config.repository';
 | 
					 | 
				
			||||||
import { AssetType } from 'src/infra/entities/asset.entity';
 | 
					import { AssetType } from 'src/infra/entities/asset.entity';
 | 
				
			||||||
import { ExifEntity } from 'src/infra/entities/exif.entity';
 | 
					import { ExifEntity } from 'src/infra/entities/exif.entity';
 | 
				
			||||||
import {
 | 
					import {
 | 
				
			||||||
@ -20,6 +12,14 @@ import {
 | 
				
			|||||||
  TranscodePolicy,
 | 
					  TranscodePolicy,
 | 
				
			||||||
  VideoCodec,
 | 
					  VideoCodec,
 | 
				
			||||||
} from 'src/infra/entities/system-config.entity';
 | 
					} from 'src/infra/entities/system-config.entity';
 | 
				
			||||||
 | 
					import { IAssetRepository, WithoutProperty } from 'src/interfaces/asset.repository';
 | 
				
			||||||
 | 
					import { ICryptoRepository } from 'src/interfaces/crypto.repository';
 | 
				
			||||||
 | 
					import { IJobRepository, JobStatus } from 'src/interfaces/job.repository';
 | 
				
			||||||
 | 
					import { IMediaRepository } from 'src/interfaces/media.repository';
 | 
				
			||||||
 | 
					import { IMoveRepository } from 'src/interfaces/move.repository';
 | 
				
			||||||
 | 
					import { IPersonRepository } from 'src/interfaces/person.repository';
 | 
				
			||||||
 | 
					import { IStorageRepository } from 'src/interfaces/storage.repository';
 | 
				
			||||||
 | 
					import { ISystemConfigRepository } from 'src/interfaces/system-config.repository';
 | 
				
			||||||
import { assetStub } from 'test/fixtures/asset.stub';
 | 
					import { assetStub } from 'test/fixtures/asset.stub';
 | 
				
			||||||
import { faceStub } from 'test/fixtures/face.stub';
 | 
					import { faceStub } from 'test/fixtures/face.stub';
 | 
				
			||||||
import { probeStub } from 'test/fixtures/media.stub';
 | 
					import { probeStub } from 'test/fixtures/media.stub';
 | 
				
			||||||
 | 
				
			|||||||
@ -13,19 +13,6 @@ import {
 | 
				
			|||||||
  VAAPIConfig,
 | 
					  VAAPIConfig,
 | 
				
			||||||
  VP9Config,
 | 
					  VP9Config,
 | 
				
			||||||
} from 'src/domain/media/media.util';
 | 
					} from 'src/domain/media/media.util';
 | 
				
			||||||
import { IAssetRepository, WithoutProperty } from 'src/domain/repositories/asset.repository';
 | 
					 | 
				
			||||||
import { ICryptoRepository } from 'src/domain/repositories/crypto.repository';
 | 
					 | 
				
			||||||
import { IJobRepository, JobItem, JobStatus } from 'src/domain/repositories/job.repository';
 | 
					 | 
				
			||||||
import {
 | 
					 | 
				
			||||||
  AudioStreamInfo,
 | 
					 | 
				
			||||||
  IMediaRepository,
 | 
					 | 
				
			||||||
  VideoCodecHWConfig,
 | 
					 | 
				
			||||||
  VideoStreamInfo,
 | 
					 | 
				
			||||||
} from 'src/domain/repositories/media.repository';
 | 
					 | 
				
			||||||
import { IMoveRepository } from 'src/domain/repositories/move.repository';
 | 
					 | 
				
			||||||
import { IPersonRepository } from 'src/domain/repositories/person.repository';
 | 
					 | 
				
			||||||
import { IStorageRepository } from 'src/domain/repositories/storage.repository';
 | 
					 | 
				
			||||||
import { ISystemConfigRepository } from 'src/domain/repositories/system-config.repository';
 | 
					 | 
				
			||||||
import { SystemConfigFFmpegDto } from 'src/domain/system-config/dto/system-config-ffmpeg.dto';
 | 
					import { SystemConfigFFmpegDto } from 'src/domain/system-config/dto/system-config-ffmpeg.dto';
 | 
				
			||||||
import { AssetEntity, AssetType } from 'src/infra/entities/asset.entity';
 | 
					import { AssetEntity, AssetType } from 'src/infra/entities/asset.entity';
 | 
				
			||||||
import { AssetPathType } from 'src/infra/entities/move.entity';
 | 
					import { AssetPathType } from 'src/infra/entities/move.entity';
 | 
				
			||||||
@ -38,6 +25,19 @@ import {
 | 
				
			|||||||
  VideoCodec,
 | 
					  VideoCodec,
 | 
				
			||||||
} from 'src/infra/entities/system-config.entity';
 | 
					} from 'src/infra/entities/system-config.entity';
 | 
				
			||||||
import { ImmichLogger } from 'src/infra/logger';
 | 
					import { ImmichLogger } from 'src/infra/logger';
 | 
				
			||||||
 | 
					import { IAssetRepository, WithoutProperty } from 'src/interfaces/asset.repository';
 | 
				
			||||||
 | 
					import { ICryptoRepository } from 'src/interfaces/crypto.repository';
 | 
				
			||||||
 | 
					import { IJobRepository, JobItem, JobStatus } from 'src/interfaces/job.repository';
 | 
				
			||||||
 | 
					import {
 | 
				
			||||||
 | 
					  AudioStreamInfo,
 | 
				
			||||||
 | 
					  IMediaRepository,
 | 
				
			||||||
 | 
					  VideoCodecHWConfig,
 | 
				
			||||||
 | 
					  VideoStreamInfo,
 | 
				
			||||||
 | 
					} from 'src/interfaces/media.repository';
 | 
				
			||||||
 | 
					import { IMoveRepository } from 'src/interfaces/move.repository';
 | 
				
			||||||
 | 
					import { IPersonRepository } from 'src/interfaces/person.repository';
 | 
				
			||||||
 | 
					import { IStorageRepository } from 'src/interfaces/storage.repository';
 | 
				
			||||||
 | 
					import { ISystemConfigRepository } from 'src/interfaces/system-config.repository';
 | 
				
			||||||
import { usePagination } from 'src/utils';
 | 
					import { usePagination } from 'src/utils';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@Injectable()
 | 
					@Injectable()
 | 
				
			||||||
 | 
				
			|||||||
@ -1,11 +1,3 @@
 | 
				
			|||||||
import {
 | 
					 | 
				
			||||||
  AudioStreamInfo,
 | 
					 | 
				
			||||||
  BitrateDistribution,
 | 
					 | 
				
			||||||
  TranscodeOptions,
 | 
					 | 
				
			||||||
  VideoCodecHWConfig,
 | 
					 | 
				
			||||||
  VideoCodecSWConfig,
 | 
					 | 
				
			||||||
  VideoStreamInfo,
 | 
					 | 
				
			||||||
} from 'src/domain/repositories/media.repository';
 | 
					 | 
				
			||||||
import { SystemConfigFFmpegDto } from 'src/domain/system-config/dto/system-config-ffmpeg.dto';
 | 
					import { SystemConfigFFmpegDto } from 'src/domain/system-config/dto/system-config-ffmpeg.dto';
 | 
				
			||||||
import {
 | 
					import {
 | 
				
			||||||
  CQMode,
 | 
					  CQMode,
 | 
				
			||||||
@ -14,6 +6,14 @@ import {
 | 
				
			|||||||
  TranscodeTarget,
 | 
					  TranscodeTarget,
 | 
				
			||||||
  VideoCodec,
 | 
					  VideoCodec,
 | 
				
			||||||
} from 'src/infra/entities/system-config.entity';
 | 
					} from 'src/infra/entities/system-config.entity';
 | 
				
			||||||
 | 
					import {
 | 
				
			||||||
 | 
					  AudioStreamInfo,
 | 
				
			||||||
 | 
					  BitrateDistribution,
 | 
				
			||||||
 | 
					  TranscodeOptions,
 | 
				
			||||||
 | 
					  VideoCodecHWConfig,
 | 
				
			||||||
 | 
					  VideoCodecSWConfig,
 | 
				
			||||||
 | 
					  VideoStreamInfo,
 | 
				
			||||||
 | 
					} from 'src/interfaces/media.repository';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class BaseConfig implements VideoCodecSWConfig {
 | 
					class BaseConfig implements VideoCodecSWConfig {
 | 
				
			||||||
  presets = ['veryslow', 'slower', 'slow', 'medium', 'fast', 'faster', 'veryfast', 'superfast', 'ultrafast'];
 | 
					  presets = ['veryslow', 'slower', 'slow', 'medium', 'fast', 'faster', 'veryfast', 'superfast', 'ultrafast'];
 | 
				
			||||||
 | 
				
			|||||||
@ -5,21 +5,21 @@ import { Stats } from 'node:fs';
 | 
				
			|||||||
import { constants } from 'node:fs/promises';
 | 
					import { constants } from 'node:fs/promises';
 | 
				
			||||||
import { JobName } from 'src/domain/job/job.constants';
 | 
					import { JobName } from 'src/domain/job/job.constants';
 | 
				
			||||||
import { MetadataService, Orientation } from 'src/domain/metadata/metadata.service';
 | 
					import { MetadataService, Orientation } from 'src/domain/metadata/metadata.service';
 | 
				
			||||||
import { IAlbumRepository } from 'src/domain/repositories/album.repository';
 | 
					 | 
				
			||||||
import { IAssetRepository, WithoutProperty } from 'src/domain/repositories/asset.repository';
 | 
					 | 
				
			||||||
import { ClientEvent, ICommunicationRepository } from 'src/domain/repositories/communication.repository';
 | 
					 | 
				
			||||||
import { ICryptoRepository } from 'src/domain/repositories/crypto.repository';
 | 
					 | 
				
			||||||
import { IDatabaseRepository } from 'src/domain/repositories/database.repository';
 | 
					 | 
				
			||||||
import { IJobRepository, JobStatus } from 'src/domain/repositories/job.repository';
 | 
					 | 
				
			||||||
import { IMediaRepository } from 'src/domain/repositories/media.repository';
 | 
					 | 
				
			||||||
import { IMetadataRepository, ImmichTags } from 'src/domain/repositories/metadata.repository';
 | 
					 | 
				
			||||||
import { IMoveRepository } from 'src/domain/repositories/move.repository';
 | 
					 | 
				
			||||||
import { IPersonRepository } from 'src/domain/repositories/person.repository';
 | 
					 | 
				
			||||||
import { IStorageRepository } from 'src/domain/repositories/storage.repository';
 | 
					 | 
				
			||||||
import { ISystemConfigRepository } from 'src/domain/repositories/system-config.repository';
 | 
					 | 
				
			||||||
import { AssetType } from 'src/infra/entities/asset.entity';
 | 
					import { AssetType } from 'src/infra/entities/asset.entity';
 | 
				
			||||||
import { ExifEntity } from 'src/infra/entities/exif.entity';
 | 
					import { ExifEntity } from 'src/infra/entities/exif.entity';
 | 
				
			||||||
import { SystemConfigKey } from 'src/infra/entities/system-config.entity';
 | 
					import { SystemConfigKey } from 'src/infra/entities/system-config.entity';
 | 
				
			||||||
 | 
					import { IAlbumRepository } from 'src/interfaces/album.repository';
 | 
				
			||||||
 | 
					import { IAssetRepository, WithoutProperty } from 'src/interfaces/asset.repository';
 | 
				
			||||||
 | 
					import { ClientEvent, ICommunicationRepository } from 'src/interfaces/communication.repository';
 | 
				
			||||||
 | 
					import { ICryptoRepository } from 'src/interfaces/crypto.repository';
 | 
				
			||||||
 | 
					import { IDatabaseRepository } from 'src/interfaces/database.repository';
 | 
				
			||||||
 | 
					import { IJobRepository, JobStatus } from 'src/interfaces/job.repository';
 | 
				
			||||||
 | 
					import { IMediaRepository } from 'src/interfaces/media.repository';
 | 
				
			||||||
 | 
					import { IMetadataRepository, ImmichTags } from 'src/interfaces/metadata.repository';
 | 
				
			||||||
 | 
					import { IMoveRepository } from 'src/interfaces/move.repository';
 | 
				
			||||||
 | 
					import { IPersonRepository } from 'src/interfaces/person.repository';
 | 
				
			||||||
 | 
					import { IStorageRepository } from 'src/interfaces/storage.repository';
 | 
				
			||||||
 | 
					import { ISystemConfigRepository } from 'src/interfaces/system-config.repository';
 | 
				
			||||||
import { assetStub } from 'test/fixtures/asset.stub';
 | 
					import { assetStub } from 'test/fixtures/asset.stub';
 | 
				
			||||||
import { fileStub } from 'test/fixtures/file.stub';
 | 
					import { fileStub } from 'test/fixtures/file.stub';
 | 
				
			||||||
import { probeStub } from 'test/fixtures/media.stub';
 | 
					import { probeStub } from 'test/fixtures/media.stub';
 | 
				
			||||||
 | 
				
			|||||||
@ -10,21 +10,21 @@ import { StorageCore } from 'src/cores/storage.core';
 | 
				
			|||||||
import { FeatureFlag, SystemConfigCore } from 'src/cores/system-config.core';
 | 
					import { FeatureFlag, SystemConfigCore } from 'src/cores/system-config.core';
 | 
				
			||||||
import { JOBS_ASSET_PAGINATION_SIZE, JobName, QueueName } from 'src/domain/job/job.constants';
 | 
					import { JOBS_ASSET_PAGINATION_SIZE, JobName, QueueName } from 'src/domain/job/job.constants';
 | 
				
			||||||
import { IBaseJob, IEntityJob, ISidecarWriteJob } from 'src/domain/job/job.interface';
 | 
					import { IBaseJob, IEntityJob, ISidecarWriteJob } from 'src/domain/job/job.interface';
 | 
				
			||||||
import { IAlbumRepository } from 'src/domain/repositories/album.repository';
 | 
					 | 
				
			||||||
import { IAssetRepository, WithoutProperty } from 'src/domain/repositories/asset.repository';
 | 
					 | 
				
			||||||
import { ClientEvent, ICommunicationRepository } from 'src/domain/repositories/communication.repository';
 | 
					 | 
				
			||||||
import { ICryptoRepository } from 'src/domain/repositories/crypto.repository';
 | 
					 | 
				
			||||||
import { DatabaseLock, IDatabaseRepository } from 'src/domain/repositories/database.repository';
 | 
					 | 
				
			||||||
import { IJobRepository, JobStatus } from 'src/domain/repositories/job.repository';
 | 
					 | 
				
			||||||
import { IMediaRepository } from 'src/domain/repositories/media.repository';
 | 
					 | 
				
			||||||
import { IMetadataRepository, ImmichTags } from 'src/domain/repositories/metadata.repository';
 | 
					 | 
				
			||||||
import { IMoveRepository } from 'src/domain/repositories/move.repository';
 | 
					 | 
				
			||||||
import { IPersonRepository } from 'src/domain/repositories/person.repository';
 | 
					 | 
				
			||||||
import { IStorageRepository } from 'src/domain/repositories/storage.repository';
 | 
					 | 
				
			||||||
import { ISystemConfigRepository } from 'src/domain/repositories/system-config.repository';
 | 
					 | 
				
			||||||
import { AssetEntity, AssetType } from 'src/infra/entities/asset.entity';
 | 
					import { AssetEntity, AssetType } from 'src/infra/entities/asset.entity';
 | 
				
			||||||
import { ExifEntity } from 'src/infra/entities/exif.entity';
 | 
					import { ExifEntity } from 'src/infra/entities/exif.entity';
 | 
				
			||||||
import { ImmichLogger } from 'src/infra/logger';
 | 
					import { ImmichLogger } from 'src/infra/logger';
 | 
				
			||||||
 | 
					import { IAlbumRepository } from 'src/interfaces/album.repository';
 | 
				
			||||||
 | 
					import { IAssetRepository, WithoutProperty } from 'src/interfaces/asset.repository';
 | 
				
			||||||
 | 
					import { ClientEvent, ICommunicationRepository } from 'src/interfaces/communication.repository';
 | 
				
			||||||
 | 
					import { ICryptoRepository } from 'src/interfaces/crypto.repository';
 | 
				
			||||||
 | 
					import { DatabaseLock, IDatabaseRepository } from 'src/interfaces/database.repository';
 | 
				
			||||||
 | 
					import { IJobRepository, JobStatus } from 'src/interfaces/job.repository';
 | 
				
			||||||
 | 
					import { IMediaRepository } from 'src/interfaces/media.repository';
 | 
				
			||||||
 | 
					import { IMetadataRepository, ImmichTags } from 'src/interfaces/metadata.repository';
 | 
				
			||||||
 | 
					import { IMoveRepository } from 'src/interfaces/move.repository';
 | 
				
			||||||
 | 
					import { IPersonRepository } from 'src/interfaces/person.repository';
 | 
				
			||||||
 | 
					import { IStorageRepository } from 'src/interfaces/storage.repository';
 | 
				
			||||||
 | 
					import { ISystemConfigRepository } from 'src/interfaces/system-config.repository';
 | 
				
			||||||
import { handlePromiseError, usePagination } from 'src/utils';
 | 
					import { handlePromiseError, usePagination } from 'src/utils';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/** look for a date from these tags (in order) */
 | 
					/** look for a date from these tags (in order) */
 | 
				
			||||||
 | 
				
			|||||||
@ -1,9 +1,9 @@
 | 
				
			|||||||
import { BadRequestException } from '@nestjs/common';
 | 
					import { BadRequestException } from '@nestjs/common';
 | 
				
			||||||
import { PartnerResponseDto } from 'src/domain/partner/partner.dto';
 | 
					import { PartnerResponseDto } from 'src/domain/partner/partner.dto';
 | 
				
			||||||
import { PartnerService } from 'src/domain/partner/partner.service';
 | 
					import { PartnerService } from 'src/domain/partner/partner.service';
 | 
				
			||||||
import { IAccessRepository } from 'src/domain/repositories/access.repository';
 | 
					 | 
				
			||||||
import { IPartnerRepository, PartnerDirection } from 'src/domain/repositories/partner.repository';
 | 
					 | 
				
			||||||
import { UserAvatarColor } from 'src/infra/entities/user.entity';
 | 
					import { UserAvatarColor } from 'src/infra/entities/user.entity';
 | 
				
			||||||
 | 
					import { IAccessRepository } from 'src/interfaces/access.repository';
 | 
				
			||||||
 | 
					import { IPartnerRepository, PartnerDirection } from 'src/interfaces/partner.repository';
 | 
				
			||||||
import { authStub } from 'test/fixtures/auth.stub';
 | 
					import { authStub } from 'test/fixtures/auth.stub';
 | 
				
			||||||
import { partnerStub } from 'test/fixtures/partner.stub';
 | 
					import { partnerStub } from 'test/fixtures/partner.stub';
 | 
				
			||||||
import { newPartnerRepositoryMock } from 'test/repositories/partner.repository.mock';
 | 
					import { newPartnerRepositoryMock } from 'test/repositories/partner.repository.mock';
 | 
				
			||||||
 | 
				
			|||||||
@ -2,10 +2,10 @@ import { BadRequestException, Inject, Injectable } from '@nestjs/common';
 | 
				
			|||||||
import { AccessCore, Permission } from 'src/cores/access.core';
 | 
					import { AccessCore, Permission } from 'src/cores/access.core';
 | 
				
			||||||
import { AuthDto } from 'src/domain/auth/auth.dto';
 | 
					import { AuthDto } from 'src/domain/auth/auth.dto';
 | 
				
			||||||
import { PartnerResponseDto, UpdatePartnerDto } from 'src/domain/partner/partner.dto';
 | 
					import { PartnerResponseDto, UpdatePartnerDto } from 'src/domain/partner/partner.dto';
 | 
				
			||||||
import { IAccessRepository } from 'src/domain/repositories/access.repository';
 | 
					 | 
				
			||||||
import { IPartnerRepository, PartnerDirection, PartnerIds } from 'src/domain/repositories/partner.repository';
 | 
					 | 
				
			||||||
import { mapUser } from 'src/domain/user/response-dto/user-response.dto';
 | 
					import { mapUser } from 'src/domain/user/response-dto/user-response.dto';
 | 
				
			||||||
import { PartnerEntity } from 'src/infra/entities/partner.entity';
 | 
					import { PartnerEntity } from 'src/infra/entities/partner.entity';
 | 
				
			||||||
 | 
					import { IAccessRepository } from 'src/interfaces/access.repository';
 | 
				
			||||||
 | 
					import { IPartnerRepository, PartnerDirection, PartnerIds } from 'src/interfaces/partner.repository';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@Injectable()
 | 
					@Injectable()
 | 
				
			||||||
export class PartnerService {
 | 
					export class PartnerService {
 | 
				
			||||||
 | 
				
			|||||||
@ -3,18 +3,18 @@ import { BulkIdErrorReason } from 'src/domain/asset/response-dto/asset-ids-respo
 | 
				
			|||||||
import { JobName } from 'src/domain/job/job.constants';
 | 
					import { JobName } from 'src/domain/job/job.constants';
 | 
				
			||||||
import { PersonResponseDto, mapFaces, mapPerson } from 'src/domain/person/person.dto';
 | 
					import { PersonResponseDto, mapFaces, mapPerson } from 'src/domain/person/person.dto';
 | 
				
			||||||
import { PersonService } from 'src/domain/person/person.service';
 | 
					import { PersonService } from 'src/domain/person/person.service';
 | 
				
			||||||
import { IAssetRepository, WithoutProperty } from 'src/domain/repositories/asset.repository';
 | 
					 | 
				
			||||||
import { ICryptoRepository } from 'src/domain/repositories/crypto.repository';
 | 
					 | 
				
			||||||
import { IJobRepository, JobStatus } from 'src/domain/repositories/job.repository';
 | 
					 | 
				
			||||||
import { IMachineLearningRepository } from 'src/domain/repositories/machine-learning.repository';
 | 
					 | 
				
			||||||
import { IMediaRepository } from 'src/domain/repositories/media.repository';
 | 
					 | 
				
			||||||
import { IMoveRepository } from 'src/domain/repositories/move.repository';
 | 
					 | 
				
			||||||
import { IPersonRepository } from 'src/domain/repositories/person.repository';
 | 
					 | 
				
			||||||
import { FaceSearchResult, ISearchRepository } from 'src/domain/repositories/search.repository';
 | 
					 | 
				
			||||||
import { IStorageRepository } from 'src/domain/repositories/storage.repository';
 | 
					 | 
				
			||||||
import { ISystemConfigRepository } from 'src/domain/repositories/system-config.repository';
 | 
					 | 
				
			||||||
import { AssetFaceEntity } from 'src/infra/entities/asset-face.entity';
 | 
					import { AssetFaceEntity } from 'src/infra/entities/asset-face.entity';
 | 
				
			||||||
import { Colorspace, SystemConfigKey } from 'src/infra/entities/system-config.entity';
 | 
					import { Colorspace, SystemConfigKey } from 'src/infra/entities/system-config.entity';
 | 
				
			||||||
 | 
					import { IAssetRepository, WithoutProperty } from 'src/interfaces/asset.repository';
 | 
				
			||||||
 | 
					import { ICryptoRepository } from 'src/interfaces/crypto.repository';
 | 
				
			||||||
 | 
					import { IJobRepository, JobStatus } from 'src/interfaces/job.repository';
 | 
				
			||||||
 | 
					import { IMachineLearningRepository } from 'src/interfaces/machine-learning.repository';
 | 
				
			||||||
 | 
					import { IMediaRepository } from 'src/interfaces/media.repository';
 | 
				
			||||||
 | 
					import { IMoveRepository } from 'src/interfaces/move.repository';
 | 
				
			||||||
 | 
					import { IPersonRepository } from 'src/interfaces/person.repository';
 | 
				
			||||||
 | 
					import { FaceSearchResult, ISearchRepository } from 'src/interfaces/search.repository';
 | 
				
			||||||
 | 
					import { IStorageRepository } from 'src/interfaces/storage.repository';
 | 
				
			||||||
 | 
					import { ISystemConfigRepository } from 'src/interfaces/system-config.repository';
 | 
				
			||||||
import { CacheControl, ImmichFileResponse } from 'src/utils';
 | 
					import { CacheControl, ImmichFileResponse } from 'src/utils';
 | 
				
			||||||
import { assetStub } from 'test/fixtures/asset.stub';
 | 
					import { assetStub } from 'test/fixtures/asset.stub';
 | 
				
			||||||
import { authStub } from 'test/fixtures/auth.stub';
 | 
					import { authStub } from 'test/fixtures/auth.stub';
 | 
				
			||||||
 | 
				
			|||||||
@ -24,20 +24,20 @@ import {
 | 
				
			|||||||
  mapFaces,
 | 
					  mapFaces,
 | 
				
			||||||
  mapPerson,
 | 
					  mapPerson,
 | 
				
			||||||
} from 'src/domain/person/person.dto';
 | 
					} from 'src/domain/person/person.dto';
 | 
				
			||||||
import { IAccessRepository } from 'src/domain/repositories/access.repository';
 | 
					 | 
				
			||||||
import { IAssetRepository, WithoutProperty } from 'src/domain/repositories/asset.repository';
 | 
					 | 
				
			||||||
import { ICryptoRepository } from 'src/domain/repositories/crypto.repository';
 | 
					 | 
				
			||||||
import { IJobRepository, JobItem, JobStatus } from 'src/domain/repositories/job.repository';
 | 
					 | 
				
			||||||
import { IMachineLearningRepository } from 'src/domain/repositories/machine-learning.repository';
 | 
					 | 
				
			||||||
import { CropOptions, IMediaRepository } from 'src/domain/repositories/media.repository';
 | 
					 | 
				
			||||||
import { IMoveRepository } from 'src/domain/repositories/move.repository';
 | 
					 | 
				
			||||||
import { IPersonRepository, UpdateFacesData } from 'src/domain/repositories/person.repository';
 | 
					 | 
				
			||||||
import { ISearchRepository } from 'src/domain/repositories/search.repository';
 | 
					 | 
				
			||||||
import { IStorageRepository } from 'src/domain/repositories/storage.repository';
 | 
					 | 
				
			||||||
import { ISystemConfigRepository } from 'src/domain/repositories/system-config.repository';
 | 
					 | 
				
			||||||
import { PersonPathType } from 'src/infra/entities/move.entity';
 | 
					import { PersonPathType } from 'src/infra/entities/move.entity';
 | 
				
			||||||
import { PersonEntity } from 'src/infra/entities/person.entity';
 | 
					import { PersonEntity } from 'src/infra/entities/person.entity';
 | 
				
			||||||
import { ImmichLogger } from 'src/infra/logger';
 | 
					import { ImmichLogger } from 'src/infra/logger';
 | 
				
			||||||
 | 
					import { IAccessRepository } from 'src/interfaces/access.repository';
 | 
				
			||||||
 | 
					import { IAssetRepository, WithoutProperty } from 'src/interfaces/asset.repository';
 | 
				
			||||||
 | 
					import { ICryptoRepository } from 'src/interfaces/crypto.repository';
 | 
				
			||||||
 | 
					import { IJobRepository, JobItem, JobStatus } from 'src/interfaces/job.repository';
 | 
				
			||||||
 | 
					import { IMachineLearningRepository } from 'src/interfaces/machine-learning.repository';
 | 
				
			||||||
 | 
					import { CropOptions, IMediaRepository } from 'src/interfaces/media.repository';
 | 
				
			||||||
 | 
					import { IMoveRepository } from 'src/interfaces/move.repository';
 | 
				
			||||||
 | 
					import { IPersonRepository, UpdateFacesData } from 'src/interfaces/person.repository';
 | 
				
			||||||
 | 
					import { ISearchRepository } from 'src/interfaces/search.repository';
 | 
				
			||||||
 | 
					import { IStorageRepository } from 'src/interfaces/storage.repository';
 | 
				
			||||||
 | 
					import { ISystemConfigRepository } from 'src/interfaces/system-config.repository';
 | 
				
			||||||
import { CacheControl, ImmichFileResponse, usePagination } from 'src/utils';
 | 
					import { CacheControl, ImmichFileResponse, usePagination } from 'src/utils';
 | 
				
			||||||
import { IsNull } from 'typeorm';
 | 
					import { IsNull } from 'typeorm';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -1,14 +1,14 @@
 | 
				
			|||||||
import { mapAsset } from 'src/domain/asset/response-dto/asset-response.dto';
 | 
					import { mapAsset } from 'src/domain/asset/response-dto/asset-response.dto';
 | 
				
			||||||
import { IAssetRepository } from 'src/domain/repositories/asset.repository';
 | 
					 | 
				
			||||||
import { IMachineLearningRepository } from 'src/domain/repositories/machine-learning.repository';
 | 
					 | 
				
			||||||
import { IMetadataRepository } from 'src/domain/repositories/metadata.repository';
 | 
					 | 
				
			||||||
import { IPartnerRepository } from 'src/domain/repositories/partner.repository';
 | 
					 | 
				
			||||||
import { IPersonRepository } from 'src/domain/repositories/person.repository';
 | 
					 | 
				
			||||||
import { ISearchRepository } from 'src/domain/repositories/search.repository';
 | 
					 | 
				
			||||||
import { ISystemConfigRepository } from 'src/domain/repositories/system-config.repository';
 | 
					 | 
				
			||||||
import { SearchDto } from 'src/domain/search/dto/search.dto';
 | 
					import { SearchDto } from 'src/domain/search/dto/search.dto';
 | 
				
			||||||
import { SearchService } from 'src/domain/search/search.service';
 | 
					import { SearchService } from 'src/domain/search/search.service';
 | 
				
			||||||
import { SystemConfigKey } from 'src/infra/entities/system-config.entity';
 | 
					import { SystemConfigKey } from 'src/infra/entities/system-config.entity';
 | 
				
			||||||
 | 
					import { IAssetRepository } from 'src/interfaces/asset.repository';
 | 
				
			||||||
 | 
					import { IMachineLearningRepository } from 'src/interfaces/machine-learning.repository';
 | 
				
			||||||
 | 
					import { IMetadataRepository } from 'src/interfaces/metadata.repository';
 | 
				
			||||||
 | 
					import { IPartnerRepository } from 'src/interfaces/partner.repository';
 | 
				
			||||||
 | 
					import { IPersonRepository } from 'src/interfaces/person.repository';
 | 
				
			||||||
 | 
					import { ISearchRepository } from 'src/interfaces/search.repository';
 | 
				
			||||||
 | 
					import { ISystemConfigRepository } from 'src/interfaces/system-config.repository';
 | 
				
			||||||
import { assetStub } from 'test/fixtures/asset.stub';
 | 
					import { assetStub } from 'test/fixtures/asset.stub';
 | 
				
			||||||
import { authStub } from 'test/fixtures/auth.stub';
 | 
					import { authStub } from 'test/fixtures/auth.stub';
 | 
				
			||||||
import { personStub } from 'test/fixtures/person.stub';
 | 
					import { personStub } from 'test/fixtures/person.stub';
 | 
				
			||||||
 | 
				
			|||||||
@ -3,13 +3,6 @@ import { FeatureFlag, SystemConfigCore } from 'src/cores/system-config.core';
 | 
				
			|||||||
import { AssetResponseDto, mapAsset } from 'src/domain/asset/response-dto/asset-response.dto';
 | 
					import { AssetResponseDto, mapAsset } from 'src/domain/asset/response-dto/asset-response.dto';
 | 
				
			||||||
import { AuthDto } from 'src/domain/auth/auth.dto';
 | 
					import { AuthDto } from 'src/domain/auth/auth.dto';
 | 
				
			||||||
import { PersonResponseDto } from 'src/domain/person/person.dto';
 | 
					import { PersonResponseDto } from 'src/domain/person/person.dto';
 | 
				
			||||||
import { IAssetRepository } from 'src/domain/repositories/asset.repository';
 | 
					 | 
				
			||||||
import { IMachineLearningRepository } from 'src/domain/repositories/machine-learning.repository';
 | 
					 | 
				
			||||||
import { IMetadataRepository } from 'src/domain/repositories/metadata.repository';
 | 
					 | 
				
			||||||
import { IPartnerRepository } from 'src/domain/repositories/partner.repository';
 | 
					 | 
				
			||||||
import { IPersonRepository } from 'src/domain/repositories/person.repository';
 | 
					 | 
				
			||||||
import { ISearchRepository, SearchExploreItem, SearchStrategy } from 'src/domain/repositories/search.repository';
 | 
					 | 
				
			||||||
import { ISystemConfigRepository } from 'src/domain/repositories/system-config.repository';
 | 
					 | 
				
			||||||
import { SearchSuggestionRequestDto, SearchSuggestionType } from 'src/domain/search/dto/search-suggestion.dto';
 | 
					import { SearchSuggestionRequestDto, SearchSuggestionType } from 'src/domain/search/dto/search-suggestion.dto';
 | 
				
			||||||
import {
 | 
					import {
 | 
				
			||||||
  MetadataSearchDto,
 | 
					  MetadataSearchDto,
 | 
				
			||||||
@ -23,6 +16,13 @@ import {
 | 
				
			|||||||
import { SearchResponseDto } from 'src/domain/search/response-dto/search-response.dto';
 | 
					import { SearchResponseDto } from 'src/domain/search/response-dto/search-response.dto';
 | 
				
			||||||
import { AssetOrder } from 'src/infra/entities/album.entity';
 | 
					import { AssetOrder } from 'src/infra/entities/album.entity';
 | 
				
			||||||
import { AssetEntity } from 'src/infra/entities/asset.entity';
 | 
					import { AssetEntity } from 'src/infra/entities/asset.entity';
 | 
				
			||||||
 | 
					import { IAssetRepository } from 'src/interfaces/asset.repository';
 | 
				
			||||||
 | 
					import { IMachineLearningRepository } from 'src/interfaces/machine-learning.repository';
 | 
				
			||||||
 | 
					import { IMetadataRepository } from 'src/interfaces/metadata.repository';
 | 
				
			||||||
 | 
					import { IPartnerRepository } from 'src/interfaces/partner.repository';
 | 
				
			||||||
 | 
					import { IPersonRepository } from 'src/interfaces/person.repository';
 | 
				
			||||||
 | 
					import { ISearchRepository, SearchExploreItem, SearchStrategy } from 'src/interfaces/search.repository';
 | 
				
			||||||
 | 
					import { ISystemConfigRepository } from 'src/interfaces/system-config.repository';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@Injectable()
 | 
					@Injectable()
 | 
				
			||||||
export class SearchService {
 | 
					export class SearchService {
 | 
				
			||||||
 | 
				
			|||||||
@ -1,12 +1,12 @@
 | 
				
			|||||||
import { serverVersion } from 'src/domain/domain.constant';
 | 
					import { serverVersion } from 'src/domain/domain.constant';
 | 
				
			||||||
import { ICommunicationRepository } from 'src/domain/repositories/communication.repository';
 | 
					 | 
				
			||||||
import { IServerInfoRepository } from 'src/domain/repositories/server-info.repository';
 | 
					 | 
				
			||||||
import { IStorageRepository } from 'src/domain/repositories/storage.repository';
 | 
					 | 
				
			||||||
import { ISystemConfigRepository } from 'src/domain/repositories/system-config.repository';
 | 
					 | 
				
			||||||
import { ISystemMetadataRepository } from 'src/domain/repositories/system-metadata.repository';
 | 
					 | 
				
			||||||
import { IUserRepository } from 'src/domain/repositories/user.repository';
 | 
					 | 
				
			||||||
import { ServerInfoService } from 'src/domain/server-info/server-info.service';
 | 
					import { ServerInfoService } from 'src/domain/server-info/server-info.service';
 | 
				
			||||||
import { SystemMetadataKey } from 'src/infra/entities/system-metadata.entity';
 | 
					import { SystemMetadataKey } from 'src/infra/entities/system-metadata.entity';
 | 
				
			||||||
 | 
					import { ICommunicationRepository } from 'src/interfaces/communication.repository';
 | 
				
			||||||
 | 
					import { IServerInfoRepository } from 'src/interfaces/server-info.repository';
 | 
				
			||||||
 | 
					import { IStorageRepository } from 'src/interfaces/storage.repository';
 | 
				
			||||||
 | 
					import { ISystemConfigRepository } from 'src/interfaces/system-config.repository';
 | 
				
			||||||
 | 
					import { ISystemMetadataRepository } from 'src/interfaces/system-metadata.repository';
 | 
				
			||||||
 | 
					import { IUserRepository } from 'src/interfaces/user.repository';
 | 
				
			||||||
import { newCommunicationRepositoryMock } from 'test/repositories/communication.repository.mock';
 | 
					import { newCommunicationRepositoryMock } from 'test/repositories/communication.repository.mock';
 | 
				
			||||||
import { newStorageRepositoryMock } from 'test/repositories/storage.repository.mock';
 | 
					import { newStorageRepositoryMock } from 'test/repositories/storage.repository.mock';
 | 
				
			||||||
import { newSystemConfigRepositoryMock } from 'test/repositories/system-config.repository.mock';
 | 
					import { newSystemConfigRepositoryMock } from 'test/repositories/system-config.repository.mock';
 | 
				
			||||||
 | 
				
			|||||||
@ -3,12 +3,6 @@ import { DateTime } from 'luxon';
 | 
				
			|||||||
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 { Version, isDev, mimeTypes, serverVersion } from 'src/domain/domain.constant';
 | 
					import { Version, isDev, mimeTypes, serverVersion } from 'src/domain/domain.constant';
 | 
				
			||||||
import { ClientEvent, ICommunicationRepository } from 'src/domain/repositories/communication.repository';
 | 
					 | 
				
			||||||
import { IServerInfoRepository } from 'src/domain/repositories/server-info.repository';
 | 
					 | 
				
			||||||
import { IStorageRepository } from 'src/domain/repositories/storage.repository';
 | 
					 | 
				
			||||||
import { ISystemConfigRepository } from 'src/domain/repositories/system-config.repository';
 | 
					 | 
				
			||||||
import { ISystemMetadataRepository } from 'src/domain/repositories/system-metadata.repository';
 | 
					 | 
				
			||||||
import { IUserRepository, UserStatsQueryResponse } from 'src/domain/repositories/user.repository';
 | 
					 | 
				
			||||||
import {
 | 
					import {
 | 
				
			||||||
  ServerConfigDto,
 | 
					  ServerConfigDto,
 | 
				
			||||||
  ServerFeaturesDto,
 | 
					  ServerFeaturesDto,
 | 
				
			||||||
@ -20,6 +14,12 @@ import {
 | 
				
			|||||||
} from 'src/domain/server-info/server-info.dto';
 | 
					} from 'src/domain/server-info/server-info.dto';
 | 
				
			||||||
import { SystemMetadataKey } from 'src/infra/entities/system-metadata.entity';
 | 
					import { SystemMetadataKey } from 'src/infra/entities/system-metadata.entity';
 | 
				
			||||||
import { ImmichLogger } from 'src/infra/logger';
 | 
					import { ImmichLogger } from 'src/infra/logger';
 | 
				
			||||||
 | 
					import { ClientEvent, ICommunicationRepository } from 'src/interfaces/communication.repository';
 | 
				
			||||||
 | 
					import { IServerInfoRepository } from 'src/interfaces/server-info.repository';
 | 
				
			||||||
 | 
					import { IStorageRepository } from 'src/interfaces/storage.repository';
 | 
				
			||||||
 | 
					import { ISystemConfigRepository } from 'src/interfaces/system-config.repository';
 | 
				
			||||||
 | 
					import { ISystemMetadataRepository } from 'src/interfaces/system-metadata.repository';
 | 
				
			||||||
 | 
					import { IUserRepository, UserStatsQueryResponse } from 'src/interfaces/user.repository';
 | 
				
			||||||
import { asHumanReadable } from 'src/utils';
 | 
					import { asHumanReadable } from 'src/utils';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@Injectable()
 | 
					@Injectable()
 | 
				
			||||||
 | 
				
			|||||||
@ -1,10 +1,10 @@
 | 
				
			|||||||
import { BadRequestException, ForbiddenException, UnauthorizedException } from '@nestjs/common';
 | 
					import { BadRequestException, ForbiddenException, UnauthorizedException } from '@nestjs/common';
 | 
				
			||||||
import _ from 'lodash';
 | 
					import _ from 'lodash';
 | 
				
			||||||
import { AssetIdErrorReason } from 'src/domain/asset/response-dto/asset-ids-response.dto';
 | 
					import { AssetIdErrorReason } from 'src/domain/asset/response-dto/asset-ids-response.dto';
 | 
				
			||||||
import { ICryptoRepository } from 'src/domain/repositories/crypto.repository';
 | 
					 | 
				
			||||||
import { ISharedLinkRepository } from 'src/domain/repositories/shared-link.repository';
 | 
					 | 
				
			||||||
import { SharedLinkService } from 'src/domain/shared-link/shared-link.service';
 | 
					import { SharedLinkService } from 'src/domain/shared-link/shared-link.service';
 | 
				
			||||||
import { SharedLinkType } from 'src/infra/entities/shared-link.entity';
 | 
					import { SharedLinkType } from 'src/infra/entities/shared-link.entity';
 | 
				
			||||||
 | 
					import { ICryptoRepository } from 'src/interfaces/crypto.repository';
 | 
				
			||||||
 | 
					import { ISharedLinkRepository } from 'src/interfaces/shared-link.repository';
 | 
				
			||||||
import { albumStub } from 'test/fixtures/album.stub';
 | 
					import { albumStub } from 'test/fixtures/album.stub';
 | 
				
			||||||
import { assetStub } from 'test/fixtures/asset.stub';
 | 
					import { assetStub } from 'test/fixtures/asset.stub';
 | 
				
			||||||
import { authStub } from 'test/fixtures/auth.stub';
 | 
					import { authStub } from 'test/fixtures/auth.stub';
 | 
				
			||||||
 | 
				
			|||||||
@ -3,9 +3,6 @@ import { AccessCore, Permission } from 'src/cores/access.core';
 | 
				
			|||||||
import { AssetIdsDto } from 'src/domain/asset/dto/asset-ids.dto';
 | 
					import { AssetIdsDto } from 'src/domain/asset/dto/asset-ids.dto';
 | 
				
			||||||
import { AssetIdErrorReason, AssetIdsResponseDto } from 'src/domain/asset/response-dto/asset-ids-response.dto';
 | 
					import { AssetIdErrorReason, AssetIdsResponseDto } from 'src/domain/asset/response-dto/asset-ids-response.dto';
 | 
				
			||||||
import { AuthDto } from 'src/domain/auth/auth.dto';
 | 
					import { AuthDto } from 'src/domain/auth/auth.dto';
 | 
				
			||||||
import { IAccessRepository } from 'src/domain/repositories/access.repository';
 | 
					 | 
				
			||||||
import { ICryptoRepository } from 'src/domain/repositories/crypto.repository';
 | 
					 | 
				
			||||||
import { ISharedLinkRepository } from 'src/domain/repositories/shared-link.repository';
 | 
					 | 
				
			||||||
import {
 | 
					import {
 | 
				
			||||||
  SharedLinkResponseDto,
 | 
					  SharedLinkResponseDto,
 | 
				
			||||||
  mapSharedLink,
 | 
					  mapSharedLink,
 | 
				
			||||||
@ -14,6 +11,9 @@ import {
 | 
				
			|||||||
import { SharedLinkCreateDto, SharedLinkEditDto, SharedLinkPasswordDto } from 'src/domain/shared-link/shared-link.dto';
 | 
					import { SharedLinkCreateDto, SharedLinkEditDto, SharedLinkPasswordDto } from 'src/domain/shared-link/shared-link.dto';
 | 
				
			||||||
import { AssetEntity } from 'src/infra/entities/asset.entity';
 | 
					import { AssetEntity } from 'src/infra/entities/asset.entity';
 | 
				
			||||||
import { SharedLinkEntity, SharedLinkType } from 'src/infra/entities/shared-link.entity';
 | 
					import { SharedLinkEntity, SharedLinkType } from 'src/infra/entities/shared-link.entity';
 | 
				
			||||||
 | 
					import { IAccessRepository } from 'src/interfaces/access.repository';
 | 
				
			||||||
 | 
					import { ICryptoRepository } from 'src/interfaces/crypto.repository';
 | 
				
			||||||
 | 
					import { ISharedLinkRepository } from 'src/interfaces/shared-link.repository';
 | 
				
			||||||
import { OpenGraphTags } from 'src/utils';
 | 
					import { OpenGraphTags } from 'src/utils';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@Injectable()
 | 
					@Injectable()
 | 
				
			||||||
 | 
				
			|||||||
@ -1,7 +1,7 @@
 | 
				
			|||||||
import { ApiProperty } from '@nestjs/swagger';
 | 
					import { ApiProperty } from '@nestjs/swagger';
 | 
				
			||||||
import { Type } from 'class-transformer';
 | 
					import { Type } from 'class-transformer';
 | 
				
			||||||
import { IsEnum, IsNotEmpty, IsNumber, IsString, Max, Min } from 'class-validator';
 | 
					import { IsEnum, IsNotEmpty, IsNumber, IsString, Max, Min } from 'class-validator';
 | 
				
			||||||
import { CLIPMode, ModelType } from 'src/domain/repositories/machine-learning.repository';
 | 
					import { CLIPMode, ModelType } from 'src/interfaces/machine-learning.repository';
 | 
				
			||||||
import { Optional, ValidateBoolean } from 'src/validation';
 | 
					import { Optional, ValidateBoolean } from 'src/validation';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export class ModelConfig {
 | 
					export class ModelConfig {
 | 
				
			||||||
 | 
				
			|||||||
@ -1,14 +1,14 @@
 | 
				
			|||||||
import { JobName } from 'src/domain/job/job.constants';
 | 
					import { JobName } from 'src/domain/job/job.constants';
 | 
				
			||||||
import { IAssetRepository, WithoutProperty } from 'src/domain/repositories/asset.repository';
 | 
					 | 
				
			||||||
import { IDatabaseRepository } from 'src/domain/repositories/database.repository';
 | 
					 | 
				
			||||||
import { IJobRepository } from 'src/domain/repositories/job.repository';
 | 
					 | 
				
			||||||
import { IMachineLearningRepository } from 'src/domain/repositories/machine-learning.repository';
 | 
					 | 
				
			||||||
import { ISearchRepository } from 'src/domain/repositories/search.repository';
 | 
					 | 
				
			||||||
import { ISystemConfigRepository } from 'src/domain/repositories/system-config.repository';
 | 
					 | 
				
			||||||
import { cleanModelName, getCLIPModelInfo } from 'src/domain/smart-info/smart-info.constant';
 | 
					import { cleanModelName, getCLIPModelInfo } from 'src/domain/smart-info/smart-info.constant';
 | 
				
			||||||
import { SmartInfoService } from 'src/domain/smart-info/smart-info.service';
 | 
					import { SmartInfoService } from 'src/domain/smart-info/smart-info.service';
 | 
				
			||||||
import { AssetEntity } from 'src/infra/entities/asset.entity';
 | 
					import { AssetEntity } from 'src/infra/entities/asset.entity';
 | 
				
			||||||
import { SystemConfigKey } from 'src/infra/entities/system-config.entity';
 | 
					import { SystemConfigKey } from 'src/infra/entities/system-config.entity';
 | 
				
			||||||
 | 
					import { IAssetRepository, WithoutProperty } from 'src/interfaces/asset.repository';
 | 
				
			||||||
 | 
					import { IDatabaseRepository } from 'src/interfaces/database.repository';
 | 
				
			||||||
 | 
					import { IJobRepository } from 'src/interfaces/job.repository';
 | 
				
			||||||
 | 
					import { IMachineLearningRepository } from 'src/interfaces/machine-learning.repository';
 | 
				
			||||||
 | 
					import { ISearchRepository } from 'src/interfaces/search.repository';
 | 
				
			||||||
 | 
					import { ISystemConfigRepository } from 'src/interfaces/system-config.repository';
 | 
				
			||||||
import { assetStub } from 'test/fixtures/asset.stub';
 | 
					import { assetStub } from 'test/fixtures/asset.stub';
 | 
				
			||||||
import { newAssetRepositoryMock } from 'test/repositories/asset.repository.mock';
 | 
					import { newAssetRepositoryMock } from 'test/repositories/asset.repository.mock';
 | 
				
			||||||
import { newDatabaseRepositoryMock } from 'test/repositories/database.repository.mock';
 | 
					import { newDatabaseRepositoryMock } from 'test/repositories/database.repository.mock';
 | 
				
			||||||
 | 
				
			|||||||
@ -2,13 +2,13 @@ import { Inject, Injectable } from '@nestjs/common';
 | 
				
			|||||||
import { SystemConfigCore } from 'src/cores/system-config.core';
 | 
					import { SystemConfigCore } from 'src/cores/system-config.core';
 | 
				
			||||||
import { JOBS_ASSET_PAGINATION_SIZE, JobName, QueueName } from 'src/domain/job/job.constants';
 | 
					import { JOBS_ASSET_PAGINATION_SIZE, JobName, QueueName } from 'src/domain/job/job.constants';
 | 
				
			||||||
import { IBaseJob, IEntityJob } from 'src/domain/job/job.interface';
 | 
					import { IBaseJob, IEntityJob } from 'src/domain/job/job.interface';
 | 
				
			||||||
import { IAssetRepository, WithoutProperty } from 'src/domain/repositories/asset.repository';
 | 
					 | 
				
			||||||
import { DatabaseLock, IDatabaseRepository } from 'src/domain/repositories/database.repository';
 | 
					 | 
				
			||||||
import { IJobRepository, JobStatus } from 'src/domain/repositories/job.repository';
 | 
					 | 
				
			||||||
import { IMachineLearningRepository } from 'src/domain/repositories/machine-learning.repository';
 | 
					 | 
				
			||||||
import { ISearchRepository } from 'src/domain/repositories/search.repository';
 | 
					 | 
				
			||||||
import { ISystemConfigRepository } from 'src/domain/repositories/system-config.repository';
 | 
					 | 
				
			||||||
import { ImmichLogger } from 'src/infra/logger';
 | 
					import { ImmichLogger } from 'src/infra/logger';
 | 
				
			||||||
 | 
					import { IAssetRepository, WithoutProperty } from 'src/interfaces/asset.repository';
 | 
				
			||||||
 | 
					import { DatabaseLock, IDatabaseRepository } from 'src/interfaces/database.repository';
 | 
				
			||||||
 | 
					import { IJobRepository, JobStatus } from 'src/interfaces/job.repository';
 | 
				
			||||||
 | 
					import { IMachineLearningRepository } from 'src/interfaces/machine-learning.repository';
 | 
				
			||||||
 | 
					import { ISearchRepository } from 'src/interfaces/search.repository';
 | 
				
			||||||
 | 
					import { ISystemConfigRepository } from 'src/interfaces/system-config.repository';
 | 
				
			||||||
import { usePagination } from 'src/utils';
 | 
					import { usePagination } from 'src/utils';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@Injectable()
 | 
					@Injectable()
 | 
				
			||||||
 | 
				
			|||||||
@ -1,19 +1,19 @@
 | 
				
			|||||||
import { when } from 'jest-when';
 | 
					import { when } from 'jest-when';
 | 
				
			||||||
import { Stats } from 'node:fs';
 | 
					import { Stats } from 'node:fs';
 | 
				
			||||||
import { SystemConfigCore, defaults } from 'src/cores/system-config.core';
 | 
					import { SystemConfigCore, defaults } from 'src/cores/system-config.core';
 | 
				
			||||||
import { IAlbumRepository } from 'src/domain/repositories/album.repository';
 | 
					 | 
				
			||||||
import { IAssetRepository } from 'src/domain/repositories/asset.repository';
 | 
					 | 
				
			||||||
import { ICryptoRepository } from 'src/domain/repositories/crypto.repository';
 | 
					 | 
				
			||||||
import { IDatabaseRepository } from 'src/domain/repositories/database.repository';
 | 
					 | 
				
			||||||
import { JobStatus } from 'src/domain/repositories/job.repository';
 | 
					 | 
				
			||||||
import { IMoveRepository } from 'src/domain/repositories/move.repository';
 | 
					 | 
				
			||||||
import { IPersonRepository } from 'src/domain/repositories/person.repository';
 | 
					 | 
				
			||||||
import { IStorageRepository } from 'src/domain/repositories/storage.repository';
 | 
					 | 
				
			||||||
import { ISystemConfigRepository } from 'src/domain/repositories/system-config.repository';
 | 
					 | 
				
			||||||
import { IUserRepository } from 'src/domain/repositories/user.repository';
 | 
					 | 
				
			||||||
import { StorageTemplateService } from 'src/domain/storage-template/storage-template.service';
 | 
					import { StorageTemplateService } from 'src/domain/storage-template/storage-template.service';
 | 
				
			||||||
import { AssetPathType } from 'src/infra/entities/move.entity';
 | 
					import { AssetPathType } from 'src/infra/entities/move.entity';
 | 
				
			||||||
import { SystemConfig, SystemConfigKey } from 'src/infra/entities/system-config.entity';
 | 
					import { SystemConfig, SystemConfigKey } from 'src/infra/entities/system-config.entity';
 | 
				
			||||||
 | 
					import { IAlbumRepository } from 'src/interfaces/album.repository';
 | 
				
			||||||
 | 
					import { IAssetRepository } from 'src/interfaces/asset.repository';
 | 
				
			||||||
 | 
					import { ICryptoRepository } from 'src/interfaces/crypto.repository';
 | 
				
			||||||
 | 
					import { IDatabaseRepository } from 'src/interfaces/database.repository';
 | 
				
			||||||
 | 
					import { JobStatus } from 'src/interfaces/job.repository';
 | 
				
			||||||
 | 
					import { IMoveRepository } from 'src/interfaces/move.repository';
 | 
				
			||||||
 | 
					import { IPersonRepository } from 'src/interfaces/person.repository';
 | 
				
			||||||
 | 
					import { IStorageRepository } from 'src/interfaces/storage.repository';
 | 
				
			||||||
 | 
					import { ISystemConfigRepository } from 'src/interfaces/system-config.repository';
 | 
				
			||||||
 | 
					import { IUserRepository } from 'src/interfaces/user.repository';
 | 
				
			||||||
import { assetStub } from 'test/fixtures/asset.stub';
 | 
					import { assetStub } from 'test/fixtures/asset.stub';
 | 
				
			||||||
import { userStub } from 'test/fixtures/user.stub';
 | 
					import { userStub } from 'test/fixtures/user.stub';
 | 
				
			||||||
import { newAlbumRepositoryMock } from 'test/repositories/album.repository.mock';
 | 
					import { newAlbumRepositoryMock } from 'test/repositories/album.repository.mock';
 | 
				
			||||||
 | 
				
			|||||||
@ -8,17 +8,6 @@ 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 { JOBS_ASSET_PAGINATION_SIZE } from 'src/domain/job/job.constants';
 | 
					import { JOBS_ASSET_PAGINATION_SIZE } from 'src/domain/job/job.constants';
 | 
				
			||||||
import { IEntityJob } from 'src/domain/job/job.interface';
 | 
					import { IEntityJob } from 'src/domain/job/job.interface';
 | 
				
			||||||
import { IAlbumRepository } from 'src/domain/repositories/album.repository';
 | 
					 | 
				
			||||||
import { IAssetRepository } from 'src/domain/repositories/asset.repository';
 | 
					 | 
				
			||||||
import { InternalEvent, InternalEventMap } from 'src/domain/repositories/communication.repository';
 | 
					 | 
				
			||||||
import { ICryptoRepository } from 'src/domain/repositories/crypto.repository';
 | 
					 | 
				
			||||||
import { DatabaseLock, IDatabaseRepository } from 'src/domain/repositories/database.repository';
 | 
					 | 
				
			||||||
import { JobStatus } from 'src/domain/repositories/job.repository';
 | 
					 | 
				
			||||||
import { IMoveRepository } from 'src/domain/repositories/move.repository';
 | 
					 | 
				
			||||||
import { IPersonRepository } from 'src/domain/repositories/person.repository';
 | 
					 | 
				
			||||||
import { IStorageRepository } from 'src/domain/repositories/storage.repository';
 | 
					 | 
				
			||||||
import { ISystemConfigRepository } from 'src/domain/repositories/system-config.repository';
 | 
					 | 
				
			||||||
import { IUserRepository } from 'src/domain/repositories/user.repository';
 | 
					 | 
				
			||||||
import {
 | 
					import {
 | 
				
			||||||
  supportedDayTokens,
 | 
					  supportedDayTokens,
 | 
				
			||||||
  supportedHourTokens,
 | 
					  supportedHourTokens,
 | 
				
			||||||
@ -32,6 +21,17 @@ import { AssetEntity, AssetType } from 'src/infra/entities/asset.entity';
 | 
				
			|||||||
import { AssetPathType } from 'src/infra/entities/move.entity';
 | 
					import { AssetPathType } from 'src/infra/entities/move.entity';
 | 
				
			||||||
import { SystemConfig } from 'src/infra/entities/system-config.entity';
 | 
					import { SystemConfig } from 'src/infra/entities/system-config.entity';
 | 
				
			||||||
import { ImmichLogger } from 'src/infra/logger';
 | 
					import { ImmichLogger } from 'src/infra/logger';
 | 
				
			||||||
 | 
					import { IAlbumRepository } from 'src/interfaces/album.repository';
 | 
				
			||||||
 | 
					import { IAssetRepository } from 'src/interfaces/asset.repository';
 | 
				
			||||||
 | 
					import { InternalEvent, InternalEventMap } from 'src/interfaces/communication.repository';
 | 
				
			||||||
 | 
					import { ICryptoRepository } from 'src/interfaces/crypto.repository';
 | 
				
			||||||
 | 
					import { DatabaseLock, IDatabaseRepository } from 'src/interfaces/database.repository';
 | 
				
			||||||
 | 
					import { JobStatus } from 'src/interfaces/job.repository';
 | 
				
			||||||
 | 
					import { IMoveRepository } from 'src/interfaces/move.repository';
 | 
				
			||||||
 | 
					import { IPersonRepository } from 'src/interfaces/person.repository';
 | 
				
			||||||
 | 
					import { IStorageRepository } from 'src/interfaces/storage.repository';
 | 
				
			||||||
 | 
					import { ISystemConfigRepository } from 'src/interfaces/system-config.repository';
 | 
				
			||||||
 | 
					import { IUserRepository } from 'src/interfaces/user.repository';
 | 
				
			||||||
import { getLivePhotoMotionFilename, usePagination } from 'src/utils';
 | 
					import { getLivePhotoMotionFilename, usePagination } from 'src/utils';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export interface MoveAssetMetadata {
 | 
					export interface MoveAssetMetadata {
 | 
				
			||||||
 | 
				
			|||||||
@ -1,5 +1,5 @@
 | 
				
			|||||||
import { IStorageRepository } from 'src/domain/repositories/storage.repository';
 | 
					 | 
				
			||||||
import { StorageService } from 'src/domain/storage/storage.service';
 | 
					import { StorageService } from 'src/domain/storage/storage.service';
 | 
				
			||||||
 | 
					import { IStorageRepository } from 'src/interfaces/storage.repository';
 | 
				
			||||||
import { newStorageRepositoryMock } from 'test/repositories/storage.repository.mock';
 | 
					import { newStorageRepositoryMock } from 'test/repositories/storage.repository.mock';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
describe(StorageService.name, () => {
 | 
					describe(StorageService.name, () => {
 | 
				
			||||||
 | 
				
			|||||||
@ -1,9 +1,9 @@
 | 
				
			|||||||
import { Inject, Injectable } from '@nestjs/common';
 | 
					import { Inject, Injectable } from '@nestjs/common';
 | 
				
			||||||
import { StorageCore, StorageFolder } from 'src/cores/storage.core';
 | 
					import { StorageCore, StorageFolder } from 'src/cores/storage.core';
 | 
				
			||||||
import { IDeleteFilesJob } from 'src/domain/job/job.interface';
 | 
					import { IDeleteFilesJob } from 'src/domain/job/job.interface';
 | 
				
			||||||
import { JobStatus } from 'src/domain/repositories/job.repository';
 | 
					 | 
				
			||||||
import { IStorageRepository } from 'src/domain/repositories/storage.repository';
 | 
					 | 
				
			||||||
import { ImmichLogger } from 'src/infra/logger';
 | 
					import { ImmichLogger } from 'src/infra/logger';
 | 
				
			||||||
 | 
					import { JobStatus } from 'src/interfaces/job.repository';
 | 
				
			||||||
 | 
					import { IStorageRepository } from 'src/interfaces/storage.repository';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@Injectable()
 | 
					@Injectable()
 | 
				
			||||||
export class StorageService {
 | 
					export class StorageService {
 | 
				
			||||||
 | 
				
			|||||||
@ -1,9 +1,6 @@
 | 
				
			|||||||
import { BadRequestException } from '@nestjs/common';
 | 
					import { BadRequestException } from '@nestjs/common';
 | 
				
			||||||
import { defaults } from 'src/cores/system-config.core';
 | 
					import { defaults } from 'src/cores/system-config.core';
 | 
				
			||||||
import { QueueName } from 'src/domain/job/job.constants';
 | 
					import { QueueName } from 'src/domain/job/job.constants';
 | 
				
			||||||
import { ICommunicationRepository, ServerEvent } from 'src/domain/repositories/communication.repository';
 | 
					 | 
				
			||||||
import { ISearchRepository } from 'src/domain/repositories/search.repository';
 | 
					 | 
				
			||||||
import { ISystemConfigRepository } from 'src/domain/repositories/system-config.repository';
 | 
					 | 
				
			||||||
import { SystemConfigService } from 'src/domain/system-config/system-config.service';
 | 
					import { SystemConfigService } from 'src/domain/system-config/system-config.service';
 | 
				
			||||||
import {
 | 
					import {
 | 
				
			||||||
  AudioCodec,
 | 
					  AudioCodec,
 | 
				
			||||||
@ -19,6 +16,9 @@ import {
 | 
				
			|||||||
  VideoCodec,
 | 
					  VideoCodec,
 | 
				
			||||||
} from 'src/infra/entities/system-config.entity';
 | 
					} from 'src/infra/entities/system-config.entity';
 | 
				
			||||||
import { ImmichLogger } from 'src/infra/logger';
 | 
					import { ImmichLogger } from 'src/infra/logger';
 | 
				
			||||||
 | 
					import { ICommunicationRepository, ServerEvent } from 'src/interfaces/communication.repository';
 | 
				
			||||||
 | 
					import { ISearchRepository } from 'src/interfaces/search.repository';
 | 
				
			||||||
 | 
					import { ISystemConfigRepository } from 'src/interfaces/system-config.repository';
 | 
				
			||||||
import { newCommunicationRepositoryMock } from 'test/repositories/communication.repository.mock';
 | 
					import { newCommunicationRepositoryMock } from 'test/repositories/communication.repository.mock';
 | 
				
			||||||
import { newSystemConfigRepositoryMock } from 'test/repositories/system-config.repository.mock';
 | 
					import { newSystemConfigRepositoryMock } from 'test/repositories/system-config.repository.mock';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -3,15 +3,6 @@ import { OnEvent } from '@nestjs/event-emitter';
 | 
				
			|||||||
import { instanceToPlain } from 'class-transformer';
 | 
					import { instanceToPlain } from 'class-transformer';
 | 
				
			||||||
import _ from 'lodash';
 | 
					import _ from 'lodash';
 | 
				
			||||||
import { SystemConfigCore } from 'src/cores/system-config.core';
 | 
					import { SystemConfigCore } from 'src/cores/system-config.core';
 | 
				
			||||||
import {
 | 
					 | 
				
			||||||
  ClientEvent,
 | 
					 | 
				
			||||||
  ICommunicationRepository,
 | 
					 | 
				
			||||||
  InternalEvent,
 | 
					 | 
				
			||||||
  InternalEventMap,
 | 
					 | 
				
			||||||
  ServerEvent,
 | 
					 | 
				
			||||||
} from 'src/domain/repositories/communication.repository';
 | 
					 | 
				
			||||||
import { ISearchRepository } from 'src/domain/repositories/search.repository';
 | 
					 | 
				
			||||||
import { ISystemConfigRepository } from 'src/domain/repositories/system-config.repository';
 | 
					 | 
				
			||||||
import { SystemConfigDto, mapConfig } from 'src/domain/system-config/dto/system-config.dto';
 | 
					import { SystemConfigDto, mapConfig } from 'src/domain/system-config/dto/system-config.dto';
 | 
				
			||||||
import { SystemConfigTemplateStorageOptionDto } from 'src/domain/system-config/response-dto/system-config-template-storage-option.dto';
 | 
					import { SystemConfigTemplateStorageOptionDto } from 'src/domain/system-config/response-dto/system-config-template-storage-option.dto';
 | 
				
			||||||
import {
 | 
					import {
 | 
				
			||||||
@ -26,6 +17,15 @@ import {
 | 
				
			|||||||
} from 'src/domain/system-config/system-config.constants';
 | 
					} from 'src/domain/system-config/system-config.constants';
 | 
				
			||||||
import { LogLevel, SystemConfig } from 'src/infra/entities/system-config.entity';
 | 
					import { LogLevel, SystemConfig } from 'src/infra/entities/system-config.entity';
 | 
				
			||||||
import { ImmichLogger } from 'src/infra/logger';
 | 
					import { ImmichLogger } from 'src/infra/logger';
 | 
				
			||||||
 | 
					import {
 | 
				
			||||||
 | 
					  ClientEvent,
 | 
				
			||||||
 | 
					  ICommunicationRepository,
 | 
				
			||||||
 | 
					  InternalEvent,
 | 
				
			||||||
 | 
					  InternalEventMap,
 | 
				
			||||||
 | 
					  ServerEvent,
 | 
				
			||||||
 | 
					} from 'src/interfaces/communication.repository';
 | 
				
			||||||
 | 
					import { ISearchRepository } from 'src/interfaces/search.repository';
 | 
				
			||||||
 | 
					import { ISystemConfigRepository } from 'src/interfaces/system-config.repository';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@Injectable()
 | 
					@Injectable()
 | 
				
			||||||
export class SystemConfigService {
 | 
					export class SystemConfigService {
 | 
				
			||||||
 | 
				
			|||||||
@ -1,9 +1,9 @@
 | 
				
			|||||||
import { BadRequestException } from '@nestjs/common';
 | 
					import { BadRequestException } from '@nestjs/common';
 | 
				
			||||||
import { when } from 'jest-when';
 | 
					import { when } from 'jest-when';
 | 
				
			||||||
import { AssetIdErrorReason } from 'src/domain/asset/response-dto/asset-ids-response.dto';
 | 
					import { AssetIdErrorReason } from 'src/domain/asset/response-dto/asset-ids-response.dto';
 | 
				
			||||||
import { ITagRepository } from 'src/domain/repositories/tag.repository';
 | 
					 | 
				
			||||||
import { TagService } from 'src/domain/tag/tag.service';
 | 
					import { TagService } from 'src/domain/tag/tag.service';
 | 
				
			||||||
import { TagType } from 'src/infra/entities/tag.entity';
 | 
					import { TagType } from 'src/infra/entities/tag.entity';
 | 
				
			||||||
 | 
					import { ITagRepository } from 'src/interfaces/tag.repository';
 | 
				
			||||||
import { assetStub } from 'test/fixtures/asset.stub';
 | 
					import { assetStub } from 'test/fixtures/asset.stub';
 | 
				
			||||||
import { authStub } from 'test/fixtures/auth.stub';
 | 
					import { authStub } from 'test/fixtures/auth.stub';
 | 
				
			||||||
import { tagResponseStub, tagStub } from 'test/fixtures/tag.stub';
 | 
					import { tagResponseStub, tagStub } from 'test/fixtures/tag.stub';
 | 
				
			||||||
 | 
				
			|||||||
@ -3,9 +3,9 @@ import { AssetIdsDto } from 'src/domain/asset/dto/asset-ids.dto';
 | 
				
			|||||||
import { AssetIdErrorReason, AssetIdsResponseDto } from 'src/domain/asset/response-dto/asset-ids-response.dto';
 | 
					import { AssetIdErrorReason, AssetIdsResponseDto } from 'src/domain/asset/response-dto/asset-ids-response.dto';
 | 
				
			||||||
import { AssetResponseDto, mapAsset } from 'src/domain/asset/response-dto/asset-response.dto';
 | 
					import { AssetResponseDto, mapAsset } from 'src/domain/asset/response-dto/asset-response.dto';
 | 
				
			||||||
import { AuthDto } from 'src/domain/auth/auth.dto';
 | 
					import { AuthDto } from 'src/domain/auth/auth.dto';
 | 
				
			||||||
import { ITagRepository } from 'src/domain/repositories/tag.repository';
 | 
					 | 
				
			||||||
import { TagResponseDto, mapTag } from 'src/domain/tag/tag-response.dto';
 | 
					import { TagResponseDto, mapTag } from 'src/domain/tag/tag-response.dto';
 | 
				
			||||||
import { CreateTagDto, UpdateTagDto } from 'src/domain/tag/tag.dto';
 | 
					import { CreateTagDto, UpdateTagDto } from 'src/domain/tag/tag.dto';
 | 
				
			||||||
 | 
					import { ITagRepository } from 'src/interfaces/tag.repository';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@Injectable()
 | 
					@Injectable()
 | 
				
			||||||
export class TagService {
 | 
					export class TagService {
 | 
				
			||||||
 | 
				
			|||||||
@ -1,9 +1,9 @@
 | 
				
			|||||||
import { BadRequestException } from '@nestjs/common';
 | 
					import { BadRequestException } from '@nestjs/common';
 | 
				
			||||||
import { JobName } from 'src/domain/job/job.constants';
 | 
					import { JobName } from 'src/domain/job/job.constants';
 | 
				
			||||||
import { IAssetRepository } from 'src/domain/repositories/asset.repository';
 | 
					 | 
				
			||||||
import { ClientEvent, ICommunicationRepository } from 'src/domain/repositories/communication.repository';
 | 
					 | 
				
			||||||
import { IJobRepository } from 'src/domain/repositories/job.repository';
 | 
					 | 
				
			||||||
import { TrashService } from 'src/domain/trash/trash.service';
 | 
					import { TrashService } from 'src/domain/trash/trash.service';
 | 
				
			||||||
 | 
					import { IAssetRepository } from 'src/interfaces/asset.repository';
 | 
				
			||||||
 | 
					import { ClientEvent, ICommunicationRepository } from 'src/interfaces/communication.repository';
 | 
				
			||||||
 | 
					import { IJobRepository } from 'src/interfaces/job.repository';
 | 
				
			||||||
import { assetStub } from 'test/fixtures/asset.stub';
 | 
					import { assetStub } from 'test/fixtures/asset.stub';
 | 
				
			||||||
import { authStub } from 'test/fixtures/auth.stub';
 | 
					import { authStub } from 'test/fixtures/auth.stub';
 | 
				
			||||||
import { IAccessRepositoryMock, newAccessRepositoryMock } from 'test/repositories/access.repository.mock';
 | 
					import { IAccessRepositoryMock, newAccessRepositoryMock } from 'test/repositories/access.repository.mock';
 | 
				
			||||||
 | 
				
			|||||||
@ -4,10 +4,10 @@ import { AccessCore, Permission } from 'src/cores/access.core';
 | 
				
			|||||||
import { BulkIdsDto } from 'src/domain/asset/response-dto/asset-ids-response.dto';
 | 
					import { BulkIdsDto } from 'src/domain/asset/response-dto/asset-ids-response.dto';
 | 
				
			||||||
import { AuthDto } from 'src/domain/auth/auth.dto';
 | 
					import { AuthDto } from 'src/domain/auth/auth.dto';
 | 
				
			||||||
import { JOBS_ASSET_PAGINATION_SIZE, JobName } from 'src/domain/job/job.constants';
 | 
					import { JOBS_ASSET_PAGINATION_SIZE, JobName } from 'src/domain/job/job.constants';
 | 
				
			||||||
import { IAccessRepository } from 'src/domain/repositories/access.repository';
 | 
					import { IAccessRepository } from 'src/interfaces/access.repository';
 | 
				
			||||||
import { IAssetRepository } from 'src/domain/repositories/asset.repository';
 | 
					import { IAssetRepository } from 'src/interfaces/asset.repository';
 | 
				
			||||||
import { ClientEvent, ICommunicationRepository } from 'src/domain/repositories/communication.repository';
 | 
					import { ClientEvent, ICommunicationRepository } from 'src/interfaces/communication.repository';
 | 
				
			||||||
import { IJobRepository } from 'src/domain/repositories/job.repository';
 | 
					import { IJobRepository } from 'src/interfaces/job.repository';
 | 
				
			||||||
import { usePagination } from 'src/utils';
 | 
					import { usePagination } from 'src/utils';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export class TrashService {
 | 
					export class TrashService {
 | 
				
			||||||
 | 
				
			|||||||
@ -6,17 +6,17 @@ import {
 | 
				
			|||||||
} from '@nestjs/common';
 | 
					} from '@nestjs/common';
 | 
				
			||||||
import { when } from 'jest-when';
 | 
					import { when } from 'jest-when';
 | 
				
			||||||
import { JobName } from 'src/domain/job/job.constants';
 | 
					import { JobName } from 'src/domain/job/job.constants';
 | 
				
			||||||
import { IAlbumRepository } from 'src/domain/repositories/album.repository';
 | 
					 | 
				
			||||||
import { ICryptoRepository } from 'src/domain/repositories/crypto.repository';
 | 
					 | 
				
			||||||
import { IJobRepository } from 'src/domain/repositories/job.repository';
 | 
					 | 
				
			||||||
import { ILibraryRepository } from 'src/domain/repositories/library.repository';
 | 
					 | 
				
			||||||
import { IStorageRepository } from 'src/domain/repositories/storage.repository';
 | 
					 | 
				
			||||||
import { ISystemConfigRepository } from 'src/domain/repositories/system-config.repository';
 | 
					 | 
				
			||||||
import { IUserRepository } from 'src/domain/repositories/user.repository';
 | 
					 | 
				
			||||||
import { UpdateUserDto } from 'src/domain/user/dto/update-user.dto';
 | 
					import { UpdateUserDto } from 'src/domain/user/dto/update-user.dto';
 | 
				
			||||||
import { mapUser } from 'src/domain/user/response-dto/user-response.dto';
 | 
					import { mapUser } from 'src/domain/user/response-dto/user-response.dto';
 | 
				
			||||||
import { UserService } from 'src/domain/user/user.service';
 | 
					import { UserService } from 'src/domain/user/user.service';
 | 
				
			||||||
import { UserEntity, UserStatus } from 'src/infra/entities/user.entity';
 | 
					import { UserEntity, UserStatus } from 'src/infra/entities/user.entity';
 | 
				
			||||||
 | 
					import { IAlbumRepository } from 'src/interfaces/album.repository';
 | 
				
			||||||
 | 
					import { ICryptoRepository } from 'src/interfaces/crypto.repository';
 | 
				
			||||||
 | 
					import { IJobRepository } from 'src/interfaces/job.repository';
 | 
				
			||||||
 | 
					import { ILibraryRepository } from 'src/interfaces/library.repository';
 | 
				
			||||||
 | 
					import { IStorageRepository } from 'src/interfaces/storage.repository';
 | 
				
			||||||
 | 
					import { ISystemConfigRepository } from 'src/interfaces/system-config.repository';
 | 
				
			||||||
 | 
					import { IUserRepository } from 'src/interfaces/user.repository';
 | 
				
			||||||
import { CacheControl, ImmichFileResponse } from 'src/utils';
 | 
					import { CacheControl, ImmichFileResponse } from 'src/utils';
 | 
				
			||||||
import { authStub } from 'test/fixtures/auth.stub';
 | 
					import { authStub } from 'test/fixtures/auth.stub';
 | 
				
			||||||
import { systemConfigStub } from 'test/fixtures/system-config.stub';
 | 
					import { systemConfigStub } from 'test/fixtures/system-config.stub';
 | 
				
			||||||
 | 
				
			|||||||
@ -7,13 +7,6 @@ import { UserCore } from 'src/cores/user.core';
 | 
				
			|||||||
import { AuthDto } from 'src/domain/auth/auth.dto';
 | 
					import { AuthDto } from 'src/domain/auth/auth.dto';
 | 
				
			||||||
import { JobName } from 'src/domain/job/job.constants';
 | 
					import { JobName } from 'src/domain/job/job.constants';
 | 
				
			||||||
import { IEntityJob } from 'src/domain/job/job.interface';
 | 
					import { IEntityJob } from 'src/domain/job/job.interface';
 | 
				
			||||||
import { IAlbumRepository } from 'src/domain/repositories/album.repository';
 | 
					 | 
				
			||||||
import { ICryptoRepository } from 'src/domain/repositories/crypto.repository';
 | 
					 | 
				
			||||||
import { IJobRepository, JobStatus } from 'src/domain/repositories/job.repository';
 | 
					 | 
				
			||||||
import { ILibraryRepository } from 'src/domain/repositories/library.repository';
 | 
					 | 
				
			||||||
import { IStorageRepository } from 'src/domain/repositories/storage.repository';
 | 
					 | 
				
			||||||
import { ISystemConfigRepository } from 'src/domain/repositories/system-config.repository';
 | 
					 | 
				
			||||||
import { IUserRepository, UserFindOptions } from 'src/domain/repositories/user.repository';
 | 
					 | 
				
			||||||
import { CreateUserDto } from 'src/domain/user/dto/create-user.dto';
 | 
					import { CreateUserDto } from 'src/domain/user/dto/create-user.dto';
 | 
				
			||||||
import { DeleteUserDto } from 'src/domain/user/dto/delete-user.dto';
 | 
					import { DeleteUserDto } from 'src/domain/user/dto/delete-user.dto';
 | 
				
			||||||
import { UpdateUserDto } from 'src/domain/user/dto/update-user.dto';
 | 
					import { UpdateUserDto } from 'src/domain/user/dto/update-user.dto';
 | 
				
			||||||
@ -24,6 +17,13 @@ import {
 | 
				
			|||||||
import { UserResponseDto, mapUser } from 'src/domain/user/response-dto/user-response.dto';
 | 
					import { UserResponseDto, mapUser } from 'src/domain/user/response-dto/user-response.dto';
 | 
				
			||||||
import { UserEntity, UserStatus } from 'src/infra/entities/user.entity';
 | 
					import { UserEntity, UserStatus } from 'src/infra/entities/user.entity';
 | 
				
			||||||
import { ImmichLogger } from 'src/infra/logger';
 | 
					import { ImmichLogger } from 'src/infra/logger';
 | 
				
			||||||
 | 
					import { IAlbumRepository } from 'src/interfaces/album.repository';
 | 
				
			||||||
 | 
					import { ICryptoRepository } from 'src/interfaces/crypto.repository';
 | 
				
			||||||
 | 
					import { IJobRepository, JobStatus } from 'src/interfaces/job.repository';
 | 
				
			||||||
 | 
					import { ILibraryRepository } from 'src/interfaces/library.repository';
 | 
				
			||||||
 | 
					import { IStorageRepository } from 'src/interfaces/storage.repository';
 | 
				
			||||||
 | 
					import { ISystemConfigRepository } from 'src/interfaces/system-config.repository';
 | 
				
			||||||
 | 
					import { IUserRepository, UserFindOptions } from 'src/interfaces/user.repository';
 | 
				
			||||||
import { CacheControl, ImmichFileResponse } from 'src/utils';
 | 
					import { CacheControl, ImmichFileResponse } from 'src/utils';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@Injectable()
 | 
					@Injectable()
 | 
				
			||||||
 | 
				
			|||||||
@ -1,16 +1,16 @@
 | 
				
			|||||||
import { when } from 'jest-when';
 | 
					import { when } from 'jest-when';
 | 
				
			||||||
import { JobName } from 'src/domain/job/job.constants';
 | 
					import { JobName } from 'src/domain/job/job.constants';
 | 
				
			||||||
import { IAssetRepository } from 'src/domain/repositories/asset.repository';
 | 
					 | 
				
			||||||
import { IJobRepository } from 'src/domain/repositories/job.repository';
 | 
					 | 
				
			||||||
import { ILibraryRepository } from 'src/domain/repositories/library.repository';
 | 
					 | 
				
			||||||
import { IStorageRepository } from 'src/domain/repositories/storage.repository';
 | 
					 | 
				
			||||||
import { IUserRepository } from 'src/domain/repositories/user.repository';
 | 
					 | 
				
			||||||
import { IAssetRepositoryV1 } from 'src/immich/api-v1/asset/asset-repository';
 | 
					import { IAssetRepositoryV1 } from 'src/immich/api-v1/asset/asset-repository';
 | 
				
			||||||
import { AssetService } from 'src/immich/api-v1/asset/asset.service';
 | 
					import { AssetService } from 'src/immich/api-v1/asset/asset.service';
 | 
				
			||||||
import { CreateAssetDto } from 'src/immich/api-v1/asset/dto/create-asset.dto';
 | 
					import { CreateAssetDto } from 'src/immich/api-v1/asset/dto/create-asset.dto';
 | 
				
			||||||
import { AssetRejectReason, AssetUploadAction } from 'src/immich/api-v1/asset/response-dto/asset-check-response.dto';
 | 
					import { AssetRejectReason, AssetUploadAction } from 'src/immich/api-v1/asset/response-dto/asset-check-response.dto';
 | 
				
			||||||
import { ASSET_CHECKSUM_CONSTRAINT, AssetEntity, AssetType } from 'src/infra/entities/asset.entity';
 | 
					import { ASSET_CHECKSUM_CONSTRAINT, AssetEntity, AssetType } from 'src/infra/entities/asset.entity';
 | 
				
			||||||
import { ExifEntity } from 'src/infra/entities/exif.entity';
 | 
					import { ExifEntity } from 'src/infra/entities/exif.entity';
 | 
				
			||||||
 | 
					import { IAssetRepository } from 'src/interfaces/asset.repository';
 | 
				
			||||||
 | 
					import { IJobRepository } from 'src/interfaces/job.repository';
 | 
				
			||||||
 | 
					import { ILibraryRepository } from 'src/interfaces/library.repository';
 | 
				
			||||||
 | 
					import { IStorageRepository } from 'src/interfaces/storage.repository';
 | 
				
			||||||
 | 
					import { IUserRepository } from 'src/interfaces/user.repository';
 | 
				
			||||||
import { assetStub } from 'test/fixtures/asset.stub';
 | 
					import { assetStub } from 'test/fixtures/asset.stub';
 | 
				
			||||||
import { authStub } from 'test/fixtures/auth.stub';
 | 
					import { authStub } from 'test/fixtures/auth.stub';
 | 
				
			||||||
import { fileStub } from 'test/fixtures/file.stub';
 | 
					import { fileStub } from 'test/fixtures/file.stub';
 | 
				
			||||||
 | 
				
			|||||||
@ -11,12 +11,6 @@ import { AssetResponseDto, mapAsset } from 'src/domain/asset/response-dto/asset-
 | 
				
			|||||||
import { AuthDto } from 'src/domain/auth/auth.dto';
 | 
					import { AuthDto } from 'src/domain/auth/auth.dto';
 | 
				
			||||||
import { mimeTypes } from 'src/domain/domain.constant';
 | 
					import { mimeTypes } from 'src/domain/domain.constant';
 | 
				
			||||||
import { JobName } from 'src/domain/job/job.constants';
 | 
					import { JobName } from 'src/domain/job/job.constants';
 | 
				
			||||||
import { IAccessRepository } from 'src/domain/repositories/access.repository';
 | 
					 | 
				
			||||||
import { IAssetRepository } from 'src/domain/repositories/asset.repository';
 | 
					 | 
				
			||||||
import { IJobRepository } from 'src/domain/repositories/job.repository';
 | 
					 | 
				
			||||||
import { ILibraryRepository } from 'src/domain/repositories/library.repository';
 | 
					 | 
				
			||||||
import { IStorageRepository } from 'src/domain/repositories/storage.repository';
 | 
					 | 
				
			||||||
import { IUserRepository } from 'src/domain/repositories/user.repository';
 | 
					 | 
				
			||||||
import { IAssetRepositoryV1 } from 'src/immich/api-v1/asset/asset-repository';
 | 
					import { IAssetRepositoryV1 } from 'src/immich/api-v1/asset/asset-repository';
 | 
				
			||||||
import { AssetBulkUploadCheckDto } from 'src/immich/api-v1/asset/dto/asset-check.dto';
 | 
					import { AssetBulkUploadCheckDto } from 'src/immich/api-v1/asset/dto/asset-check.dto';
 | 
				
			||||||
import { AssetSearchDto } from 'src/immich/api-v1/asset/dto/asset-search.dto';
 | 
					import { AssetSearchDto } from 'src/immich/api-v1/asset/dto/asset-search.dto';
 | 
				
			||||||
@ -36,6 +30,12 @@ import { CuratedObjectsResponseDto } from 'src/immich/api-v1/asset/response-dto/
 | 
				
			|||||||
import { ASSET_CHECKSUM_CONSTRAINT, AssetEntity, AssetType } from 'src/infra/entities/asset.entity';
 | 
					import { ASSET_CHECKSUM_CONSTRAINT, AssetEntity, AssetType } from 'src/infra/entities/asset.entity';
 | 
				
			||||||
import { LibraryType } from 'src/infra/entities/library.entity';
 | 
					import { LibraryType } from 'src/infra/entities/library.entity';
 | 
				
			||||||
import { ImmichLogger } from 'src/infra/logger';
 | 
					import { ImmichLogger } from 'src/infra/logger';
 | 
				
			||||||
 | 
					import { IAccessRepository } from 'src/interfaces/access.repository';
 | 
				
			||||||
 | 
					import { IAssetRepository } from 'src/interfaces/asset.repository';
 | 
				
			||||||
 | 
					import { IJobRepository } from 'src/interfaces/job.repository';
 | 
				
			||||||
 | 
					import { ILibraryRepository } from 'src/interfaces/library.repository';
 | 
				
			||||||
 | 
					import { IStorageRepository } from 'src/interfaces/storage.repository';
 | 
				
			||||||
 | 
					import { IUserRepository } from 'src/interfaces/user.repository';
 | 
				
			||||||
import { CacheControl, ImmichFileResponse, getLivePhotoMotionFilename } from 'src/utils';
 | 
					import { CacheControl, ImmichFileResponse, getLivePhotoMotionFilename } from 'src/utils';
 | 
				
			||||||
import { QueryFailedError } from 'typeorm';
 | 
					import { QueryFailedError } from 'typeorm';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -15,8 +15,8 @@ import path, { isAbsolute } from 'node:path';
 | 
				
			|||||||
import { promisify } from 'node:util';
 | 
					import { promisify } from 'node:util';
 | 
				
			||||||
import { IMMICH_ACCESS_COOKIE, IMMICH_API_KEY_HEADER, IMMICH_API_KEY_NAME } from 'src/domain/auth/auth.constant';
 | 
					import { IMMICH_ACCESS_COOKIE, IMMICH_API_KEY_HEADER, IMMICH_API_KEY_NAME } from 'src/domain/auth/auth.constant';
 | 
				
			||||||
import { serverVersion } from 'src/domain/domain.constant';
 | 
					import { serverVersion } from 'src/domain/domain.constant';
 | 
				
			||||||
import { ImmichReadStream } from 'src/domain/repositories/storage.repository';
 | 
					 | 
				
			||||||
import { ImmichLogger } from 'src/infra/logger';
 | 
					import { ImmichLogger } from 'src/infra/logger';
 | 
				
			||||||
 | 
					import { ImmichReadStream } from 'src/interfaces/storage.repository';
 | 
				
			||||||
import { Metadata } from 'src/middleware/auth.guard';
 | 
					import { Metadata } from 'src/middleware/auth.guard';
 | 
				
			||||||
import { CacheControl, ImmichFileResponse, isConnectionAborted } from 'src/utils';
 | 
					import { CacheControl, ImmichFileResponse, isConnectionAborted } from 'src/utils';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -1,4 +1,4 @@
 | 
				
			|||||||
import { DatabaseExtension } from 'src/domain/repositories/database.repository';
 | 
					import { DatabaseExtension } from 'src/interfaces/database.repository';
 | 
				
			||||||
import { DataSource } from 'typeorm';
 | 
					import { DataSource } from 'typeorm';
 | 
				
			||||||
import { PostgresConnectionOptions } from 'typeorm/driver/postgres/PostgresConnectionOptions.js';
 | 
					import { PostgresConnectionOptions } from 'typeorm/driver/postgres/PostgresConnectionOptions.js';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -6,33 +6,6 @@ import { ScheduleModule, SchedulerRegistry } from '@nestjs/schedule';
 | 
				
			|||||||
import { TypeOrmModule } from '@nestjs/typeorm';
 | 
					import { TypeOrmModule } from '@nestjs/typeorm';
 | 
				
			||||||
import { OpenTelemetryModule } from 'nestjs-otel';
 | 
					import { OpenTelemetryModule } from 'nestjs-otel';
 | 
				
			||||||
import { bullConfig, bullQueues, immichAppConfig } from 'src/config';
 | 
					import { bullConfig, bullQueues, immichAppConfig } from 'src/config';
 | 
				
			||||||
import { IAccessRepository } from 'src/domain/repositories/access.repository';
 | 
					 | 
				
			||||||
import { IActivityRepository } from 'src/domain/repositories/activity.repository';
 | 
					 | 
				
			||||||
import { IAlbumRepository } from 'src/domain/repositories/album.repository';
 | 
					 | 
				
			||||||
import { IKeyRepository } from 'src/domain/repositories/api-key.repository';
 | 
					 | 
				
			||||||
import { IAssetStackRepository } from 'src/domain/repositories/asset-stack.repository';
 | 
					 | 
				
			||||||
import { IAssetRepository } from 'src/domain/repositories/asset.repository';
 | 
					 | 
				
			||||||
import { IAuditRepository } from 'src/domain/repositories/audit.repository';
 | 
					 | 
				
			||||||
import { ICommunicationRepository } from 'src/domain/repositories/communication.repository';
 | 
					 | 
				
			||||||
import { ICryptoRepository } from 'src/domain/repositories/crypto.repository';
 | 
					 | 
				
			||||||
import { IDatabaseRepository } from 'src/domain/repositories/database.repository';
 | 
					 | 
				
			||||||
import { IJobRepository } from 'src/domain/repositories/job.repository';
 | 
					 | 
				
			||||||
import { ILibraryRepository } from 'src/domain/repositories/library.repository';
 | 
					 | 
				
			||||||
import { IMachineLearningRepository } from 'src/domain/repositories/machine-learning.repository';
 | 
					 | 
				
			||||||
import { IMediaRepository } from 'src/domain/repositories/media.repository';
 | 
					 | 
				
			||||||
import { IMetadataRepository } from 'src/domain/repositories/metadata.repository';
 | 
					 | 
				
			||||||
import { IMoveRepository } from 'src/domain/repositories/move.repository';
 | 
					 | 
				
			||||||
import { IPartnerRepository } from 'src/domain/repositories/partner.repository';
 | 
					 | 
				
			||||||
import { IPersonRepository } from 'src/domain/repositories/person.repository';
 | 
					 | 
				
			||||||
import { ISearchRepository } from 'src/domain/repositories/search.repository';
 | 
					 | 
				
			||||||
import { IServerInfoRepository } from 'src/domain/repositories/server-info.repository';
 | 
					 | 
				
			||||||
import { ISharedLinkRepository } from 'src/domain/repositories/shared-link.repository';
 | 
					 | 
				
			||||||
import { IStorageRepository } from 'src/domain/repositories/storage.repository';
 | 
					 | 
				
			||||||
import { ISystemConfigRepository } from 'src/domain/repositories/system-config.repository';
 | 
					 | 
				
			||||||
import { ISystemMetadataRepository } from 'src/domain/repositories/system-metadata.repository';
 | 
					 | 
				
			||||||
import { ITagRepository } from 'src/domain/repositories/tag.repository';
 | 
					 | 
				
			||||||
import { IUserTokenRepository } from 'src/domain/repositories/user-token.repository';
 | 
					 | 
				
			||||||
import { IUserRepository } from 'src/domain/repositories/user.repository';
 | 
					 | 
				
			||||||
import { databaseConfig } from 'src/infra/database.config';
 | 
					import { databaseConfig } from 'src/infra/database.config';
 | 
				
			||||||
import { databaseEntities } from 'src/infra/entities';
 | 
					import { databaseEntities } from 'src/infra/entities';
 | 
				
			||||||
import { otelConfig } from 'src/infra/instrumentation';
 | 
					import { otelConfig } from 'src/infra/instrumentation';
 | 
				
			||||||
@ -63,6 +36,33 @@ import { SystemMetadataRepository } from 'src/infra/repositories/system-metadata
 | 
				
			|||||||
import { TagRepository } from 'src/infra/repositories/tag.repository';
 | 
					import { TagRepository } from 'src/infra/repositories/tag.repository';
 | 
				
			||||||
import { UserTokenRepository } from 'src/infra/repositories/user-token.repository';
 | 
					import { UserTokenRepository } from 'src/infra/repositories/user-token.repository';
 | 
				
			||||||
import { UserRepository } from 'src/infra/repositories/user.repository';
 | 
					import { UserRepository } from 'src/infra/repositories/user.repository';
 | 
				
			||||||
 | 
					import { IAccessRepository } from 'src/interfaces/access.repository';
 | 
				
			||||||
 | 
					import { IActivityRepository } from 'src/interfaces/activity.repository';
 | 
				
			||||||
 | 
					import { IAlbumRepository } from 'src/interfaces/album.repository';
 | 
				
			||||||
 | 
					import { IKeyRepository } from 'src/interfaces/api-key.repository';
 | 
				
			||||||
 | 
					import { IAssetStackRepository } from 'src/interfaces/asset-stack.repository';
 | 
				
			||||||
 | 
					import { IAssetRepository } from 'src/interfaces/asset.repository';
 | 
				
			||||||
 | 
					import { IAuditRepository } from 'src/interfaces/audit.repository';
 | 
				
			||||||
 | 
					import { ICommunicationRepository } from 'src/interfaces/communication.repository';
 | 
				
			||||||
 | 
					import { ICryptoRepository } from 'src/interfaces/crypto.repository';
 | 
				
			||||||
 | 
					import { IDatabaseRepository } from 'src/interfaces/database.repository';
 | 
				
			||||||
 | 
					import { IJobRepository } from 'src/interfaces/job.repository';
 | 
				
			||||||
 | 
					import { ILibraryRepository } from 'src/interfaces/library.repository';
 | 
				
			||||||
 | 
					import { IMachineLearningRepository } from 'src/interfaces/machine-learning.repository';
 | 
				
			||||||
 | 
					import { IMediaRepository } from 'src/interfaces/media.repository';
 | 
				
			||||||
 | 
					import { IMetadataRepository } from 'src/interfaces/metadata.repository';
 | 
				
			||||||
 | 
					import { IMoveRepository } from 'src/interfaces/move.repository';
 | 
				
			||||||
 | 
					import { IPartnerRepository } from 'src/interfaces/partner.repository';
 | 
				
			||||||
 | 
					import { IPersonRepository } from 'src/interfaces/person.repository';
 | 
				
			||||||
 | 
					import { ISearchRepository } from 'src/interfaces/search.repository';
 | 
				
			||||||
 | 
					import { IServerInfoRepository } from 'src/interfaces/server-info.repository';
 | 
				
			||||||
 | 
					import { ISharedLinkRepository } from 'src/interfaces/shared-link.repository';
 | 
				
			||||||
 | 
					import { IStorageRepository } from 'src/interfaces/storage.repository';
 | 
				
			||||||
 | 
					import { ISystemConfigRepository } from 'src/interfaces/system-config.repository';
 | 
				
			||||||
 | 
					import { ISystemMetadataRepository } from 'src/interfaces/system-metadata.repository';
 | 
				
			||||||
 | 
					import { ITagRepository } from 'src/interfaces/tag.repository';
 | 
				
			||||||
 | 
					import { IUserTokenRepository } from 'src/interfaces/user-token.repository';
 | 
				
			||||||
 | 
					import { IUserRepository } from 'src/interfaces/user.repository';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const providers: Provider[] = [
 | 
					const providers: Provider[] = [
 | 
				
			||||||
  { provide: IActivityRepository, useClass: ActivityRepository },
 | 
					  { provide: IActivityRepository, useClass: ActivityRepository },
 | 
				
			||||||
 | 
				
			|||||||
@ -1,6 +1,6 @@
 | 
				
			|||||||
import _ from 'lodash';
 | 
					import _ from 'lodash';
 | 
				
			||||||
import { AssetSearchBuilderOptions } from 'src/domain/repositories/search.repository';
 | 
					 | 
				
			||||||
import { AssetEntity } from 'src/infra/entities/asset.entity';
 | 
					import { AssetEntity } from 'src/infra/entities/asset.entity';
 | 
				
			||||||
 | 
					import { AssetSearchBuilderOptions } from 'src/interfaces/search.repository';
 | 
				
			||||||
import { Paginated, PaginatedBuilderOptions, PaginationMode, PaginationOptions, PaginationResult } from 'src/utils';
 | 
					import { Paginated, PaginatedBuilderOptions, PaginationMode, PaginationOptions, PaginationResult } from 'src/utils';
 | 
				
			||||||
import {
 | 
					import {
 | 
				
			||||||
  Between,
 | 
					  Between,
 | 
				
			||||||
 | 
				
			|||||||
@ -1,5 +1,5 @@
 | 
				
			|||||||
import { DatabaseExtension } from 'src/domain/repositories/database.repository';
 | 
					 | 
				
			||||||
import { vectorExt } from 'src/infra/database.config';
 | 
					import { vectorExt } from 'src/infra/database.config';
 | 
				
			||||||
 | 
					import { DatabaseExtension } from 'src/interfaces/database.repository';
 | 
				
			||||||
import { MigrationInterface, QueryRunner } from 'typeorm';
 | 
					import { MigrationInterface, QueryRunner } from 'typeorm';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export class AddCLIPEmbeddingIndex1700713994428 implements MigrationInterface {
 | 
					export class AddCLIPEmbeddingIndex1700713994428 implements MigrationInterface {
 | 
				
			||||||
 | 
				
			|||||||
@ -1,5 +1,5 @@
 | 
				
			|||||||
import { DatabaseExtension } from 'src/domain/repositories/database.repository';
 | 
					 | 
				
			||||||
import { vectorExt } from 'src/infra/database.config';
 | 
					import { vectorExt } from 'src/infra/database.config';
 | 
				
			||||||
 | 
					import { DatabaseExtension } from 'src/interfaces/database.repository';
 | 
				
			||||||
import { MigrationInterface, QueryRunner } from 'typeorm';
 | 
					import { MigrationInterface, QueryRunner } from 'typeorm';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export class AddFaceEmbeddingIndex1700714033632 implements MigrationInterface {
 | 
					export class AddFaceEmbeddingIndex1700714033632 implements MigrationInterface {
 | 
				
			||||||
 | 
				
			|||||||
@ -1,6 +1,5 @@
 | 
				
			|||||||
import { InjectRepository } from '@nestjs/typeorm';
 | 
					import { InjectRepository } from '@nestjs/typeorm';
 | 
				
			||||||
import { ChunkedSet, DummyValue, GenerateSql } from 'src/decorators';
 | 
					import { ChunkedSet, DummyValue, GenerateSql } from 'src/decorators';
 | 
				
			||||||
import { IAccessRepository } from 'src/domain/repositories/access.repository';
 | 
					 | 
				
			||||||
import { ActivityEntity } from 'src/infra/entities/activity.entity';
 | 
					import { ActivityEntity } from 'src/infra/entities/activity.entity';
 | 
				
			||||||
import { AlbumEntity } from 'src/infra/entities/album.entity';
 | 
					import { AlbumEntity } from 'src/infra/entities/album.entity';
 | 
				
			||||||
import { AssetFaceEntity } from 'src/infra/entities/asset-face.entity';
 | 
					import { AssetFaceEntity } from 'src/infra/entities/asset-face.entity';
 | 
				
			||||||
@ -11,6 +10,7 @@ import { PersonEntity } from 'src/infra/entities/person.entity';
 | 
				
			|||||||
import { SharedLinkEntity } from 'src/infra/entities/shared-link.entity';
 | 
					import { SharedLinkEntity } from 'src/infra/entities/shared-link.entity';
 | 
				
			||||||
import { UserTokenEntity } from 'src/infra/entities/user-token.entity';
 | 
					import { UserTokenEntity } from 'src/infra/entities/user-token.entity';
 | 
				
			||||||
import { Instrumentation } from 'src/infra/instrumentation';
 | 
					import { Instrumentation } from 'src/infra/instrumentation';
 | 
				
			||||||
 | 
					import { IAccessRepository } from 'src/interfaces/access.repository';
 | 
				
			||||||
import { Brackets, In, Repository } from 'typeorm';
 | 
					import { Brackets, In, Repository } from 'typeorm';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type IActivityAccess = IAccessRepository['activity'];
 | 
					type IActivityAccess = IAccessRepository['activity'];
 | 
				
			||||||
 | 
				
			|||||||
@ -1,9 +1,9 @@
 | 
				
			|||||||
import { Injectable } from '@nestjs/common';
 | 
					import { Injectable } from '@nestjs/common';
 | 
				
			||||||
import { InjectRepository } from '@nestjs/typeorm';
 | 
					import { InjectRepository } from '@nestjs/typeorm';
 | 
				
			||||||
import { DummyValue, GenerateSql } from 'src/decorators';
 | 
					import { DummyValue, GenerateSql } from 'src/decorators';
 | 
				
			||||||
import { IActivityRepository } from 'src/domain/repositories/activity.repository';
 | 
					 | 
				
			||||||
import { ActivityEntity } from 'src/infra/entities/activity.entity';
 | 
					import { ActivityEntity } from 'src/infra/entities/activity.entity';
 | 
				
			||||||
import { Instrumentation } from 'src/infra/instrumentation';
 | 
					import { Instrumentation } from 'src/infra/instrumentation';
 | 
				
			||||||
 | 
					import { IActivityRepository } from 'src/interfaces/activity.repository';
 | 
				
			||||||
import { IsNull, Repository } from 'typeorm';
 | 
					import { IsNull, Repository } from 'typeorm';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export interface ActivitySearch {
 | 
					export interface ActivitySearch {
 | 
				
			||||||
 | 
				
			|||||||
@ -2,17 +2,17 @@ import { Injectable } from '@nestjs/common';
 | 
				
			|||||||
import { InjectDataSource, InjectRepository } from '@nestjs/typeorm';
 | 
					import { InjectDataSource, InjectRepository } from '@nestjs/typeorm';
 | 
				
			||||||
import _ from 'lodash';
 | 
					import _ from 'lodash';
 | 
				
			||||||
import { Chunked, ChunkedArray, DATABASE_PARAMETER_CHUNK_SIZE, DummyValue, GenerateSql } from 'src/decorators';
 | 
					import { Chunked, ChunkedArray, DATABASE_PARAMETER_CHUNK_SIZE, DummyValue, GenerateSql } from 'src/decorators';
 | 
				
			||||||
 | 
					import { dataSource } from 'src/infra/database.config';
 | 
				
			||||||
 | 
					import { AlbumEntity } from 'src/infra/entities/album.entity';
 | 
				
			||||||
 | 
					import { AssetEntity } from 'src/infra/entities/asset.entity';
 | 
				
			||||||
 | 
					import { Instrumentation } from 'src/infra/instrumentation';
 | 
				
			||||||
import {
 | 
					import {
 | 
				
			||||||
  AlbumAsset,
 | 
					  AlbumAsset,
 | 
				
			||||||
  AlbumAssetCount,
 | 
					  AlbumAssetCount,
 | 
				
			||||||
  AlbumAssets,
 | 
					  AlbumAssets,
 | 
				
			||||||
  AlbumInfoOptions,
 | 
					  AlbumInfoOptions,
 | 
				
			||||||
  IAlbumRepository,
 | 
					  IAlbumRepository,
 | 
				
			||||||
} from 'src/domain/repositories/album.repository';
 | 
					} from 'src/interfaces/album.repository';
 | 
				
			||||||
import { dataSource } from 'src/infra/database.config';
 | 
					 | 
				
			||||||
import { AlbumEntity } from 'src/infra/entities/album.entity';
 | 
					 | 
				
			||||||
import { AssetEntity } from 'src/infra/entities/asset.entity';
 | 
					 | 
				
			||||||
import { Instrumentation } from 'src/infra/instrumentation';
 | 
					 | 
				
			||||||
import { setUnion } from 'src/utils';
 | 
					import { setUnion } from 'src/utils';
 | 
				
			||||||
import { DataSource, FindOptionsOrder, FindOptionsRelations, In, IsNull, Not, Repository } from 'typeorm';
 | 
					import { DataSource, FindOptionsOrder, FindOptionsRelations, In, IsNull, Not, Repository } from 'typeorm';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -1,9 +1,9 @@
 | 
				
			|||||||
import { Injectable } from '@nestjs/common';
 | 
					import { Injectable } from '@nestjs/common';
 | 
				
			||||||
import { InjectRepository } from '@nestjs/typeorm';
 | 
					import { InjectRepository } from '@nestjs/typeorm';
 | 
				
			||||||
import { DummyValue, GenerateSql } from 'src/decorators';
 | 
					import { DummyValue, GenerateSql } from 'src/decorators';
 | 
				
			||||||
import { IKeyRepository } from 'src/domain/repositories/api-key.repository';
 | 
					 | 
				
			||||||
import { APIKeyEntity } from 'src/infra/entities/api-key.entity';
 | 
					import { APIKeyEntity } from 'src/infra/entities/api-key.entity';
 | 
				
			||||||
import { Instrumentation } from 'src/infra/instrumentation';
 | 
					import { Instrumentation } from 'src/infra/instrumentation';
 | 
				
			||||||
 | 
					import { IKeyRepository } from 'src/interfaces/api-key.repository';
 | 
				
			||||||
import { Repository } from 'typeorm';
 | 
					import { Repository } from 'typeorm';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@Instrumentation()
 | 
					@Instrumentation()
 | 
				
			||||||
 | 
				
			|||||||
@ -1,8 +1,8 @@
 | 
				
			|||||||
import { Injectable } from '@nestjs/common';
 | 
					import { Injectable } from '@nestjs/common';
 | 
				
			||||||
import { InjectRepository } from '@nestjs/typeorm';
 | 
					import { InjectRepository } from '@nestjs/typeorm';
 | 
				
			||||||
import { IAssetStackRepository } from 'src/domain/repositories/asset-stack.repository';
 | 
					 | 
				
			||||||
import { AssetStackEntity } from 'src/infra/entities/asset-stack.entity';
 | 
					import { AssetStackEntity } from 'src/infra/entities/asset-stack.entity';
 | 
				
			||||||
import { Instrumentation } from 'src/infra/instrumentation';
 | 
					import { Instrumentation } from 'src/infra/instrumentation';
 | 
				
			||||||
 | 
					import { IAssetStackRepository } from 'src/interfaces/asset-stack.repository';
 | 
				
			||||||
import { Repository } from 'typeorm';
 | 
					import { Repository } from 'typeorm';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@Instrumentation()
 | 
					@Instrumentation()
 | 
				
			||||||
 | 
				
			|||||||
@ -3,6 +3,13 @@ import { InjectRepository } from '@nestjs/typeorm';
 | 
				
			|||||||
import { DateTime } from 'luxon';
 | 
					import { DateTime } from 'luxon';
 | 
				
			||||||
import path from 'node:path';
 | 
					import path from 'node:path';
 | 
				
			||||||
import { Chunked, ChunkedArray, DummyValue, GenerateSql } from 'src/decorators';
 | 
					import { Chunked, ChunkedArray, DummyValue, GenerateSql } from 'src/decorators';
 | 
				
			||||||
 | 
					import { AssetOrder } from 'src/infra/entities/album.entity';
 | 
				
			||||||
 | 
					import { AssetJobStatusEntity } from 'src/infra/entities/asset-job-status.entity';
 | 
				
			||||||
 | 
					import { AssetEntity, AssetType } from 'src/infra/entities/asset.entity';
 | 
				
			||||||
 | 
					import { ExifEntity } from 'src/infra/entities/exif.entity';
 | 
				
			||||||
 | 
					import { SmartInfoEntity } from 'src/infra/entities/smart-info.entity';
 | 
				
			||||||
 | 
					import { OptionalBetween, paginate, paginatedBuilder, searchAssetBuilder } from 'src/infra/infra.utils';
 | 
				
			||||||
 | 
					import { Instrumentation } from 'src/infra/instrumentation';
 | 
				
			||||||
import {
 | 
					import {
 | 
				
			||||||
  AssetBuilderOptions,
 | 
					  AssetBuilderOptions,
 | 
				
			||||||
  AssetCreate,
 | 
					  AssetCreate,
 | 
				
			||||||
@ -23,15 +30,8 @@ import {
 | 
				
			|||||||
  TimeBucketSize,
 | 
					  TimeBucketSize,
 | 
				
			||||||
  WithProperty,
 | 
					  WithProperty,
 | 
				
			||||||
  WithoutProperty,
 | 
					  WithoutProperty,
 | 
				
			||||||
} from 'src/domain/repositories/asset.repository';
 | 
					} from 'src/interfaces/asset.repository';
 | 
				
			||||||
import { AssetSearchOptions, SearchExploreItem } from 'src/domain/repositories/search.repository';
 | 
					import { AssetSearchOptions, SearchExploreItem } from 'src/interfaces/search.repository';
 | 
				
			||||||
import { AssetOrder } from 'src/infra/entities/album.entity';
 | 
					 | 
				
			||||||
import { AssetJobStatusEntity } from 'src/infra/entities/asset-job-status.entity';
 | 
					 | 
				
			||||||
import { AssetEntity, AssetType } from 'src/infra/entities/asset.entity';
 | 
					 | 
				
			||||||
import { ExifEntity } from 'src/infra/entities/exif.entity';
 | 
					 | 
				
			||||||
import { SmartInfoEntity } from 'src/infra/entities/smart-info.entity';
 | 
					 | 
				
			||||||
import { OptionalBetween, paginate, paginatedBuilder, searchAssetBuilder } from 'src/infra/infra.utils';
 | 
					 | 
				
			||||||
import { Instrumentation } from 'src/infra/instrumentation';
 | 
					 | 
				
			||||||
import { Paginated, PaginationMode, PaginationOptions } from 'src/utils';
 | 
					import { Paginated, PaginationMode, PaginationOptions } from 'src/utils';
 | 
				
			||||||
import {
 | 
					import {
 | 
				
			||||||
  Brackets,
 | 
					  Brackets,
 | 
				
			||||||
 | 
				
			|||||||
@ -1,7 +1,7 @@
 | 
				
			|||||||
import { InjectRepository } from '@nestjs/typeorm';
 | 
					import { InjectRepository } from '@nestjs/typeorm';
 | 
				
			||||||
import { AuditSearch, IAuditRepository } from 'src/domain/repositories/audit.repository';
 | 
					 | 
				
			||||||
import { AuditEntity } from 'src/infra/entities/audit.entity';
 | 
					import { AuditEntity } from 'src/infra/entities/audit.entity';
 | 
				
			||||||
import { Instrumentation } from 'src/infra/instrumentation';
 | 
					import { Instrumentation } from 'src/infra/instrumentation';
 | 
				
			||||||
 | 
					import { AuditSearch, IAuditRepository } from 'src/interfaces/audit.repository';
 | 
				
			||||||
import { LessThan, MoreThan, Repository } from 'typeorm';
 | 
					import { LessThan, MoreThan, Repository } from 'typeorm';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@Instrumentation()
 | 
					@Instrumentation()
 | 
				
			||||||
 | 
				
			|||||||
@ -8,6 +8,8 @@ import {
 | 
				
			|||||||
} from '@nestjs/websockets';
 | 
					} from '@nestjs/websockets';
 | 
				
			||||||
import { Server, Socket } from 'socket.io';
 | 
					import { Server, Socket } from 'socket.io';
 | 
				
			||||||
import { AuthService } from 'src/domain/auth/auth.service';
 | 
					import { AuthService } from 'src/domain/auth/auth.service';
 | 
				
			||||||
 | 
					import { Instrumentation } from 'src/infra/instrumentation';
 | 
				
			||||||
 | 
					import { ImmichLogger } from 'src/infra/logger';
 | 
				
			||||||
import {
 | 
					import {
 | 
				
			||||||
  ClientEvent,
 | 
					  ClientEvent,
 | 
				
			||||||
  ICommunicationRepository,
 | 
					  ICommunicationRepository,
 | 
				
			||||||
@ -15,9 +17,7 @@ import {
 | 
				
			|||||||
  OnConnectCallback,
 | 
					  OnConnectCallback,
 | 
				
			||||||
  OnServerEventCallback,
 | 
					  OnServerEventCallback,
 | 
				
			||||||
  ServerEvent,
 | 
					  ServerEvent,
 | 
				
			||||||
} from 'src/domain/repositories/communication.repository';
 | 
					} from 'src/interfaces/communication.repository';
 | 
				
			||||||
import { Instrumentation } from 'src/infra/instrumentation';
 | 
					 | 
				
			||||||
import { ImmichLogger } from 'src/infra/logger';
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
@Instrumentation()
 | 
					@Instrumentation()
 | 
				
			||||||
@WebSocketGateway({
 | 
					@WebSocketGateway({
 | 
				
			||||||
 | 
				
			|||||||
@ -2,8 +2,8 @@ import { Injectable } from '@nestjs/common';
 | 
				
			|||||||
import { compareSync, hash } from 'bcrypt';
 | 
					import { compareSync, hash } from 'bcrypt';
 | 
				
			||||||
import { createHash, randomBytes, randomUUID } from 'node:crypto';
 | 
					import { createHash, randomBytes, randomUUID } from 'node:crypto';
 | 
				
			||||||
import { createReadStream } from 'node:fs';
 | 
					import { createReadStream } from 'node:fs';
 | 
				
			||||||
import { ICryptoRepository } from 'src/domain/repositories/crypto.repository';
 | 
					 | 
				
			||||||
import { Instrumentation } from 'src/infra/instrumentation';
 | 
					import { Instrumentation } from 'src/infra/instrumentation';
 | 
				
			||||||
 | 
					import { ICryptoRepository } from 'src/interfaces/crypto.repository';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@Instrumentation()
 | 
					@Instrumentation()
 | 
				
			||||||
@Injectable()
 | 
					@Injectable()
 | 
				
			||||||
 | 
				
			|||||||
@ -2,6 +2,9 @@ import { Injectable } from '@nestjs/common';
 | 
				
			|||||||
import { InjectDataSource } from '@nestjs/typeorm';
 | 
					import { InjectDataSource } from '@nestjs/typeorm';
 | 
				
			||||||
import AsyncLock from 'async-lock';
 | 
					import AsyncLock from 'async-lock';
 | 
				
			||||||
import { Version, VersionType } from 'src/domain/domain.constant';
 | 
					import { Version, VersionType } from 'src/domain/domain.constant';
 | 
				
			||||||
 | 
					import { vectorExt } from 'src/infra/database.config';
 | 
				
			||||||
 | 
					import { Instrumentation } from 'src/infra/instrumentation';
 | 
				
			||||||
 | 
					import { ImmichLogger } from 'src/infra/logger';
 | 
				
			||||||
import {
 | 
					import {
 | 
				
			||||||
  DatabaseExtension,
 | 
					  DatabaseExtension,
 | 
				
			||||||
  DatabaseLock,
 | 
					  DatabaseLock,
 | 
				
			||||||
@ -10,10 +13,7 @@ import {
 | 
				
			|||||||
  VectorIndex,
 | 
					  VectorIndex,
 | 
				
			||||||
  VectorUpdateResult,
 | 
					  VectorUpdateResult,
 | 
				
			||||||
  extName,
 | 
					  extName,
 | 
				
			||||||
} from 'src/domain/repositories/database.repository';
 | 
					} from 'src/interfaces/database.repository';
 | 
				
			||||||
import { vectorExt } from 'src/infra/database.config';
 | 
					 | 
				
			||||||
import { Instrumentation } from 'src/infra/instrumentation';
 | 
					 | 
				
			||||||
import { ImmichLogger } from 'src/infra/logger';
 | 
					 | 
				
			||||||
import { isValidInteger } from 'src/validation';
 | 
					import { isValidInteger } from 'src/validation';
 | 
				
			||||||
import { DataSource, EntityManager, QueryRunner } from 'typeorm';
 | 
					import { DataSource, EntityManager, QueryRunner } from 'typeorm';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -6,6 +6,8 @@ import fs from 'node:fs/promises';
 | 
				
			|||||||
import path from 'node:path';
 | 
					import path from 'node:path';
 | 
				
			||||||
import { mimeTypes } from 'src/domain/domain.constant';
 | 
					import { mimeTypes } from 'src/domain/domain.constant';
 | 
				
			||||||
import { CrawlOptionsDto } from 'src/domain/library/library.dto';
 | 
					import { CrawlOptionsDto } from 'src/domain/library/library.dto';
 | 
				
			||||||
 | 
					import { Instrumentation } from 'src/infra/instrumentation';
 | 
				
			||||||
 | 
					import { ImmichLogger } from 'src/infra/logger';
 | 
				
			||||||
import {
 | 
					import {
 | 
				
			||||||
  DiskUsage,
 | 
					  DiskUsage,
 | 
				
			||||||
  IStorageRepository,
 | 
					  IStorageRepository,
 | 
				
			||||||
@ -13,9 +15,7 @@ import {
 | 
				
			|||||||
  ImmichZipStream,
 | 
					  ImmichZipStream,
 | 
				
			||||||
  StorageEventType,
 | 
					  StorageEventType,
 | 
				
			||||||
  WatchEvents,
 | 
					  WatchEvents,
 | 
				
			||||||
} from 'src/domain/repositories/storage.repository';
 | 
					} from 'src/interfaces/storage.repository';
 | 
				
			||||||
import { Instrumentation } from 'src/infra/instrumentation';
 | 
					 | 
				
			||||||
import { ImmichLogger } from 'src/infra/logger';
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
@Instrumentation()
 | 
					@Instrumentation()
 | 
				
			||||||
export class FilesystemProvider implements IStorageRepository {
 | 
					export class FilesystemProvider implements IStorageRepository {
 | 
				
			||||||
 | 
				
			|||||||
@ -7,15 +7,9 @@ import { CronJob, CronTime } from 'cron';
 | 
				
			|||||||
import { setTimeout } from 'node:timers/promises';
 | 
					import { setTimeout } from 'node:timers/promises';
 | 
				
			||||||
import { bullConfig } from 'src/config';
 | 
					import { bullConfig } from 'src/config';
 | 
				
			||||||
import { JOBS_TO_QUEUE, JobName, QueueName } from 'src/domain/job/job.constants';
 | 
					import { JOBS_TO_QUEUE, JobName, QueueName } from 'src/domain/job/job.constants';
 | 
				
			||||||
import {
 | 
					 | 
				
			||||||
  IJobRepository,
 | 
					 | 
				
			||||||
  JobCounts,
 | 
					 | 
				
			||||||
  JobItem,
 | 
					 | 
				
			||||||
  QueueCleanType,
 | 
					 | 
				
			||||||
  QueueStatus,
 | 
					 | 
				
			||||||
} from 'src/domain/repositories/job.repository';
 | 
					 | 
				
			||||||
import { Instrumentation } from 'src/infra/instrumentation';
 | 
					import { Instrumentation } from 'src/infra/instrumentation';
 | 
				
			||||||
import { ImmichLogger } from 'src/infra/logger';
 | 
					import { ImmichLogger } from 'src/infra/logger';
 | 
				
			||||||
 | 
					import { IJobRepository, JobCounts, JobItem, QueueCleanType, QueueStatus } from 'src/interfaces/job.repository';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@Instrumentation()
 | 
					@Instrumentation()
 | 
				
			||||||
@Injectable()
 | 
					@Injectable()
 | 
				
			||||||
 | 
				
			|||||||
@ -2,9 +2,9 @@ import { Injectable } from '@nestjs/common';
 | 
				
			|||||||
import { InjectRepository } from '@nestjs/typeorm';
 | 
					import { InjectRepository } from '@nestjs/typeorm';
 | 
				
			||||||
import { DummyValue, GenerateSql } from 'src/decorators';
 | 
					import { DummyValue, GenerateSql } from 'src/decorators';
 | 
				
			||||||
import { LibraryStatsResponseDto } from 'src/domain/library/library.dto';
 | 
					import { LibraryStatsResponseDto } from 'src/domain/library/library.dto';
 | 
				
			||||||
import { ILibraryRepository } from 'src/domain/repositories/library.repository';
 | 
					 | 
				
			||||||
import { LibraryEntity, LibraryType } from 'src/infra/entities/library.entity';
 | 
					import { LibraryEntity, LibraryType } from 'src/infra/entities/library.entity';
 | 
				
			||||||
import { Instrumentation } from 'src/infra/instrumentation';
 | 
					import { Instrumentation } from 'src/infra/instrumentation';
 | 
				
			||||||
 | 
					import { ILibraryRepository } from 'src/interfaces/library.repository';
 | 
				
			||||||
import { IsNull, Not } from 'typeorm';
 | 
					import { IsNull, Not } from 'typeorm';
 | 
				
			||||||
import { Repository } from 'typeorm/repository/Repository.js';
 | 
					import { Repository } from 'typeorm/repository/Repository.js';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -1,5 +1,7 @@
 | 
				
			|||||||
import { Injectable } from '@nestjs/common';
 | 
					import { Injectable } from '@nestjs/common';
 | 
				
			||||||
import { readFile } from 'node:fs/promises';
 | 
					import { readFile } from 'node:fs/promises';
 | 
				
			||||||
 | 
					import { CLIPConfig, ModelConfig, RecognitionConfig } from 'src/domain/smart-info/dto/model-config.dto';
 | 
				
			||||||
 | 
					import { Instrumentation } from 'src/infra/instrumentation';
 | 
				
			||||||
import {
 | 
					import {
 | 
				
			||||||
  CLIPMode,
 | 
					  CLIPMode,
 | 
				
			||||||
  DetectFaceResult,
 | 
					  DetectFaceResult,
 | 
				
			||||||
@ -7,9 +9,7 @@ import {
 | 
				
			|||||||
  ModelType,
 | 
					  ModelType,
 | 
				
			||||||
  TextModelInput,
 | 
					  TextModelInput,
 | 
				
			||||||
  VisionModelInput,
 | 
					  VisionModelInput,
 | 
				
			||||||
} from 'src/domain/repositories/machine-learning.repository';
 | 
					} from 'src/interfaces/machine-learning.repository';
 | 
				
			||||||
import { CLIPConfig, ModelConfig, RecognitionConfig } from 'src/domain/smart-info/dto/model-config.dto';
 | 
					 | 
				
			||||||
import { Instrumentation } from 'src/infra/instrumentation';
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
const errorPrefix = 'Machine learning request';
 | 
					const errorPrefix = 'Machine learning request';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -3,16 +3,16 @@ import fs from 'node:fs/promises';
 | 
				
			|||||||
import { Writable } from 'node:stream';
 | 
					import { Writable } from 'node:stream';
 | 
				
			||||||
import { promisify } from 'node:util';
 | 
					import { promisify } from 'node:util';
 | 
				
			||||||
import sharp from 'sharp';
 | 
					import sharp from 'sharp';
 | 
				
			||||||
 | 
					import { Colorspace } from 'src/infra/entities/system-config.entity';
 | 
				
			||||||
 | 
					import { Instrumentation } from 'src/infra/instrumentation';
 | 
				
			||||||
 | 
					import { ImmichLogger } from 'src/infra/logger';
 | 
				
			||||||
import {
 | 
					import {
 | 
				
			||||||
  CropOptions,
 | 
					  CropOptions,
 | 
				
			||||||
  IMediaRepository,
 | 
					  IMediaRepository,
 | 
				
			||||||
  ResizeOptions,
 | 
					  ResizeOptions,
 | 
				
			||||||
  TranscodeOptions,
 | 
					  TranscodeOptions,
 | 
				
			||||||
  VideoInfo,
 | 
					  VideoInfo,
 | 
				
			||||||
} from 'src/domain/repositories/media.repository';
 | 
					} from 'src/interfaces/media.repository';
 | 
				
			||||||
import { Colorspace } from 'src/infra/entities/system-config.entity';
 | 
					 | 
				
			||||||
import { Instrumentation } from 'src/infra/instrumentation';
 | 
					 | 
				
			||||||
import { ImmichLogger } from 'src/infra/logger';
 | 
					 | 
				
			||||||
import { handlePromiseError } from 'src/utils';
 | 
					import { handlePromiseError } from 'src/utils';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const probe = promisify<string, FfprobeData>(ffmpeg.ffprobe);
 | 
					const probe = promisify<string, FfprobeData>(ffmpeg.ffprobe);
 | 
				
			||||||
 | 
				
			|||||||
@ -14,18 +14,13 @@ import {
 | 
				
			|||||||
  geodataCities500Path,
 | 
					  geodataCities500Path,
 | 
				
			||||||
  geodataDatePath,
 | 
					  geodataDatePath,
 | 
				
			||||||
} from 'src/domain/domain.constant';
 | 
					} from 'src/domain/domain.constant';
 | 
				
			||||||
import {
 | 
					 | 
				
			||||||
  GeoPoint,
 | 
					 | 
				
			||||||
  IMetadataRepository,
 | 
					 | 
				
			||||||
  ImmichTags,
 | 
					 | 
				
			||||||
  ReverseGeocodeResult,
 | 
					 | 
				
			||||||
} from 'src/domain/repositories/metadata.repository';
 | 
					 | 
				
			||||||
import { ISystemMetadataRepository } from 'src/domain/repositories/system-metadata.repository';
 | 
					 | 
				
			||||||
import { ExifEntity } from 'src/infra/entities/exif.entity';
 | 
					import { ExifEntity } from 'src/infra/entities/exif.entity';
 | 
				
			||||||
import { GeodataPlacesEntity } from 'src/infra/entities/geodata-places.entity';
 | 
					import { GeodataPlacesEntity } from 'src/infra/entities/geodata-places.entity';
 | 
				
			||||||
import { SystemMetadataKey } from 'src/infra/entities/system-metadata.entity';
 | 
					import { SystemMetadataKey } from 'src/infra/entities/system-metadata.entity';
 | 
				
			||||||
import { Instrumentation } from 'src/infra/instrumentation';
 | 
					import { Instrumentation } from 'src/infra/instrumentation';
 | 
				
			||||||
import { ImmichLogger } from 'src/infra/logger';
 | 
					import { ImmichLogger } from 'src/infra/logger';
 | 
				
			||||||
 | 
					import { GeoPoint, IMetadataRepository, ImmichTags, ReverseGeocodeResult } from 'src/interfaces/metadata.repository';
 | 
				
			||||||
 | 
					import { ISystemMetadataRepository } from 'src/interfaces/system-metadata.repository';
 | 
				
			||||||
import { DataSource, QueryRunner, Repository } from 'typeorm';
 | 
					import { DataSource, QueryRunner, Repository } from 'typeorm';
 | 
				
			||||||
import { QueryDeepPartialEntity } from 'typeorm/query-builder/QueryPartialEntity.js';
 | 
					import { QueryDeepPartialEntity } from 'typeorm/query-builder/QueryPartialEntity.js';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -1,9 +1,9 @@
 | 
				
			|||||||
import { Injectable } from '@nestjs/common';
 | 
					import { Injectable } from '@nestjs/common';
 | 
				
			||||||
import { InjectRepository } from '@nestjs/typeorm';
 | 
					import { InjectRepository } from '@nestjs/typeorm';
 | 
				
			||||||
import { DummyValue, GenerateSql } from 'src/decorators';
 | 
					import { DummyValue, GenerateSql } from 'src/decorators';
 | 
				
			||||||
import { IMoveRepository, MoveCreate } from 'src/domain/repositories/move.repository';
 | 
					 | 
				
			||||||
import { MoveEntity, PathType } from 'src/infra/entities/move.entity';
 | 
					import { MoveEntity, PathType } from 'src/infra/entities/move.entity';
 | 
				
			||||||
import { Instrumentation } from 'src/infra/instrumentation';
 | 
					import { Instrumentation } from 'src/infra/instrumentation';
 | 
				
			||||||
 | 
					import { IMoveRepository, MoveCreate } from 'src/interfaces/move.repository';
 | 
				
			||||||
import { Repository } from 'typeorm';
 | 
					import { Repository } from 'typeorm';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@Instrumentation()
 | 
					@Instrumentation()
 | 
				
			||||||
 | 
				
			|||||||
@ -1,8 +1,8 @@
 | 
				
			|||||||
import { Injectable } from '@nestjs/common';
 | 
					import { Injectable } from '@nestjs/common';
 | 
				
			||||||
import { InjectRepository } from '@nestjs/typeorm';
 | 
					import { InjectRepository } from '@nestjs/typeorm';
 | 
				
			||||||
import { IPartnerRepository, PartnerIds } from 'src/domain/repositories/partner.repository';
 | 
					 | 
				
			||||||
import { PartnerEntity } from 'src/infra/entities/partner.entity';
 | 
					import { PartnerEntity } from 'src/infra/entities/partner.entity';
 | 
				
			||||||
import { Instrumentation } from 'src/infra/instrumentation';
 | 
					import { Instrumentation } from 'src/infra/instrumentation';
 | 
				
			||||||
 | 
					import { IPartnerRepository, PartnerIds } from 'src/interfaces/partner.repository';
 | 
				
			||||||
import { DeepPartial, Repository } from 'typeorm';
 | 
					import { DeepPartial, Repository } from 'typeorm';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@Instrumentation()
 | 
					@Instrumentation()
 | 
				
			||||||
 | 
				
			|||||||
@ -1,6 +1,11 @@
 | 
				
			|||||||
import { InjectRepository } from '@nestjs/typeorm';
 | 
					import { InjectRepository } from '@nestjs/typeorm';
 | 
				
			||||||
import _ from 'lodash';
 | 
					import _ from 'lodash';
 | 
				
			||||||
import { ChunkedArray, DummyValue, GenerateSql } from 'src/decorators';
 | 
					import { ChunkedArray, DummyValue, GenerateSql } from 'src/decorators';
 | 
				
			||||||
 | 
					import { AssetFaceEntity } from 'src/infra/entities/asset-face.entity';
 | 
				
			||||||
 | 
					import { AssetEntity } from 'src/infra/entities/asset.entity';
 | 
				
			||||||
 | 
					import { PersonEntity } from 'src/infra/entities/person.entity';
 | 
				
			||||||
 | 
					import { asVector, paginate } from 'src/infra/infra.utils';
 | 
				
			||||||
 | 
					import { Instrumentation } from 'src/infra/instrumentation';
 | 
				
			||||||
import {
 | 
					import {
 | 
				
			||||||
  AssetFaceId,
 | 
					  AssetFaceId,
 | 
				
			||||||
  IPersonRepository,
 | 
					  IPersonRepository,
 | 
				
			||||||
@ -9,12 +14,7 @@ import {
 | 
				
			|||||||
  PersonSearchOptions,
 | 
					  PersonSearchOptions,
 | 
				
			||||||
  PersonStatistics,
 | 
					  PersonStatistics,
 | 
				
			||||||
  UpdateFacesData,
 | 
					  UpdateFacesData,
 | 
				
			||||||
} from 'src/domain/repositories/person.repository';
 | 
					} from 'src/interfaces/person.repository';
 | 
				
			||||||
import { AssetFaceEntity } from 'src/infra/entities/asset-face.entity';
 | 
					 | 
				
			||||||
import { AssetEntity } from 'src/infra/entities/asset.entity';
 | 
					 | 
				
			||||||
import { PersonEntity } from 'src/infra/entities/person.entity';
 | 
					 | 
				
			||||||
import { asVector, paginate } from 'src/infra/infra.utils';
 | 
					 | 
				
			||||||
import { Instrumentation } from 'src/infra/instrumentation';
 | 
					 | 
				
			||||||
import { Paginated, PaginationOptions } from 'src/utils';
 | 
					import { Paginated, PaginationOptions } from 'src/utils';
 | 
				
			||||||
import { FindManyOptions, FindOptionsRelations, FindOptionsSelect, In, Repository } from 'typeorm';
 | 
					import { FindManyOptions, FindOptionsRelations, FindOptionsSelect, In, Repository } from 'typeorm';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -1,16 +1,6 @@
 | 
				
			|||||||
import { Injectable } from '@nestjs/common';
 | 
					import { Injectable } from '@nestjs/common';
 | 
				
			||||||
import { InjectRepository } from '@nestjs/typeorm';
 | 
					import { InjectRepository } from '@nestjs/typeorm';
 | 
				
			||||||
import { DummyValue, GenerateSql } from 'src/decorators';
 | 
					import { DummyValue, GenerateSql } from 'src/decorators';
 | 
				
			||||||
import { DatabaseExtension } from 'src/domain/repositories/database.repository';
 | 
					 | 
				
			||||||
import {
 | 
					 | 
				
			||||||
  AssetSearchOptions,
 | 
					 | 
				
			||||||
  Embedding,
 | 
					 | 
				
			||||||
  FaceEmbeddingSearch,
 | 
					 | 
				
			||||||
  FaceSearchResult,
 | 
					 | 
				
			||||||
  ISearchRepository,
 | 
					 | 
				
			||||||
  SearchPaginationOptions,
 | 
					 | 
				
			||||||
  SmartSearchOptions,
 | 
					 | 
				
			||||||
} from 'src/domain/repositories/search.repository';
 | 
					 | 
				
			||||||
import { getCLIPModelInfo } from 'src/domain/smart-info/smart-info.constant';
 | 
					import { getCLIPModelInfo } from 'src/domain/smart-info/smart-info.constant';
 | 
				
			||||||
import { vectorExt } from 'src/infra/database.config';
 | 
					import { vectorExt } from 'src/infra/database.config';
 | 
				
			||||||
import { AssetFaceEntity } from 'src/infra/entities/asset-face.entity';
 | 
					import { AssetFaceEntity } from 'src/infra/entities/asset-face.entity';
 | 
				
			||||||
@ -21,6 +11,16 @@ import { SmartSearchEntity } from 'src/infra/entities/smart-search.entity';
 | 
				
			|||||||
import { asVector, paginatedBuilder, searchAssetBuilder } from 'src/infra/infra.utils';
 | 
					import { asVector, paginatedBuilder, searchAssetBuilder } from 'src/infra/infra.utils';
 | 
				
			||||||
import { Instrumentation } from 'src/infra/instrumentation';
 | 
					import { Instrumentation } from 'src/infra/instrumentation';
 | 
				
			||||||
import { ImmichLogger } from 'src/infra/logger';
 | 
					import { ImmichLogger } from 'src/infra/logger';
 | 
				
			||||||
 | 
					import { DatabaseExtension } from 'src/interfaces/database.repository';
 | 
				
			||||||
 | 
					import {
 | 
				
			||||||
 | 
					  AssetSearchOptions,
 | 
				
			||||||
 | 
					  Embedding,
 | 
				
			||||||
 | 
					  FaceEmbeddingSearch,
 | 
				
			||||||
 | 
					  FaceSearchResult,
 | 
				
			||||||
 | 
					  ISearchRepository,
 | 
				
			||||||
 | 
					  SearchPaginationOptions,
 | 
				
			||||||
 | 
					  SmartSearchOptions,
 | 
				
			||||||
 | 
					} from 'src/interfaces/search.repository';
 | 
				
			||||||
import { Paginated, PaginationMode, PaginationResult } from 'src/utils';
 | 
					import { Paginated, PaginationMode, PaginationResult } from 'src/utils';
 | 
				
			||||||
import { isValidInteger } from 'src/validation';
 | 
					import { isValidInteger } from 'src/validation';
 | 
				
			||||||
import { Repository, SelectQueryBuilder } from 'typeorm';
 | 
					import { Repository, SelectQueryBuilder } from 'typeorm';
 | 
				
			||||||
 | 
				
			|||||||
@ -1,6 +1,6 @@
 | 
				
			|||||||
import { Injectable } from '@nestjs/common';
 | 
					import { Injectable } from '@nestjs/common';
 | 
				
			||||||
import { GitHubRelease, IServerInfoRepository } from 'src/domain/repositories/server-info.repository';
 | 
					 | 
				
			||||||
import { Instrumentation } from 'src/infra/instrumentation';
 | 
					import { Instrumentation } from 'src/infra/instrumentation';
 | 
				
			||||||
 | 
					import { GitHubRelease, IServerInfoRepository } from 'src/interfaces/server-info.repository';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@Instrumentation()
 | 
					@Instrumentation()
 | 
				
			||||||
@Injectable()
 | 
					@Injectable()
 | 
				
			||||||
 | 
				
			|||||||
@ -1,9 +1,9 @@
 | 
				
			|||||||
import { Injectable } from '@nestjs/common';
 | 
					import { Injectable } from '@nestjs/common';
 | 
				
			||||||
import { InjectRepository } from '@nestjs/typeorm';
 | 
					import { InjectRepository } from '@nestjs/typeorm';
 | 
				
			||||||
import { DummyValue, GenerateSql } from 'src/decorators';
 | 
					import { DummyValue, GenerateSql } from 'src/decorators';
 | 
				
			||||||
import { ISharedLinkRepository } from 'src/domain/repositories/shared-link.repository';
 | 
					 | 
				
			||||||
import { SharedLinkEntity } from 'src/infra/entities/shared-link.entity';
 | 
					import { SharedLinkEntity } from 'src/infra/entities/shared-link.entity';
 | 
				
			||||||
import { Instrumentation } from 'src/infra/instrumentation';
 | 
					import { Instrumentation } from 'src/infra/instrumentation';
 | 
				
			||||||
 | 
					import { ISharedLinkRepository } from 'src/interfaces/shared-link.repository';
 | 
				
			||||||
import { Repository } from 'typeorm';
 | 
					import { Repository } from 'typeorm';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@Instrumentation()
 | 
					@Instrumentation()
 | 
				
			||||||
 | 
				
			|||||||
@ -1,9 +1,9 @@
 | 
				
			|||||||
import { InjectRepository } from '@nestjs/typeorm';
 | 
					import { InjectRepository } from '@nestjs/typeorm';
 | 
				
			||||||
import { readFile } from 'node:fs/promises';
 | 
					import { readFile } from 'node:fs/promises';
 | 
				
			||||||
import { Chunked, DummyValue, GenerateSql } from 'src/decorators';
 | 
					import { Chunked, DummyValue, GenerateSql } from 'src/decorators';
 | 
				
			||||||
import { ISystemConfigRepository } from 'src/domain/repositories/system-config.repository';
 | 
					 | 
				
			||||||
import { SystemConfigEntity } from 'src/infra/entities/system-config.entity';
 | 
					import { SystemConfigEntity } from 'src/infra/entities/system-config.entity';
 | 
				
			||||||
import { Instrumentation } from 'src/infra/instrumentation';
 | 
					import { Instrumentation } from 'src/infra/instrumentation';
 | 
				
			||||||
 | 
					import { ISystemConfigRepository } from 'src/interfaces/system-config.repository';
 | 
				
			||||||
import { In, Repository } from 'typeorm';
 | 
					import { In, Repository } from 'typeorm';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@Instrumentation()
 | 
					@Instrumentation()
 | 
				
			||||||
 | 
				
			|||||||
@ -1,7 +1,7 @@
 | 
				
			|||||||
import { InjectRepository } from '@nestjs/typeorm';
 | 
					import { InjectRepository } from '@nestjs/typeorm';
 | 
				
			||||||
import { ISystemMetadataRepository } from 'src/domain/repositories/system-metadata.repository';
 | 
					 | 
				
			||||||
import { SystemMetadata, SystemMetadataEntity } from 'src/infra/entities/system-metadata.entity';
 | 
					import { SystemMetadata, SystemMetadataEntity } from 'src/infra/entities/system-metadata.entity';
 | 
				
			||||||
import { Instrumentation } from 'src/infra/instrumentation';
 | 
					import { Instrumentation } from 'src/infra/instrumentation';
 | 
				
			||||||
 | 
					import { ISystemMetadataRepository } from 'src/interfaces/system-metadata.repository';
 | 
				
			||||||
import { Repository } from 'typeorm';
 | 
					import { Repository } from 'typeorm';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@Instrumentation()
 | 
					@Instrumentation()
 | 
				
			||||||
 | 
				
			|||||||
@ -1,9 +1,9 @@
 | 
				
			|||||||
import { Injectable } from '@nestjs/common';
 | 
					import { Injectable } from '@nestjs/common';
 | 
				
			||||||
import { InjectRepository } from '@nestjs/typeorm';
 | 
					import { InjectRepository } from '@nestjs/typeorm';
 | 
				
			||||||
import { ITagRepository } from 'src/domain/repositories/tag.repository';
 | 
					 | 
				
			||||||
import { AssetEntity } from 'src/infra/entities/asset.entity';
 | 
					import { AssetEntity } from 'src/infra/entities/asset.entity';
 | 
				
			||||||
import { TagEntity } from 'src/infra/entities/tag.entity';
 | 
					import { TagEntity } from 'src/infra/entities/tag.entity';
 | 
				
			||||||
import { Instrumentation } from 'src/infra/instrumentation';
 | 
					import { Instrumentation } from 'src/infra/instrumentation';
 | 
				
			||||||
 | 
					import { ITagRepository } from 'src/interfaces/tag.repository';
 | 
				
			||||||
import { Repository } from 'typeorm';
 | 
					import { Repository } from 'typeorm';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@Instrumentation()
 | 
					@Instrumentation()
 | 
				
			||||||
 | 
				
			|||||||
@ -1,9 +1,9 @@
 | 
				
			|||||||
import { Injectable } from '@nestjs/common';
 | 
					import { Injectable } from '@nestjs/common';
 | 
				
			||||||
import { InjectRepository } from '@nestjs/typeorm';
 | 
					import { InjectRepository } from '@nestjs/typeorm';
 | 
				
			||||||
import { DummyValue, GenerateSql } from 'src/decorators';
 | 
					import { DummyValue, GenerateSql } from 'src/decorators';
 | 
				
			||||||
import { IUserTokenRepository } from 'src/domain/repositories/user-token.repository';
 | 
					 | 
				
			||||||
import { UserTokenEntity } from 'src/infra/entities/user-token.entity';
 | 
					import { UserTokenEntity } from 'src/infra/entities/user-token.entity';
 | 
				
			||||||
import { Instrumentation } from 'src/infra/instrumentation';
 | 
					import { Instrumentation } from 'src/infra/instrumentation';
 | 
				
			||||||
 | 
					import { IUserTokenRepository } from 'src/interfaces/user-token.repository';
 | 
				
			||||||
import { Repository } from 'typeorm';
 | 
					import { Repository } from 'typeorm';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@Instrumentation()
 | 
					@Instrumentation()
 | 
				
			||||||
 | 
				
			|||||||
@ -1,15 +1,15 @@
 | 
				
			|||||||
import { Injectable } from '@nestjs/common';
 | 
					import { Injectable } from '@nestjs/common';
 | 
				
			||||||
import { InjectRepository } from '@nestjs/typeorm';
 | 
					import { InjectRepository } from '@nestjs/typeorm';
 | 
				
			||||||
import { DummyValue, GenerateSql } from 'src/decorators';
 | 
					import { DummyValue, GenerateSql } from 'src/decorators';
 | 
				
			||||||
 | 
					import { AssetEntity } from 'src/infra/entities/asset.entity';
 | 
				
			||||||
 | 
					import { UserEntity } from 'src/infra/entities/user.entity';
 | 
				
			||||||
 | 
					import { Instrumentation } from 'src/infra/instrumentation';
 | 
				
			||||||
import {
 | 
					import {
 | 
				
			||||||
  IUserRepository,
 | 
					  IUserRepository,
 | 
				
			||||||
  UserFindOptions,
 | 
					  UserFindOptions,
 | 
				
			||||||
  UserListFilter,
 | 
					  UserListFilter,
 | 
				
			||||||
  UserStatsQueryResponse,
 | 
					  UserStatsQueryResponse,
 | 
				
			||||||
} from 'src/domain/repositories/user.repository';
 | 
					} from 'src/interfaces/user.repository';
 | 
				
			||||||
import { AssetEntity } from 'src/infra/entities/asset.entity';
 | 
					 | 
				
			||||||
import { UserEntity } from 'src/infra/entities/user.entity';
 | 
					 | 
				
			||||||
import { Instrumentation } from 'src/infra/instrumentation';
 | 
					 | 
				
			||||||
import { IsNull, Not, Repository } from 'typeorm';
 | 
					import { IsNull, Not, Repository } from 'typeorm';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@Instrumentation()
 | 
					@Instrumentation()
 | 
				
			||||||
 | 
				
			|||||||
@ -6,7 +6,6 @@ import { TypeOrmModule } from '@nestjs/typeorm';
 | 
				
			|||||||
import { mkdir, rm, writeFile } from 'node:fs/promises';
 | 
					import { mkdir, rm, writeFile } from 'node:fs/promises';
 | 
				
			||||||
import { join } from 'node:path';
 | 
					import { join } from 'node:path';
 | 
				
			||||||
import { GENERATE_SQL_KEY, GenerateSqlQueries } from 'src/decorators';
 | 
					import { GENERATE_SQL_KEY, GenerateSqlQueries } from 'src/decorators';
 | 
				
			||||||
import { ISystemConfigRepository } from 'src/domain/repositories/system-config.repository';
 | 
					 | 
				
			||||||
import { databaseConfig } from 'src/infra/database.config';
 | 
					import { databaseConfig } from 'src/infra/database.config';
 | 
				
			||||||
import { databaseEntities } from 'src/infra/entities';
 | 
					import { databaseEntities } from 'src/infra/entities';
 | 
				
			||||||
import { AccessRepository } from 'src/infra/repositories/access.repository';
 | 
					import { AccessRepository } from 'src/infra/repositories/access.repository';
 | 
				
			||||||
@ -26,6 +25,7 @@ import { TagRepository } from 'src/infra/repositories/tag.repository';
 | 
				
			|||||||
import { UserTokenRepository } from 'src/infra/repositories/user-token.repository';
 | 
					import { UserTokenRepository } from 'src/infra/repositories/user-token.repository';
 | 
				
			||||||
import { UserRepository } from 'src/infra/repositories/user.repository';
 | 
					import { UserRepository } from 'src/infra/repositories/user.repository';
 | 
				
			||||||
import { SqlLogger } from 'src/infra/sql-generator/sql.logger';
 | 
					import { SqlLogger } from 'src/infra/sql-generator/sql.logger';
 | 
				
			||||||
 | 
					import { ISystemConfigRepository } from 'src/interfaces/system-config.repository';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const reflector = new Reflector();
 | 
					const reflector = new Reflector();
 | 
				
			||||||
const repositories = [
 | 
					const repositories = [
 | 
				
			||||||
 | 
				
			|||||||
@ -1,9 +1,9 @@
 | 
				
			|||||||
import { ReverseGeocodeResult } from 'src/domain/repositories/metadata.repository';
 | 
					 | 
				
			||||||
import { AssetSearchOptions, SearchExploreItem } from 'src/domain/repositories/search.repository';
 | 
					 | 
				
			||||||
import { AssetOrder } from 'src/infra/entities/album.entity';
 | 
					import { AssetOrder } from 'src/infra/entities/album.entity';
 | 
				
			||||||
import { AssetJobStatusEntity } from 'src/infra/entities/asset-job-status.entity';
 | 
					import { AssetJobStatusEntity } from 'src/infra/entities/asset-job-status.entity';
 | 
				
			||||||
import { AssetEntity, AssetType } from 'src/infra/entities/asset.entity';
 | 
					import { AssetEntity, AssetType } from 'src/infra/entities/asset.entity';
 | 
				
			||||||
import { ExifEntity } from 'src/infra/entities/exif.entity';
 | 
					import { ExifEntity } from 'src/infra/entities/exif.entity';
 | 
				
			||||||
 | 
					import { ReverseGeocodeResult } from 'src/interfaces/metadata.repository';
 | 
				
			||||||
 | 
					import { AssetSearchOptions, SearchExploreItem } from 'src/interfaces/search.repository';
 | 
				
			||||||
import { Paginated, PaginationOptions } from 'src/utils';
 | 
					import { Paginated, PaginationOptions } from 'src/utils';
 | 
				
			||||||
import { FindOptionsRelations, FindOptionsSelect } from 'typeorm';
 | 
					import { FindOptionsRelations, FindOptionsSelect } from 'typeorm';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Some files were not shown because too many files have changed in this diff Show More
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user