mirror of
https://github.com/immich-app/immich.git
synced 2026-05-18 03:10:24 +03:00
chore(server): use absolute import paths (#8080)
update server to use absolute import paths
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
import { DatabaseExtension } from '@app/domain/repositories/database.repository';
|
||||
import { DatabaseExtension } from 'src/domain/repositories/database.repository';
|
||||
import { DataSource } from 'typeorm';
|
||||
import { PostgresConnectionOptions } from 'typeorm/driver/postgres/PostgresConnectionOptions.js';
|
||||
|
||||
|
||||
@@ -1,3 +1,6 @@
|
||||
import { AlbumEntity } from 'src/infra/entities/album.entity';
|
||||
import { AssetEntity } from 'src/infra/entities/asset.entity';
|
||||
import { UserEntity } from 'src/infra/entities/user.entity';
|
||||
import {
|
||||
Check,
|
||||
Column,
|
||||
@@ -8,9 +11,6 @@ import {
|
||||
PrimaryGeneratedColumn,
|
||||
UpdateDateColumn,
|
||||
} from 'typeorm';
|
||||
import { AlbumEntity } from './album.entity';
|
||||
import { AssetEntity } from './asset.entity';
|
||||
import { UserEntity } from './user.entity';
|
||||
|
||||
@Entity('activity')
|
||||
@Index('IDX_activity_like', ['assetId', 'userId', 'albumId'], { unique: true, where: '("isLiked" = true)' })
|
||||
|
||||
@@ -1,3 +1,6 @@
|
||||
import { AssetEntity } from 'src/infra/entities/asset.entity';
|
||||
import { SharedLinkEntity } from 'src/infra/entities/shared-link.entity';
|
||||
import { UserEntity } from 'src/infra/entities/user.entity';
|
||||
import {
|
||||
Column,
|
||||
CreateDateColumn,
|
||||
@@ -10,9 +13,6 @@ import {
|
||||
PrimaryGeneratedColumn,
|
||||
UpdateDateColumn,
|
||||
} from 'typeorm';
|
||||
import { AssetEntity } from './asset.entity';
|
||||
import { SharedLinkEntity } from './shared-link.entity';
|
||||
import { UserEntity } from './user.entity';
|
||||
|
||||
// ran into issues when importing the enum from `asset.dto.ts`
|
||||
export enum AssetOrder {
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import { UserEntity } from 'src/infra/entities/user.entity';
|
||||
import { Column, CreateDateColumn, Entity, ManyToOne, PrimaryGeneratedColumn, UpdateDateColumn } from 'typeorm';
|
||||
import { UserEntity } from './user.entity';
|
||||
|
||||
@Entity('api_keys')
|
||||
export class APIKeyEntity {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import { AssetEntity } from 'src/infra/entities/asset.entity';
|
||||
import { PersonEntity } from 'src/infra/entities/person.entity';
|
||||
import { Column, Entity, Index, ManyToOne, PrimaryGeneratedColumn } from 'typeorm';
|
||||
import { AssetEntity } from './asset.entity';
|
||||
import { PersonEntity } from './person.entity';
|
||||
|
||||
@Entity('asset_faces', { synchronize: false })
|
||||
@Index('IDX_asset_faces_assetId_personId', ['assetId', 'personId'])
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import { AssetEntity } from 'src/infra/entities/asset.entity';
|
||||
import { Column, Entity, JoinColumn, OneToOne, PrimaryColumn } from 'typeorm';
|
||||
import { AssetEntity } from './asset.entity';
|
||||
|
||||
@Entity('asset_job_status')
|
||||
export class AssetJobStatusEntity {
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import { AssetEntity } from 'src/infra/entities/asset.entity';
|
||||
import { Column, Entity, JoinColumn, OneToMany, OneToOne, PrimaryGeneratedColumn } from 'typeorm';
|
||||
import { AssetEntity } from './asset.entity';
|
||||
|
||||
@Entity('asset_stack')
|
||||
export class AssetStackEntity {
|
||||
|
||||
@@ -1,3 +1,14 @@
|
||||
import { AlbumEntity } from 'src/infra/entities/album.entity';
|
||||
import { AssetFaceEntity } from 'src/infra/entities/asset-face.entity';
|
||||
import { AssetJobStatusEntity } from 'src/infra/entities/asset-job-status.entity';
|
||||
import { AssetStackEntity } from 'src/infra/entities/asset-stack.entity';
|
||||
import { ExifEntity } from 'src/infra/entities/exif.entity';
|
||||
import { LibraryEntity } from 'src/infra/entities/library.entity';
|
||||
import { SharedLinkEntity } from 'src/infra/entities/shared-link.entity';
|
||||
import { SmartInfoEntity } from 'src/infra/entities/smart-info.entity';
|
||||
import { SmartSearchEntity } from 'src/infra/entities/smart-search.entity';
|
||||
import { TagEntity } from 'src/infra/entities/tag.entity';
|
||||
import { UserEntity } from 'src/infra/entities/user.entity';
|
||||
import {
|
||||
Column,
|
||||
CreateDateColumn,
|
||||
@@ -13,17 +24,6 @@ import {
|
||||
PrimaryGeneratedColumn,
|
||||
UpdateDateColumn,
|
||||
} from 'typeorm';
|
||||
import { AlbumEntity } from './album.entity';
|
||||
import { AssetFaceEntity } from './asset-face.entity';
|
||||
import { AssetJobStatusEntity } from './asset-job-status.entity';
|
||||
import { AssetStackEntity } from './asset-stack.entity';
|
||||
import { ExifEntity } from './exif.entity';
|
||||
import { LibraryEntity } from './library.entity';
|
||||
import { SharedLinkEntity } from './shared-link.entity';
|
||||
import { SmartInfoEntity } from './smart-info.entity';
|
||||
import { SmartSearchEntity } from './smart-search.entity';
|
||||
import { TagEntity } from './tag.entity';
|
||||
import { UserEntity } from './user.entity';
|
||||
|
||||
export const ASSET_CHECKSUM_CONSTRAINT = 'UQ_assets_owner_library_checksum';
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import { AssetEntity } from 'src/infra/entities/asset.entity';
|
||||
import { Index, JoinColumn, OneToOne, PrimaryColumn } from 'typeorm';
|
||||
import { Column } from 'typeorm/decorator/columns/Column.js';
|
||||
import { Entity } from 'typeorm/decorator/entity/Entity.js';
|
||||
import { AssetEntity } from './asset.entity';
|
||||
|
||||
@Entity('exif')
|
||||
export class ExifEntity {
|
||||
|
||||
@@ -1,48 +1,25 @@
|
||||
import { ActivityEntity } from './activity.entity';
|
||||
import { AlbumEntity } from './album.entity';
|
||||
import { APIKeyEntity } from './api-key.entity';
|
||||
import { AssetFaceEntity } from './asset-face.entity';
|
||||
import { AssetJobStatusEntity } from './asset-job-status.entity';
|
||||
import { AssetStackEntity } from './asset-stack.entity';
|
||||
import { AssetEntity } from './asset.entity';
|
||||
import { AuditEntity } from './audit.entity';
|
||||
import { ExifEntity } from './exif.entity';
|
||||
import { GeodataPlacesEntity } from './geodata-places.entity';
|
||||
import { LibraryEntity } from './library.entity';
|
||||
import { MoveEntity } from './move.entity';
|
||||
import { PartnerEntity } from './partner.entity';
|
||||
import { PersonEntity } from './person.entity';
|
||||
import { SharedLinkEntity } from './shared-link.entity';
|
||||
import { SmartInfoEntity } from './smart-info.entity';
|
||||
import { SmartSearchEntity } from './smart-search.entity';
|
||||
import { SystemConfigEntity } from './system-config.entity';
|
||||
import { SystemMetadataEntity } from './system-metadata.entity';
|
||||
import { TagEntity } from './tag.entity';
|
||||
import { UserTokenEntity } from './user-token.entity';
|
||||
import { UserEntity } from './user.entity';
|
||||
|
||||
export * from './activity.entity';
|
||||
export * from './album.entity';
|
||||
export * from './api-key.entity';
|
||||
export * from './asset-face.entity';
|
||||
export * from './asset-job-status.entity';
|
||||
export * from './asset-stack.entity';
|
||||
export * from './asset.entity';
|
||||
export * from './audit.entity';
|
||||
export * from './exif.entity';
|
||||
export * from './geodata-places.entity';
|
||||
export * from './library.entity';
|
||||
export * from './move.entity';
|
||||
export * from './partner.entity';
|
||||
export * from './person.entity';
|
||||
export * from './shared-link.entity';
|
||||
export * from './smart-info.entity';
|
||||
export * from './smart-search.entity';
|
||||
export * from './system-config.entity';
|
||||
export * from './system-metadata.entity';
|
||||
export * from './tag.entity';
|
||||
export * from './user-token.entity';
|
||||
export * from './user.entity';
|
||||
import { ActivityEntity } from 'src/infra/entities/activity.entity';
|
||||
import { AlbumEntity } from 'src/infra/entities/album.entity';
|
||||
import { APIKeyEntity } from 'src/infra/entities/api-key.entity';
|
||||
import { AssetFaceEntity } from 'src/infra/entities/asset-face.entity';
|
||||
import { AssetJobStatusEntity } from 'src/infra/entities/asset-job-status.entity';
|
||||
import { AssetStackEntity } from 'src/infra/entities/asset-stack.entity';
|
||||
import { AssetEntity } from 'src/infra/entities/asset.entity';
|
||||
import { AuditEntity } from 'src/infra/entities/audit.entity';
|
||||
import { ExifEntity } from 'src/infra/entities/exif.entity';
|
||||
import { GeodataPlacesEntity } from 'src/infra/entities/geodata-places.entity';
|
||||
import { LibraryEntity } from 'src/infra/entities/library.entity';
|
||||
import { MoveEntity } from 'src/infra/entities/move.entity';
|
||||
import { PartnerEntity } from 'src/infra/entities/partner.entity';
|
||||
import { PersonEntity } from 'src/infra/entities/person.entity';
|
||||
import { SharedLinkEntity } from 'src/infra/entities/shared-link.entity';
|
||||
import { SmartInfoEntity } from 'src/infra/entities/smart-info.entity';
|
||||
import { SmartSearchEntity } from 'src/infra/entities/smart-search.entity';
|
||||
import { SystemConfigEntity } from 'src/infra/entities/system-config.entity';
|
||||
import { SystemMetadataEntity } from 'src/infra/entities/system-metadata.entity';
|
||||
import { TagEntity } from 'src/infra/entities/tag.entity';
|
||||
import { UserTokenEntity } from 'src/infra/entities/user-token.entity';
|
||||
import { UserEntity } from 'src/infra/entities/user.entity';
|
||||
|
||||
export const databaseEntities = [
|
||||
ActivityEntity,
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
import { AssetEntity } from 'src/infra/entities/asset.entity';
|
||||
import { UserEntity } from 'src/infra/entities/user.entity';
|
||||
import {
|
||||
Column,
|
||||
CreateDateColumn,
|
||||
@@ -9,8 +11,6 @@ import {
|
||||
PrimaryGeneratedColumn,
|
||||
UpdateDateColumn,
|
||||
} from 'typeorm';
|
||||
import { AssetEntity } from './asset.entity';
|
||||
import { UserEntity } from './user.entity';
|
||||
|
||||
@Entity('libraries')
|
||||
export class LibraryEntity {
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
import { UserEntity } from 'src/infra/entities/user.entity';
|
||||
import { Column, CreateDateColumn, Entity, JoinColumn, ManyToOne, PrimaryColumn, UpdateDateColumn } from 'typeorm';
|
||||
|
||||
import { UserEntity } from './user.entity';
|
||||
|
||||
@Entity('partners')
|
||||
export class PartnerEntity {
|
||||
@PrimaryColumn('uuid')
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
import { AssetFaceEntity } from 'src/infra/entities/asset-face.entity';
|
||||
import { UserEntity } from 'src/infra/entities/user.entity';
|
||||
import {
|
||||
Check,
|
||||
Column,
|
||||
@@ -8,8 +10,6 @@ import {
|
||||
PrimaryGeneratedColumn,
|
||||
UpdateDateColumn,
|
||||
} from 'typeorm';
|
||||
import { AssetFaceEntity } from './asset-face.entity';
|
||||
import { UserEntity } from './user.entity';
|
||||
|
||||
@Entity('person')
|
||||
@Check(`"birthDate" <= CURRENT_DATE`)
|
||||
|
||||
@@ -1,3 +1,6 @@
|
||||
import { AlbumEntity } from 'src/infra/entities/album.entity';
|
||||
import { AssetEntity } from 'src/infra/entities/asset.entity';
|
||||
import { UserEntity } from 'src/infra/entities/user.entity';
|
||||
import {
|
||||
Column,
|
||||
CreateDateColumn,
|
||||
@@ -8,9 +11,6 @@ import {
|
||||
PrimaryGeneratedColumn,
|
||||
Unique,
|
||||
} from 'typeorm';
|
||||
import { AlbumEntity } from './album.entity';
|
||||
import { AssetEntity } from './asset.entity';
|
||||
import { UserEntity } from './user.entity';
|
||||
|
||||
@Entity('shared_links')
|
||||
@Unique('UQ_sharedlink_key', ['key'])
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import { AssetEntity } from 'src/infra/entities/asset.entity';
|
||||
import { Column, Entity, JoinColumn, OneToOne, PrimaryColumn } from 'typeorm';
|
||||
import { AssetEntity } from './asset.entity';
|
||||
|
||||
@Entity('smart_info', { synchronize: false })
|
||||
export class SmartInfoEntity {
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import { AssetEntity } from 'src/infra/entities/asset.entity';
|
||||
import { Column, Entity, Index, JoinColumn, OneToOne, PrimaryColumn } from 'typeorm';
|
||||
import { AssetEntity } from './asset.entity';
|
||||
|
||||
@Entity('smart_search', { synchronize: false })
|
||||
export class SmartSearchEntity {
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { ConcurrentQueueName } from '@app/domain';
|
||||
import { ConcurrentQueueName } from 'src/domain/job/job.constants';
|
||||
import { Column, Entity, PrimaryColumn } from 'typeorm';
|
||||
|
||||
@Entity('system_config')
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import { AssetEntity } from 'src/infra/entities/asset.entity';
|
||||
import { UserEntity } from 'src/infra/entities/user.entity';
|
||||
import { Column, Entity, ManyToMany, ManyToOne, PrimaryGeneratedColumn, Unique } from 'typeorm';
|
||||
import { AssetEntity } from './asset.entity';
|
||||
import { UserEntity } from './user.entity';
|
||||
|
||||
@Entity('tags')
|
||||
@Unique('UQ_tag_name_userId', ['name', 'userId'])
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import { UserEntity } from 'src/infra/entities/user.entity';
|
||||
import { Column, CreateDateColumn, Entity, ManyToOne, PrimaryGeneratedColumn, UpdateDateColumn } from 'typeorm';
|
||||
import { UserEntity } from './user.entity';
|
||||
|
||||
@Entity('user_token')
|
||||
export class UserTokenEntity {
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
import { AssetEntity } from 'src/infra/entities/asset.entity';
|
||||
import { TagEntity } from 'src/infra/entities/tag.entity';
|
||||
import {
|
||||
Column,
|
||||
CreateDateColumn,
|
||||
@@ -7,8 +9,6 @@ import {
|
||||
PrimaryGeneratedColumn,
|
||||
UpdateDateColumn,
|
||||
} from 'typeorm';
|
||||
import { AssetEntity } from './asset.entity';
|
||||
import { TagEntity } from './tag.entity';
|
||||
|
||||
export enum UserAvatarColor {
|
||||
PRIMARY = 'primary',
|
||||
|
||||
@@ -1,4 +0,0 @@
|
||||
export * from './database.config';
|
||||
export * from './infra.config';
|
||||
export * from './infra.module';
|
||||
export * from './websocket.adapter';
|
||||
@@ -1,7 +1,7 @@
|
||||
import { QueueName } from '@app/domain';
|
||||
import { RegisterQueueOptions } from '@nestjs/bullmq';
|
||||
import { QueueOptions } from 'bullmq';
|
||||
import { RedisOptions } from 'ioredis';
|
||||
import { QueueName } from 'src/domain/job/job.constants';
|
||||
|
||||
function parseRedisConfig(): RedisOptions {
|
||||
const redisUrl = process.env.REDIS_URL;
|
||||
|
||||
@@ -1,33 +1,3 @@
|
||||
import {
|
||||
IAccessRepository,
|
||||
IActivityRepository,
|
||||
IAlbumRepository,
|
||||
IAssetRepository,
|
||||
IAssetStackRepository,
|
||||
IAuditRepository,
|
||||
ICommunicationRepository,
|
||||
ICryptoRepository,
|
||||
IDatabaseRepository,
|
||||
IJobRepository,
|
||||
IKeyRepository,
|
||||
ILibraryRepository,
|
||||
IMachineLearningRepository,
|
||||
IMediaRepository,
|
||||
IMetadataRepository,
|
||||
IMoveRepository,
|
||||
IPartnerRepository,
|
||||
IPersonRepository,
|
||||
ISearchRepository,
|
||||
IServerInfoRepository,
|
||||
ISharedLinkRepository,
|
||||
IStorageRepository,
|
||||
ISystemConfigRepository,
|
||||
ISystemMetadataRepository,
|
||||
ITagRepository,
|
||||
IUserRepository,
|
||||
IUserTokenRepository,
|
||||
immichAppConfig,
|
||||
} from '@app/domain';
|
||||
import { BullModule } from '@nestjs/bullmq';
|
||||
import { Global, Module, Provider } from '@nestjs/common';
|
||||
import { ConfigModule } from '@nestjs/config';
|
||||
@@ -35,39 +5,65 @@ import { EventEmitterModule } from '@nestjs/event-emitter';
|
||||
import { ScheduleModule, SchedulerRegistry } from '@nestjs/schedule';
|
||||
import { TypeOrmModule } from '@nestjs/typeorm';
|
||||
import { OpenTelemetryModule } from 'nestjs-otel';
|
||||
import { databaseConfig } from './database.config';
|
||||
import { databaseEntities } from './entities';
|
||||
import { bullConfig, bullQueues } from './infra.config';
|
||||
import { otelConfig } from './instrumentation';
|
||||
import {
|
||||
AccessRepository,
|
||||
ActivityRepository,
|
||||
AlbumRepository,
|
||||
ApiKeyRepository,
|
||||
AssetRepository,
|
||||
AssetStackRepository,
|
||||
AuditRepository,
|
||||
CommunicationRepository,
|
||||
CryptoRepository,
|
||||
DatabaseRepository,
|
||||
FilesystemProvider,
|
||||
JobRepository,
|
||||
LibraryRepository,
|
||||
MachineLearningRepository,
|
||||
MediaRepository,
|
||||
MetadataRepository,
|
||||
MoveRepository,
|
||||
PartnerRepository,
|
||||
PersonRepository,
|
||||
SearchRepository,
|
||||
ServerInfoRepository,
|
||||
SharedLinkRepository,
|
||||
SystemConfigRepository,
|
||||
SystemMetadataRepository,
|
||||
TagRepository,
|
||||
UserRepository,
|
||||
UserTokenRepository,
|
||||
} from './repositories';
|
||||
import { immichAppConfig } from 'src/domain/domain.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 { databaseEntities } from 'src/infra/entities';
|
||||
import { bullConfig, bullQueues } from 'src/infra/infra.config';
|
||||
import { otelConfig } from 'src/infra/instrumentation';
|
||||
import { AccessRepository } from 'src/infra/repositories/access.repository';
|
||||
import { ActivityRepository } from 'src/infra/repositories/activity.repository';
|
||||
import { AlbumRepository } from 'src/infra/repositories/album.repository';
|
||||
import { ApiKeyRepository } from 'src/infra/repositories/api-key.repository';
|
||||
import { AssetStackRepository } from 'src/infra/repositories/asset-stack.repository';
|
||||
import { AssetRepository } from 'src/infra/repositories/asset.repository';
|
||||
import { AuditRepository } from 'src/infra/repositories/audit.repository';
|
||||
import { CommunicationRepository } from 'src/infra/repositories/communication.repository';
|
||||
import { CryptoRepository } from 'src/infra/repositories/crypto.repository';
|
||||
import { DatabaseRepository } from 'src/infra/repositories/database.repository';
|
||||
import { FilesystemProvider } from 'src/infra/repositories/filesystem.provider';
|
||||
import { JobRepository } from 'src/infra/repositories/job.repository';
|
||||
import { LibraryRepository } from 'src/infra/repositories/library.repository';
|
||||
import { MachineLearningRepository } from 'src/infra/repositories/machine-learning.repository';
|
||||
import { MediaRepository } from 'src/infra/repositories/media.repository';
|
||||
import { MetadataRepository } from 'src/infra/repositories/metadata.repository';
|
||||
import { MoveRepository } from 'src/infra/repositories/move.repository';
|
||||
import { PartnerRepository } from 'src/infra/repositories/partner.repository';
|
||||
import { PersonRepository } from 'src/infra/repositories/person.repository';
|
||||
import { SearchRepository } from 'src/infra/repositories/search.repository';
|
||||
import { ServerInfoRepository } from 'src/infra/repositories/server-info.repository';
|
||||
import { SharedLinkRepository } from 'src/infra/repositories/shared-link.repository';
|
||||
import { SystemConfigRepository } from 'src/infra/repositories/system-config.repository';
|
||||
import { SystemMetadataRepository } from 'src/infra/repositories/system-metadata.repository';
|
||||
import { TagRepository } from 'src/infra/repositories/tag.repository';
|
||||
import { UserTokenRepository } from 'src/infra/repositories/user-token.repository';
|
||||
import { UserRepository } from 'src/infra/repositories/user.repository';
|
||||
|
||||
const providers: Provider[] = [
|
||||
{ provide: IActivityRepository, useClass: ActivityRepository },
|
||||
|
||||
@@ -1,5 +1,16 @@
|
||||
import { AssetSearchBuilderOptions, Paginated, PaginationOptions } from '@app/domain';
|
||||
import _ from 'lodash';
|
||||
import {
|
||||
Paginated,
|
||||
PaginatedBuilderOptions,
|
||||
PaginationMode,
|
||||
PaginationOptions,
|
||||
PaginationResult,
|
||||
chunks,
|
||||
setUnion,
|
||||
} from 'src/domain/domain.util';
|
||||
import { AssetSearchBuilderOptions } from 'src/domain/repositories/search.repository';
|
||||
import { AssetEntity } from 'src/infra/entities/asset.entity';
|
||||
import { DATABASE_PARAMETER_CHUNK_SIZE } from 'src/infra/infra.util';
|
||||
import {
|
||||
Between,
|
||||
FindManyOptions,
|
||||
@@ -11,9 +22,6 @@ import {
|
||||
Repository,
|
||||
SelectQueryBuilder,
|
||||
} from 'typeorm';
|
||||
import { PaginatedBuilderOptions, PaginationMode, PaginationResult, chunks, setUnion } from '../domain/domain.util';
|
||||
import { AssetEntity } from './entities';
|
||||
import { DATABASE_PARAMETER_CHUNK_SIZE } from './infra.util';
|
||||
|
||||
/**
|
||||
* Allows optional values unlike the regular Between and uses MoreThanOrEqual
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
import { serverVersion } from '@app/domain/domain.constant';
|
||||
import { Histogram, MetricOptions, ValueType, metrics } from '@opentelemetry/api';
|
||||
import { AsyncLocalStorageContextManager } from '@opentelemetry/context-async-hooks';
|
||||
import { PrometheusExporter } from '@opentelemetry/exporter-prometheus';
|
||||
@@ -14,8 +13,9 @@ import { snakeCase, startCase } from 'lodash';
|
||||
import { OpenTelemetryModuleOptions } from 'nestjs-otel/lib/interfaces';
|
||||
import { copyMetadataFromFunctionToFunction } from 'nestjs-otel/lib/opentelemetry.utils';
|
||||
import { performance } from 'node:perf_hooks';
|
||||
import { excludePaths } from './infra.config';
|
||||
import { DecorateAll } from './infra.utils';
|
||||
import { serverVersion } from 'src/domain/domain.constant';
|
||||
import { excludePaths } from 'src/infra/infra.config';
|
||||
import { DecorateAll } from 'src/infra/infra.utils';
|
||||
|
||||
let metricsEnabled = process.env.IMMICH_METRICS === 'true';
|
||||
const hostMetrics =
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import { ConsoleLogger } from '@nestjs/common';
|
||||
import { isLogLevelEnabled } from '@nestjs/common/services/utils/is-log-level-enabled.util';
|
||||
import { LogLevel } from './entities';
|
||||
import { LogLevel } from 'src/infra/entities/system-config.entity';
|
||||
|
||||
const LOG_LEVELS = [LogLevel.VERBOSE, LogLevel.DEBUG, LogLevel.LOG, LogLevel.WARN, LogLevel.ERROR, LogLevel.FATAL];
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import { getCLIPModelInfo } from '@app/domain/smart-info/smart-info.constant';
|
||||
import { getCLIPModelInfo } from 'src/domain/smart-info/smart-info.constant';
|
||||
import { vectorExt } from 'src/infra/database.config';
|
||||
import { MigrationInterface, QueryRunner } from 'typeorm';
|
||||
import { vectorExt } from '@app/infra/database.config';
|
||||
|
||||
export class UsePgVectors1700713871511 implements MigrationInterface {
|
||||
name = 'UsePgVectors1700713871511';
|
||||
@@ -14,12 +14,14 @@ export class UsePgVectors1700713871511 implements MigrationInterface {
|
||||
LIMIT 1`);
|
||||
const faceDimSize = faceDimQuery?.[0]?.['dimsize'] ?? 512;
|
||||
|
||||
const clipModelNameQuery = await queryRunner.query(`SELECT value FROM system_config WHERE key = 'machineLearning.clip.modelName'`);
|
||||
const clipModelNameQuery = await queryRunner.query(
|
||||
`SELECT value FROM system_config WHERE key = 'machineLearning.clip.modelName'`,
|
||||
);
|
||||
const clipModelName: string = clipModelNameQuery?.[0]?.['value'] ?? 'ViT-B-32__openai';
|
||||
const clipDimSize = getCLIPModelInfo(clipModelName.replaceAll('"', '')).dimSize;
|
||||
|
||||
await queryRunner.query(`
|
||||
ALTER TABLE asset_faces
|
||||
ALTER TABLE asset_faces
|
||||
ALTER COLUMN embedding SET NOT NULL,
|
||||
ALTER COLUMN embedding TYPE vector(${faceDimSize})`);
|
||||
|
||||
@@ -37,7 +39,7 @@ export class UsePgVectors1700713871511 implements MigrationInterface {
|
||||
AND array_position(si."clipEmbedding", NULL) IS NULL`);
|
||||
|
||||
await queryRunner.query(`ALTER TABLE smart_info DROP COLUMN IF EXISTS "clipEmbedding"`);
|
||||
}
|
||||
}
|
||||
|
||||
public async down(queryRunner: QueryRunner): Promise<void> {
|
||||
await queryRunner.query(`ALTER TABLE asset_faces ALTER COLUMN embedding TYPE real array`);
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import { DatabaseExtension } from 'src/domain/repositories/database.repository';
|
||||
import { vectorExt } from 'src/infra/database.config';
|
||||
import { MigrationInterface, QueryRunner } from 'typeorm';
|
||||
import { vectorExt } from '../database.config';
|
||||
import { DatabaseExtension } from '@app/domain/repositories/database.repository';
|
||||
|
||||
export class AddCLIPEmbeddingIndex1700713994428 implements MigrationInterface {
|
||||
name = 'AddCLIPEmbeddingIndex1700713994428';
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import { DatabaseExtension } from 'src/domain/repositories/database.repository';
|
||||
import { vectorExt } from 'src/infra/database.config';
|
||||
import { MigrationInterface, QueryRunner } from 'typeorm';
|
||||
import { vectorExt } from '../database.config';
|
||||
import { DatabaseExtension } from '@app/domain/repositories/database.repository';
|
||||
|
||||
export class AddFaceEmbeddingIndex1700714033632 implements MigrationInterface {
|
||||
name = 'AddFaceEmbeddingIndex1700714033632';
|
||||
|
||||
@@ -1,20 +1,18 @@
|
||||
import { IAccessRepository } from '@app/domain';
|
||||
import { InjectRepository } from '@nestjs/typeorm';
|
||||
import { IAccessRepository } from 'src/domain/repositories/access.repository';
|
||||
import { ActivityEntity } from 'src/infra/entities/activity.entity';
|
||||
import { AlbumEntity } from 'src/infra/entities/album.entity';
|
||||
import { AssetFaceEntity } from 'src/infra/entities/asset-face.entity';
|
||||
import { AssetEntity } from 'src/infra/entities/asset.entity';
|
||||
import { LibraryEntity } from 'src/infra/entities/library.entity';
|
||||
import { PartnerEntity } from 'src/infra/entities/partner.entity';
|
||||
import { PersonEntity } from 'src/infra/entities/person.entity';
|
||||
import { SharedLinkEntity } from 'src/infra/entities/shared-link.entity';
|
||||
import { UserTokenEntity } from 'src/infra/entities/user-token.entity';
|
||||
import { DummyValue, GenerateSql } from 'src/infra/infra.util';
|
||||
import { ChunkedSet } from 'src/infra/infra.utils';
|
||||
import { Instrumentation } from 'src/infra/instrumentation';
|
||||
import { Brackets, In, Repository } from 'typeorm';
|
||||
import {
|
||||
ActivityEntity,
|
||||
AlbumEntity,
|
||||
AssetEntity,
|
||||
AssetFaceEntity,
|
||||
LibraryEntity,
|
||||
PartnerEntity,
|
||||
PersonEntity,
|
||||
SharedLinkEntity,
|
||||
UserTokenEntity,
|
||||
} from '../entities';
|
||||
import { DummyValue, GenerateSql } from '../infra.util';
|
||||
import { ChunkedSet } from '../infra.utils';
|
||||
import { Instrumentation } from '../instrumentation';
|
||||
|
||||
type IActivityAccess = IAccessRepository['activity'];
|
||||
type IAlbumAccess = IAccessRepository['album'];
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
import { IActivityRepository } from '@app/domain';
|
||||
import { Injectable } from '@nestjs/common';
|
||||
import { InjectRepository } from '@nestjs/typeorm';
|
||||
import { IActivityRepository } from 'src/domain/repositories/activity.repository';
|
||||
import { ActivityEntity } from 'src/infra/entities/activity.entity';
|
||||
import { DummyValue, GenerateSql } from 'src/infra/infra.util';
|
||||
import { Instrumentation } from 'src/infra/instrumentation';
|
||||
import { IsNull, Repository } from 'typeorm';
|
||||
import { ActivityEntity } from '../entities/activity.entity';
|
||||
import { DummyValue, GenerateSql } from '../infra.util';
|
||||
import { Instrumentation } from '../instrumentation';
|
||||
|
||||
export interface ActivitySearch {
|
||||
albumId?: string;
|
||||
|
||||
@@ -1,14 +1,21 @@
|
||||
import { AlbumAsset, AlbumAssetCount, AlbumAssets, AlbumInfoOptions, IAlbumRepository } from '@app/domain';
|
||||
import { Injectable } from '@nestjs/common';
|
||||
import { InjectDataSource, InjectRepository } from '@nestjs/typeorm';
|
||||
import _ from 'lodash';
|
||||
import { setUnion } from 'src/domain/domain.util';
|
||||
import {
|
||||
AlbumAsset,
|
||||
AlbumAssetCount,
|
||||
AlbumAssets,
|
||||
AlbumInfoOptions,
|
||||
IAlbumRepository,
|
||||
} from 'src/domain/repositories/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 { DATABASE_PARAMETER_CHUNK_SIZE, DummyValue, GenerateSql } from 'src/infra/infra.util';
|
||||
import { Chunked, ChunkedArray } from 'src/infra/infra.utils';
|
||||
import { Instrumentation } from 'src/infra/instrumentation';
|
||||
import { DataSource, FindOptionsOrder, FindOptionsRelations, In, IsNull, Not, Repository } from 'typeorm';
|
||||
import { setUnion } from '../../domain/domain.util';
|
||||
import { dataSource } from '../database.config';
|
||||
import { AlbumEntity, AssetEntity } from '../entities';
|
||||
import { DATABASE_PARAMETER_CHUNK_SIZE, DummyValue, GenerateSql } from '../infra.util';
|
||||
import { Chunked, ChunkedArray } from '../infra.utils';
|
||||
import { Instrumentation } from '../instrumentation';
|
||||
|
||||
@Instrumentation()
|
||||
@Injectable()
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
import { IKeyRepository } from '@app/domain';
|
||||
import { Injectable } from '@nestjs/common';
|
||||
import { InjectRepository } from '@nestjs/typeorm';
|
||||
import { IKeyRepository } from 'src/domain/repositories/api-key.repository';
|
||||
import { APIKeyEntity } from 'src/infra/entities/api-key.entity';
|
||||
import { DummyValue, GenerateSql } from 'src/infra/infra.util';
|
||||
import { Instrumentation } from 'src/infra/instrumentation';
|
||||
import { Repository } from 'typeorm';
|
||||
import { APIKeyEntity } from '../entities';
|
||||
import { DummyValue, GenerateSql } from '../infra.util';
|
||||
import { Instrumentation } from '../instrumentation';
|
||||
|
||||
@Instrumentation()
|
||||
@Injectable()
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
import { IAssetStackRepository } from '@app/domain';
|
||||
import { Injectable } from '@nestjs/common';
|
||||
import { InjectRepository } from '@nestjs/typeorm';
|
||||
import { IAssetStackRepository } from 'src/domain/repositories/asset-stack.repository';
|
||||
import { AssetStackEntity } from 'src/infra/entities/asset-stack.entity';
|
||||
import { Instrumentation } from 'src/infra/instrumentation';
|
||||
import { Repository } from 'typeorm';
|
||||
import { AssetStackEntity } from '../entities';
|
||||
import { Instrumentation } from '../instrumentation';
|
||||
|
||||
@Instrumentation()
|
||||
@Injectable()
|
||||
|
||||
@@ -1,9 +1,13 @@
|
||||
import { Injectable } from '@nestjs/common';
|
||||
import { InjectRepository } from '@nestjs/typeorm';
|
||||
import { DateTime } from 'luxon';
|
||||
import path from 'node:path';
|
||||
import { Paginated, PaginationMode, PaginationOptions } from 'src/domain/domain.util';
|
||||
import {
|
||||
AssetBuilderOptions,
|
||||
AssetCreate,
|
||||
AssetExploreFieldOptions,
|
||||
AssetPathEntity,
|
||||
AssetSearchOptions,
|
||||
AssetStats,
|
||||
AssetStatsOptions,
|
||||
AssetUpdateAllOptions,
|
||||
@@ -14,20 +18,28 @@ import {
|
||||
MapMarkerSearchOptions,
|
||||
MetadataSearchOptions,
|
||||
MonthDay,
|
||||
Paginated,
|
||||
PaginationMode,
|
||||
PaginationOptions,
|
||||
SearchExploreItem,
|
||||
TimeBucketItem,
|
||||
TimeBucketOptions,
|
||||
TimeBucketSize,
|
||||
WithProperty,
|
||||
WithoutProperty,
|
||||
} from '@app/domain';
|
||||
import { Injectable } from '@nestjs/common';
|
||||
import { InjectRepository } from '@nestjs/typeorm';
|
||||
import { DateTime } from 'luxon';
|
||||
import path from 'node:path';
|
||||
} from 'src/domain/repositories/asset.repository';
|
||||
import { AssetSearchOptions, SearchExploreItem } from 'src/domain/repositories/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 { DummyValue, GenerateSql } from 'src/infra/infra.util';
|
||||
import {
|
||||
Chunked,
|
||||
ChunkedArray,
|
||||
OptionalBetween,
|
||||
paginate,
|
||||
paginatedBuilder,
|
||||
searchAssetBuilder,
|
||||
} from 'src/infra/infra.utils';
|
||||
import { Instrumentation } from 'src/infra/instrumentation';
|
||||
import {
|
||||
Brackets,
|
||||
FindOptionsRelations,
|
||||
@@ -38,10 +50,6 @@ import {
|
||||
Not,
|
||||
Repository,
|
||||
} from 'typeorm';
|
||||
import { AssetEntity, AssetJobStatusEntity, AssetOrder, AssetType, ExifEntity, SmartInfoEntity } from '../entities';
|
||||
import { DummyValue, GenerateSql } from '../infra.util';
|
||||
import { Chunked, ChunkedArray, OptionalBetween, paginate, paginatedBuilder, searchAssetBuilder } from '../infra.utils';
|
||||
import { Instrumentation } from '../instrumentation';
|
||||
|
||||
const truncateMap: Record<TimeBucketSize, string> = {
|
||||
[TimeBucketSize.DAY]: 'day',
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
import { AuditSearch, IAuditRepository } from '@app/domain';
|
||||
import { InjectRepository } from '@nestjs/typeorm';
|
||||
import { AuditSearch, IAuditRepository } from 'src/domain/repositories/audit.repository';
|
||||
import { AuditEntity } from 'src/infra/entities/audit.entity';
|
||||
import { Instrumentation } from 'src/infra/instrumentation';
|
||||
import { LessThan, MoreThan, Repository } from 'typeorm';
|
||||
import { AuditEntity } from '../entities';
|
||||
import { Instrumentation } from '../instrumentation';
|
||||
|
||||
@Instrumentation()
|
||||
export class AuditRepository implements IAuditRepository {
|
||||
|
||||
@@ -1,13 +1,3 @@
|
||||
import {
|
||||
AuthService,
|
||||
ClientEvent,
|
||||
ICommunicationRepository,
|
||||
InternalEventMap,
|
||||
OnConnectCallback,
|
||||
OnServerEventCallback,
|
||||
ServerEvent,
|
||||
} from '@app/domain';
|
||||
import { ImmichLogger } from '@app/infra/logger';
|
||||
import { EventEmitter2 } from '@nestjs/event-emitter';
|
||||
import {
|
||||
OnGatewayConnection,
|
||||
@@ -17,7 +7,17 @@ import {
|
||||
WebSocketServer,
|
||||
} from '@nestjs/websockets';
|
||||
import { Server, Socket } from 'socket.io';
|
||||
import { Instrumentation } from '../instrumentation';
|
||||
import { AuthService } from 'src/domain/auth/auth.service';
|
||||
import {
|
||||
ClientEvent,
|
||||
ICommunicationRepository,
|
||||
InternalEventMap,
|
||||
OnConnectCallback,
|
||||
OnServerEventCallback,
|
||||
ServerEvent,
|
||||
} from 'src/domain/repositories/communication.repository';
|
||||
import { Instrumentation } from 'src/infra/instrumentation';
|
||||
import { ImmichLogger } from 'src/infra/logger';
|
||||
|
||||
@Instrumentation()
|
||||
@WebSocketGateway({
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
import { ICryptoRepository } from '@app/domain';
|
||||
import { Injectable } from '@nestjs/common';
|
||||
import { compareSync, hash } from 'bcrypt';
|
||||
import { createHash, randomBytes, randomUUID } from 'node:crypto';
|
||||
import { createReadStream } from 'node:fs';
|
||||
import { Instrumentation } from '../instrumentation';
|
||||
import { ICryptoRepository } from 'src/domain/repositories/crypto.repository';
|
||||
import { Instrumentation } from 'src/infra/instrumentation';
|
||||
|
||||
@Instrumentation()
|
||||
@Injectable()
|
||||
|
||||
@@ -1,3 +1,7 @@
|
||||
import { Injectable } from '@nestjs/common';
|
||||
import { InjectDataSource } from '@nestjs/typeorm';
|
||||
import AsyncLock from 'async-lock';
|
||||
import { Version, VersionType } from 'src/domain/domain.constant';
|
||||
import {
|
||||
DatabaseExtension,
|
||||
DatabaseLock,
|
||||
@@ -5,18 +9,13 @@ import {
|
||||
VectorExtension,
|
||||
VectorIndex,
|
||||
VectorUpdateResult,
|
||||
Version,
|
||||
VersionType,
|
||||
extName,
|
||||
} from '@app/domain';
|
||||
import { vectorExt } from '@app/infra/database.config';
|
||||
import { Injectable } from '@nestjs/common';
|
||||
import { InjectDataSource } from '@nestjs/typeorm';
|
||||
import AsyncLock from 'async-lock';
|
||||
} from 'src/domain/repositories/database.repository';
|
||||
import { vectorExt } from 'src/infra/database.config';
|
||||
import { isValidInteger } from 'src/infra/infra.utils';
|
||||
import { Instrumentation } from 'src/infra/instrumentation';
|
||||
import { ImmichLogger } from 'src/infra/logger';
|
||||
import { DataSource, EntityManager, QueryRunner } from 'typeorm';
|
||||
import { isValidInteger } from '../infra.utils';
|
||||
import { Instrumentation } from '../instrumentation';
|
||||
import { ImmichLogger } from '../logger';
|
||||
|
||||
@Instrumentation()
|
||||
@Injectable()
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import { CrawlOptionsDto } from '@app/domain';
|
||||
import mockfs from 'mock-fs';
|
||||
import { FilesystemProvider } from './filesystem.provider';
|
||||
import { CrawlOptionsDto } from 'src/domain/library/library.dto';
|
||||
import { FilesystemProvider } from 'src/infra/repositories/filesystem.provider';
|
||||
|
||||
interface Test {
|
||||
test: string;
|
||||
|
||||
@@ -1,21 +1,21 @@
|
||||
import {
|
||||
CrawlOptionsDto,
|
||||
DiskUsage,
|
||||
IStorageRepository,
|
||||
ImmichReadStream,
|
||||
ImmichZipStream,
|
||||
StorageEventType,
|
||||
WatchEvents,
|
||||
mimeTypes,
|
||||
} from '@app/domain';
|
||||
import { ImmichLogger } from '@app/infra/logger';
|
||||
import archiver from 'archiver';
|
||||
import chokidar, { WatchOptions } from 'chokidar';
|
||||
import { glob, globStream } from 'fast-glob';
|
||||
import { constants, createReadStream, existsSync, mkdirSync } from 'node:fs';
|
||||
import fs from 'node:fs/promises';
|
||||
import path from 'node:path';
|
||||
import { Instrumentation } from '../instrumentation';
|
||||
import { mimeTypes } from 'src/domain/domain.constant';
|
||||
import { CrawlOptionsDto } from 'src/domain/library/library.dto';
|
||||
import {
|
||||
DiskUsage,
|
||||
IStorageRepository,
|
||||
ImmichReadStream,
|
||||
ImmichZipStream,
|
||||
StorageEventType,
|
||||
WatchEvents,
|
||||
} from 'src/domain/repositories/storage.repository';
|
||||
import { Instrumentation } from 'src/infra/instrumentation';
|
||||
import { ImmichLogger } from 'src/infra/logger';
|
||||
|
||||
@Instrumentation()
|
||||
export class FilesystemProvider implements IStorageRepository {
|
||||
|
||||
@@ -1,27 +0,0 @@
|
||||
export * from './access.repository';
|
||||
export * from './activity.repository';
|
||||
export * from './album.repository';
|
||||
export * from './api-key.repository';
|
||||
export * from './asset-stack.repository';
|
||||
export * from './asset.repository';
|
||||
export * from './audit.repository';
|
||||
export * from './communication.repository';
|
||||
export * from './crypto.repository';
|
||||
export * from './database.repository';
|
||||
export * from './filesystem.provider';
|
||||
export * from './job.repository';
|
||||
export * from './library.repository';
|
||||
export * from './machine-learning.repository';
|
||||
export * from './media.repository';
|
||||
export * from './metadata.repository';
|
||||
export * from './move.repository';
|
||||
export * from './partner.repository';
|
||||
export * from './person.repository';
|
||||
export * from './search.repository';
|
||||
export * from './server-info.repository';
|
||||
export * from './shared-link.repository';
|
||||
export * from './system-config.repository';
|
||||
export * from './system-metadata.repository';
|
||||
export * from './tag.repository';
|
||||
export * from './user-token.repository';
|
||||
export * from './user.repository';
|
||||
@@ -1,14 +1,3 @@
|
||||
import {
|
||||
IJobRepository,
|
||||
JobCounts,
|
||||
JobItem,
|
||||
JobName,
|
||||
JOBS_TO_QUEUE,
|
||||
QueueCleanType,
|
||||
QueueName,
|
||||
QueueStatus,
|
||||
} from '@app/domain';
|
||||
import { ImmichLogger } from '@app/infra/logger';
|
||||
import { getQueueToken } from '@nestjs/bullmq';
|
||||
import { Injectable } from '@nestjs/common';
|
||||
import { ModuleRef } from '@nestjs/core';
|
||||
@@ -16,8 +5,17 @@ import { SchedulerRegistry } from '@nestjs/schedule';
|
||||
import { Job, JobsOptions, Processor, Queue, Worker, WorkerOptions } from 'bullmq';
|
||||
import { CronJob, CronTime } from 'cron';
|
||||
import { setTimeout } from 'node:timers/promises';
|
||||
import { bullConfig } from '../infra.config';
|
||||
import { Instrumentation } from '../instrumentation';
|
||||
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 { bullConfig } from 'src/infra/infra.config';
|
||||
import { Instrumentation } from 'src/infra/instrumentation';
|
||||
import { ImmichLogger } from 'src/infra/logger';
|
||||
|
||||
@Instrumentation()
|
||||
@Injectable()
|
||||
|
||||
@@ -1,11 +1,12 @@
|
||||
import { ILibraryRepository, LibraryStatsResponseDto } from '@app/domain';
|
||||
import { Injectable } from '@nestjs/common';
|
||||
import { InjectRepository } from '@nestjs/typeorm';
|
||||
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 { DummyValue, GenerateSql } from 'src/infra/infra.util';
|
||||
import { Instrumentation } from 'src/infra/instrumentation';
|
||||
import { IsNull, Not } from 'typeorm';
|
||||
import { Repository } from 'typeorm/repository/Repository.js';
|
||||
import { LibraryEntity, LibraryType } from '../entities';
|
||||
import { DummyValue, GenerateSql } from '../infra.util';
|
||||
import { Instrumentation } from '../instrumentation';
|
||||
|
||||
@Instrumentation()
|
||||
@Injectable()
|
||||
|
||||
@@ -1,17 +1,15 @@
|
||||
import { Injectable } from '@nestjs/common';
|
||||
import { readFile } from 'node:fs/promises';
|
||||
import {
|
||||
CLIPConfig,
|
||||
CLIPMode,
|
||||
DetectFaceResult,
|
||||
IMachineLearningRepository,
|
||||
ModelConfig,
|
||||
ModelType,
|
||||
RecognitionConfig,
|
||||
TextModelInput,
|
||||
VisionModelInput,
|
||||
} from '@app/domain';
|
||||
import { Injectable } from '@nestjs/common';
|
||||
import { readFile } from 'node:fs/promises';
|
||||
import { Instrumentation } from '../instrumentation';
|
||||
} from 'src/domain/repositories/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';
|
||||
|
||||
|
||||
@@ -1,19 +1,19 @@
|
||||
import ffmpeg, { FfprobeData } from 'fluent-ffmpeg';
|
||||
import fs from 'node:fs/promises';
|
||||
import { Writable } from 'node:stream';
|
||||
import { promisify } from 'node:util';
|
||||
import sharp from 'sharp';
|
||||
import { handlePromiseError } from 'src/domain/domain.util';
|
||||
import {
|
||||
CropOptions,
|
||||
IMediaRepository,
|
||||
ResizeOptions,
|
||||
TranscodeOptions,
|
||||
VideoInfo,
|
||||
handlePromiseError,
|
||||
} from '@app/domain';
|
||||
import { Colorspace } from '@app/infra/entities';
|
||||
import { ImmichLogger } from '@app/infra/logger';
|
||||
import ffmpeg, { FfprobeData } from 'fluent-ffmpeg';
|
||||
import fs from 'node:fs/promises';
|
||||
import { Writable } from 'node:stream';
|
||||
import { promisify } from 'node:util';
|
||||
import sharp from 'sharp';
|
||||
import { Instrumentation } from '../instrumentation';
|
||||
} from 'src/domain/repositories/media.repository';
|
||||
import { Colorspace } from 'src/infra/entities/system-config.entity';
|
||||
import { Instrumentation } from 'src/infra/instrumentation';
|
||||
import { ImmichLogger } from 'src/infra/logger';
|
||||
|
||||
const probe = promisify<string, FfprobeData>(ffmpeg.ffprobe);
|
||||
sharp.concurrency(0);
|
||||
|
||||
@@ -1,29 +1,33 @@
|
||||
import { Inject } from '@nestjs/common';
|
||||
import { InjectDataSource, InjectRepository } from '@nestjs/typeorm';
|
||||
import { DefaultReadTaskOptions, Tags, exiftool } from 'exiftool-vendored';
|
||||
import geotz from 'geo-tz';
|
||||
import { getName } from 'i18n-iso-countries';
|
||||
import { createReadStream, existsSync } from 'node:fs';
|
||||
import { readFile } from 'node:fs/promises';
|
||||
import readLine from 'node:readline';
|
||||
import {
|
||||
citiesFile,
|
||||
geodataAdmin1Path,
|
||||
geodataAdmin2Path,
|
||||
geodataCities500Path,
|
||||
geodataDatePath,
|
||||
} from 'src/domain/domain.constant';
|
||||
import {
|
||||
GeoPoint,
|
||||
IMetadataRepository,
|
||||
ImmichTags,
|
||||
ISystemMetadataRepository,
|
||||
ReverseGeocodeResult,
|
||||
} from '@app/domain';
|
||||
import { ExifEntity, GeodataPlacesEntity, SystemMetadataKey } from '@app/infra/entities';
|
||||
import { ImmichLogger } from '@app/infra/logger';
|
||||
import { Inject } from '@nestjs/common';
|
||||
import { InjectDataSource, InjectRepository } from '@nestjs/typeorm';
|
||||
import { DefaultReadTaskOptions, exiftool, Tags } from 'exiftool-vendored';
|
||||
import * as geotz from 'geo-tz';
|
||||
import { getName } from 'i18n-iso-countries';
|
||||
import { createReadStream, existsSync } from 'node:fs';
|
||||
import { readFile } from 'node:fs/promises';
|
||||
import * as readLine from 'node:readline';
|
||||
} from 'src/domain/repositories/metadata.repository';
|
||||
import { ISystemMetadataRepository } from 'src/domain/repositories/system-metadata.repository';
|
||||
import { ExifEntity } from 'src/infra/entities/exif.entity';
|
||||
import { GeodataPlacesEntity } from 'src/infra/entities/geodata-places.entity';
|
||||
import { SystemMetadataKey } from 'src/infra/entities/system-metadata.entity';
|
||||
import { DummyValue, GenerateSql } from 'src/infra/infra.util';
|
||||
import { Instrumentation } from 'src/infra/instrumentation';
|
||||
import { ImmichLogger } from 'src/infra/logger';
|
||||
import { DataSource, QueryRunner, Repository } from 'typeorm';
|
||||
import { QueryDeepPartialEntity } from 'typeorm/query-builder/QueryPartialEntity.js';
|
||||
import { DummyValue, GenerateSql } from '../infra.util';
|
||||
import { Instrumentation } from '../instrumentation';
|
||||
|
||||
@Instrumentation()
|
||||
export class MetadataRepository implements IMetadataRepository {
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
import { IMoveRepository, MoveCreate } from '@app/domain';
|
||||
import { Injectable } from '@nestjs/common';
|
||||
import { InjectRepository } from '@nestjs/typeorm';
|
||||
import { IMoveRepository, MoveCreate } from 'src/domain/repositories/move.repository';
|
||||
import { MoveEntity, PathType } from 'src/infra/entities/move.entity';
|
||||
import { DummyValue, GenerateSql } from 'src/infra/infra.util';
|
||||
import { Instrumentation } from 'src/infra/instrumentation';
|
||||
import { Repository } from 'typeorm';
|
||||
import { MoveEntity, PathType } from '../entities';
|
||||
import { DummyValue, GenerateSql } from '../infra.util';
|
||||
import { Instrumentation } from '../instrumentation';
|
||||
|
||||
@Instrumentation()
|
||||
@Injectable()
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
import { IPartnerRepository, PartnerIds } from '@app/domain';
|
||||
import { Injectable } from '@nestjs/common';
|
||||
import { InjectRepository } from '@nestjs/typeorm';
|
||||
import { IPartnerRepository, PartnerIds } from 'src/domain/repositories/partner.repository';
|
||||
import { PartnerEntity } from 'src/infra/entities/partner.entity';
|
||||
import { Instrumentation } from 'src/infra/instrumentation';
|
||||
import { DeepPartial, Repository } from 'typeorm';
|
||||
import { PartnerEntity } from '../entities';
|
||||
import { Instrumentation } from '../instrumentation';
|
||||
|
||||
@Instrumentation()
|
||||
@Injectable()
|
||||
|
||||
@@ -1,21 +1,22 @@
|
||||
import { InjectRepository } from '@nestjs/typeorm';
|
||||
import _ from 'lodash';
|
||||
import { Paginated, PaginationOptions } from 'src/domain/domain.util';
|
||||
import {
|
||||
AssetFaceId,
|
||||
IPersonRepository,
|
||||
Paginated,
|
||||
PaginationOptions,
|
||||
PeopleStatistics,
|
||||
PersonNameSearchOptions,
|
||||
PersonSearchOptions,
|
||||
PersonStatistics,
|
||||
UpdateFacesData,
|
||||
} from '@app/domain';
|
||||
import { InjectRepository } from '@nestjs/typeorm';
|
||||
import _ from 'lodash';
|
||||
} from 'src/domain/repositories/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 { DummyValue, GenerateSql } from 'src/infra/infra.util';
|
||||
import { ChunkedArray, asVector, paginate } from 'src/infra/infra.utils';
|
||||
import { Instrumentation } from 'src/infra/instrumentation';
|
||||
import { FindManyOptions, FindOptionsRelations, FindOptionsSelect, In, Repository } from 'typeorm';
|
||||
import { AssetEntity, AssetFaceEntity, PersonEntity } from '../entities';
|
||||
import { DummyValue, GenerateSql } from '../infra.util';
|
||||
import { ChunkedArray, asVector, paginate } from '../infra.utils';
|
||||
import { Instrumentation } from '../instrumentation';
|
||||
|
||||
@Instrumentation()
|
||||
export class PersonRepository implements IPersonRepository {
|
||||
|
||||
@@ -1,33 +1,28 @@
|
||||
import { Injectable } from '@nestjs/common';
|
||||
import { InjectRepository } from '@nestjs/typeorm';
|
||||
import { Paginated, PaginationMode, PaginationResult } from 'src/domain/domain.util';
|
||||
import { DatabaseExtension } from 'src/domain/repositories/database.repository';
|
||||
import {
|
||||
AssetSearchOptions,
|
||||
DatabaseExtension,
|
||||
Embedding,
|
||||
FaceEmbeddingSearch,
|
||||
FaceSearchResult,
|
||||
ISearchRepository,
|
||||
Paginated,
|
||||
PaginationMode,
|
||||
PaginationResult,
|
||||
SearchPaginationOptions,
|
||||
SmartSearchOptions,
|
||||
} from '@app/domain';
|
||||
import { getCLIPModelInfo } from '@app/domain/smart-info/smart-info.constant';
|
||||
import {
|
||||
AssetEntity,
|
||||
AssetFaceEntity,
|
||||
AssetType,
|
||||
GeodataPlacesEntity,
|
||||
SmartInfoEntity,
|
||||
SmartSearchEntity,
|
||||
} from '@app/infra/entities';
|
||||
import { ImmichLogger } from '@app/infra/logger';
|
||||
import { Injectable } from '@nestjs/common';
|
||||
import { InjectRepository } from '@nestjs/typeorm';
|
||||
} from 'src/domain/repositories/search.repository';
|
||||
import { getCLIPModelInfo } from 'src/domain/smart-info/smart-info.constant';
|
||||
import { vectorExt } from 'src/infra/database.config';
|
||||
import { AssetFaceEntity } from 'src/infra/entities/asset-face.entity';
|
||||
import { AssetEntity, AssetType } from 'src/infra/entities/asset.entity';
|
||||
import { GeodataPlacesEntity } from 'src/infra/entities/geodata-places.entity';
|
||||
import { SmartInfoEntity } from 'src/infra/entities/smart-info.entity';
|
||||
import { SmartSearchEntity } from 'src/infra/entities/smart-search.entity';
|
||||
import { DummyValue, GenerateSql } from 'src/infra/infra.util';
|
||||
import { asVector, isValidInteger, paginatedBuilder, searchAssetBuilder } from 'src/infra/infra.utils';
|
||||
import { Instrumentation } from 'src/infra/instrumentation';
|
||||
import { ImmichLogger } from 'src/infra/logger';
|
||||
import { Repository, SelectQueryBuilder } from 'typeorm';
|
||||
import { vectorExt } from '../database.config';
|
||||
import { DummyValue, GenerateSql } from '../infra.util';
|
||||
import { asVector, isValidInteger, paginatedBuilder, searchAssetBuilder } from '../infra.utils';
|
||||
import { Instrumentation } from '../instrumentation';
|
||||
|
||||
@Instrumentation()
|
||||
@Injectable()
|
||||
@@ -335,7 +330,7 @@ WITH RECURSIVE cte AS (
|
||||
)
|
||||
|
||||
UNION ALL
|
||||
|
||||
|
||||
SELECT l.city, l."assetId"
|
||||
FROM cte c
|
||||
, LATERAL (
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import { GitHubRelease, IServerInfoRepository } from '@app/domain';
|
||||
import { Injectable } from '@nestjs/common';
|
||||
import { Instrumentation } from '../instrumentation';
|
||||
import { GitHubRelease, IServerInfoRepository } from 'src/domain/repositories/server-info.repository';
|
||||
import { Instrumentation } from 'src/infra/instrumentation';
|
||||
|
||||
@Instrumentation()
|
||||
@Injectable()
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
import { ISharedLinkRepository } from '@app/domain';
|
||||
import { Injectable } from '@nestjs/common';
|
||||
import { InjectRepository } from '@nestjs/typeorm';
|
||||
import { ISharedLinkRepository } from 'src/domain/repositories/shared-link.repository';
|
||||
import { SharedLinkEntity } from 'src/infra/entities/shared-link.entity';
|
||||
import { DummyValue, GenerateSql } from 'src/infra/infra.util';
|
||||
import { Instrumentation } from 'src/infra/instrumentation';
|
||||
import { Repository } from 'typeorm';
|
||||
import { SharedLinkEntity } from '../entities';
|
||||
import { DummyValue, GenerateSql } from '../infra.util';
|
||||
import { Instrumentation } from '../instrumentation';
|
||||
|
||||
@Instrumentation()
|
||||
@Injectable()
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
import { ISystemConfigRepository } from '@app/domain';
|
||||
import { InjectRepository } from '@nestjs/typeorm';
|
||||
import { readFile } from 'node:fs/promises';
|
||||
import { ISystemConfigRepository } from 'src/domain/repositories/system-config.repository';
|
||||
import { SystemConfigEntity } from 'src/infra/entities/system-config.entity';
|
||||
import { DummyValue, GenerateSql } from 'src/infra/infra.util';
|
||||
import { Chunked } from 'src/infra/infra.utils';
|
||||
import { Instrumentation } from 'src/infra/instrumentation';
|
||||
import { In, Repository } from 'typeorm';
|
||||
import { SystemConfigEntity } from '../entities';
|
||||
import { DummyValue, GenerateSql } from '../infra.util';
|
||||
import { Chunked } from '../infra.utils';
|
||||
import { Instrumentation } from '../instrumentation';
|
||||
|
||||
@Instrumentation()
|
||||
export class SystemConfigRepository implements ISystemConfigRepository {
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
import { ISystemMetadataRepository } from '@app/domain/repositories/system-metadata.repository';
|
||||
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 { Instrumentation } from 'src/infra/instrumentation';
|
||||
import { Repository } from 'typeorm';
|
||||
import { SystemMetadata, SystemMetadataEntity } from '../entities';
|
||||
import { Instrumentation } from '../instrumentation';
|
||||
|
||||
@Instrumentation()
|
||||
export class SystemMetadataRepository implements ISystemMetadataRepository {
|
||||
|
||||
@@ -1,9 +1,10 @@
|
||||
import { ITagRepository } from '@app/domain';
|
||||
import { AssetEntity, TagEntity } from '@app/infra/entities';
|
||||
import { Injectable } from '@nestjs/common';
|
||||
import { InjectRepository } from '@nestjs/typeorm';
|
||||
import { ITagRepository } from 'src/domain/repositories/tag.repository';
|
||||
import { AssetEntity } from 'src/infra/entities/asset.entity';
|
||||
import { TagEntity } from 'src/infra/entities/tag.entity';
|
||||
import { Instrumentation } from 'src/infra/instrumentation';
|
||||
import { Repository } from 'typeorm';
|
||||
import { Instrumentation } from '../instrumentation';
|
||||
|
||||
@Instrumentation()
|
||||
@Injectable()
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
import { IUserTokenRepository } from '@app/domain';
|
||||
import { Injectable } from '@nestjs/common';
|
||||
import { InjectRepository } from '@nestjs/typeorm';
|
||||
import { IUserTokenRepository } from 'src/domain/repositories/user-token.repository';
|
||||
import { UserTokenEntity } from 'src/infra/entities/user-token.entity';
|
||||
import { DummyValue, GenerateSql } from 'src/infra/infra.util';
|
||||
import { Instrumentation } from 'src/infra/instrumentation';
|
||||
import { Repository } from 'typeorm';
|
||||
import { UserTokenEntity } from '../entities';
|
||||
import { DummyValue, GenerateSql } from '../infra.util';
|
||||
import { Instrumentation } from '../instrumentation';
|
||||
|
||||
@Instrumentation()
|
||||
@Injectable()
|
||||
|
||||
@@ -1,10 +1,16 @@
|
||||
import { IUserRepository, UserFindOptions, UserListFilter, UserStatsQueryResponse } from '@app/domain';
|
||||
import { Injectable } from '@nestjs/common';
|
||||
import { InjectRepository } from '@nestjs/typeorm';
|
||||
import {
|
||||
IUserRepository,
|
||||
UserFindOptions,
|
||||
UserListFilter,
|
||||
UserStatsQueryResponse,
|
||||
} from 'src/domain/repositories/user.repository';
|
||||
import { AssetEntity } from 'src/infra/entities/asset.entity';
|
||||
import { UserEntity } from 'src/infra/entities/user.entity';
|
||||
import { DummyValue, GenerateSql } from 'src/infra/infra.util';
|
||||
import { Instrumentation } from 'src/infra/instrumentation';
|
||||
import { IsNull, Not, Repository } from 'typeorm';
|
||||
import { AssetEntity, UserEntity } from '../entities';
|
||||
import { DummyValue, GenerateSql } from '../infra.util';
|
||||
import { Instrumentation } from '../instrumentation';
|
||||
|
||||
@Instrumentation()
|
||||
@Injectable()
|
||||
|
||||
@@ -1,33 +1,31 @@
|
||||
#!/usr/bin/env node
|
||||
import { ISystemConfigRepository } from '@app/domain';
|
||||
import { INestApplication } from '@nestjs/common';
|
||||
import { Reflector } from '@nestjs/core';
|
||||
import { Test } from '@nestjs/testing';
|
||||
import { TypeOrmModule } from '@nestjs/typeorm';
|
||||
import { mkdir, rm, writeFile } from 'node:fs/promises';
|
||||
import { join } from 'node:path';
|
||||
import { databaseConfig } from '../database.config';
|
||||
import { databaseEntities } from '../entities';
|
||||
import { GENERATE_SQL_KEY, GenerateSqlQueries } from '../infra.util';
|
||||
import {
|
||||
AccessRepository,
|
||||
AlbumRepository,
|
||||
ApiKeyRepository,
|
||||
AssetRepository,
|
||||
AuditRepository,
|
||||
LibraryRepository,
|
||||
MoveRepository,
|
||||
PartnerRepository,
|
||||
PersonRepository,
|
||||
SearchRepository,
|
||||
SharedLinkRepository,
|
||||
SystemConfigRepository,
|
||||
SystemMetadataRepository,
|
||||
TagRepository,
|
||||
UserRepository,
|
||||
UserTokenRepository,
|
||||
} from '../repositories';
|
||||
import { SqlLogger } from './sql.logger';
|
||||
import { ISystemConfigRepository } from 'src/domain/repositories/system-config.repository';
|
||||
import { databaseConfig } from 'src/infra/database.config';
|
||||
import { databaseEntities } from 'src/infra/entities';
|
||||
import { GENERATE_SQL_KEY, GenerateSqlQueries } from 'src/infra/infra.util';
|
||||
import { AccessRepository } from 'src/infra/repositories/access.repository';
|
||||
import { AlbumRepository } from 'src/infra/repositories/album.repository';
|
||||
import { ApiKeyRepository } from 'src/infra/repositories/api-key.repository';
|
||||
import { AssetRepository } from 'src/infra/repositories/asset.repository';
|
||||
import { AuditRepository } from 'src/infra/repositories/audit.repository';
|
||||
import { LibraryRepository } from 'src/infra/repositories/library.repository';
|
||||
import { MoveRepository } from 'src/infra/repositories/move.repository';
|
||||
import { PartnerRepository } from 'src/infra/repositories/partner.repository';
|
||||
import { PersonRepository } from 'src/infra/repositories/person.repository';
|
||||
import { SearchRepository } from 'src/infra/repositories/search.repository';
|
||||
import { SharedLinkRepository } from 'src/infra/repositories/shared-link.repository';
|
||||
import { SystemConfigRepository } from 'src/infra/repositories/system-config.repository';
|
||||
import { SystemMetadataRepository } from 'src/infra/repositories/system-metadata.repository';
|
||||
import { TagRepository } from 'src/infra/repositories/tag.repository';
|
||||
import { UserTokenRepository } from 'src/infra/repositories/user-token.repository';
|
||||
import { UserRepository } from 'src/infra/repositories/user.repository';
|
||||
import { SqlLogger } from 'src/infra/sql-generator/sql.logger';
|
||||
|
||||
const reflector = new Reflector();
|
||||
const repositories = [
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
import { AlbumEntity } from 'src/infra/entities/album.entity';
|
||||
import { AssetEntity } from 'src/infra/entities/asset.entity';
|
||||
import { AuditEntity, DatabaseAction, EntityType } from 'src/infra/entities/audit.entity';
|
||||
import { EntitySubscriberInterface, EventSubscriber, RemoveEvent } from 'typeorm';
|
||||
import { AlbumEntity, AssetEntity, AuditEntity, DatabaseAction, EntityType } from '../entities';
|
||||
|
||||
@EventSubscriber()
|
||||
export class AuditSubscriber implements EntitySubscriberInterface<AssetEntity | AlbumEntity> {
|
||||
|
||||
Reference in New Issue
Block a user