mirror of
https://github.com/immich-app/immich.git
synced 2025-05-30 19:54:52 -04:00
parent
25c9b779e4
commit
4b39d37cae
@ -1,233 +1,28 @@
|
|||||||
import { BullModule } from '@nestjs/bullmq';
|
import { BullModule } from '@nestjs/bullmq';
|
||||||
import { Module, OnModuleInit, Provider, ValidationPipe } from '@nestjs/common';
|
import { Module, OnModuleInit, ValidationPipe } from '@nestjs/common';
|
||||||
import { ConfigModule } from '@nestjs/config';
|
import { ConfigModule } from '@nestjs/config';
|
||||||
import { APP_GUARD, APP_INTERCEPTOR, APP_PIPE } from '@nestjs/core';
|
import { APP_GUARD, APP_INTERCEPTOR, APP_PIPE } from '@nestjs/core';
|
||||||
import { EventEmitterModule } from '@nestjs/event-emitter';
|
import { EventEmitterModule } from '@nestjs/event-emitter';
|
||||||
import { ScheduleModule, SchedulerRegistry } from '@nestjs/schedule';
|
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 { ListUsersCommand } from 'src/commands/list-users.command';
|
import { commands } from 'src/commands';
|
||||||
import { DisableOAuthLogin, EnableOAuthLogin } from 'src/commands/oauth-login';
|
|
||||||
import { DisablePasswordLoginCommand, EnablePasswordLoginCommand } from 'src/commands/password-login';
|
|
||||||
import { PromptPasswordQuestions, ResetAdminPasswordCommand } from 'src/commands/reset-admin-password.command';
|
|
||||||
import { bullConfig, bullQueues, immichAppConfig } from 'src/config';
|
import { bullConfig, bullQueues, immichAppConfig } from 'src/config';
|
||||||
import { ActivityController } from 'src/controllers/activity.controller';
|
import { controllers } from 'src/controllers';
|
||||||
import { AlbumController } from 'src/controllers/album.controller';
|
|
||||||
import { APIKeyController } from 'src/controllers/api-key.controller';
|
|
||||||
import { AppController } from 'src/controllers/app.controller';
|
|
||||||
import { AssetControllerV1 } from 'src/controllers/asset-v1.controller';
|
|
||||||
import { AssetController, AssetsController } from 'src/controllers/asset.controller';
|
|
||||||
import { AuditController } from 'src/controllers/audit.controller';
|
|
||||||
import { AuthController } from 'src/controllers/auth.controller';
|
|
||||||
import { DownloadController } from 'src/controllers/download.controller';
|
|
||||||
import { FaceController } from 'src/controllers/face.controller';
|
|
||||||
import { JobController } from 'src/controllers/job.controller';
|
|
||||||
import { LibraryController } from 'src/controllers/library.controller';
|
|
||||||
import { OAuthController } from 'src/controllers/oauth.controller';
|
|
||||||
import { PartnerController } from 'src/controllers/partner.controller';
|
|
||||||
import { PersonController } from 'src/controllers/person.controller';
|
|
||||||
import { SearchController } from 'src/controllers/search.controller';
|
|
||||||
import { ServerInfoController } from 'src/controllers/server-info.controller';
|
|
||||||
import { SharedLinkController } from 'src/controllers/shared-link.controller';
|
|
||||||
import { SystemConfigController } from 'src/controllers/system-config.controller';
|
|
||||||
import { TagController } from 'src/controllers/tag.controller';
|
|
||||||
import { TimelineController } from 'src/controllers/timeline.controller';
|
|
||||||
import { TrashController } from 'src/controllers/trash.controller';
|
|
||||||
import { UserController } from 'src/controllers/user.controller';
|
|
||||||
import { databaseConfig } from 'src/database.config';
|
import { databaseConfig } from 'src/database.config';
|
||||||
import { databaseEntities } from 'src/entities';
|
import { entities } from 'src/entities';
|
||||||
import { IAccessRepository } from 'src/interfaces/access.interface';
|
|
||||||
import { IActivityRepository } from 'src/interfaces/activity.interface';
|
|
||||||
import { IAlbumRepository } from 'src/interfaces/album.interface';
|
|
||||||
import { IKeyRepository } from 'src/interfaces/api-key.interface';
|
|
||||||
import { IAssetStackRepository } from 'src/interfaces/asset-stack.interface';
|
|
||||||
import { IAssetRepositoryV1 } from 'src/interfaces/asset-v1.interface';
|
|
||||||
import { IAssetRepository } from 'src/interfaces/asset.interface';
|
|
||||||
import { IAuditRepository } from 'src/interfaces/audit.interface';
|
|
||||||
import { ICryptoRepository } from 'src/interfaces/crypto.interface';
|
|
||||||
import { IDatabaseRepository } from 'src/interfaces/database.interface';
|
|
||||||
import { IEventRepository } from 'src/interfaces/event.interface';
|
|
||||||
import { IJobRepository } from 'src/interfaces/job.interface';
|
|
||||||
import { ILibraryRepository } from 'src/interfaces/library.interface';
|
|
||||||
import { IMachineLearningRepository } from 'src/interfaces/machine-learning.interface';
|
|
||||||
import { IMediaRepository } from 'src/interfaces/media.interface';
|
|
||||||
import { IMetadataRepository } from 'src/interfaces/metadata.interface';
|
|
||||||
import { IMetricRepository } from 'src/interfaces/metric.interface';
|
|
||||||
import { IMoveRepository } from 'src/interfaces/move.interface';
|
|
||||||
import { IPartnerRepository } from 'src/interfaces/partner.interface';
|
|
||||||
import { IPersonRepository } from 'src/interfaces/person.interface';
|
|
||||||
import { ISearchRepository } from 'src/interfaces/search.interface';
|
|
||||||
import { IServerInfoRepository } from 'src/interfaces/server-info.interface';
|
|
||||||
import { ISharedLinkRepository } from 'src/interfaces/shared-link.interface';
|
|
||||||
import { IStorageRepository } from 'src/interfaces/storage.interface';
|
|
||||||
import { ISystemConfigRepository } from 'src/interfaces/system-config.interface';
|
|
||||||
import { ISystemMetadataRepository } from 'src/interfaces/system-metadata.interface';
|
|
||||||
import { ITagRepository } from 'src/interfaces/tag.interface';
|
|
||||||
import { IUserTokenRepository } from 'src/interfaces/user-token.interface';
|
|
||||||
import { IUserRepository } from 'src/interfaces/user.interface';
|
|
||||||
import { AuthGuard } from 'src/middleware/auth.guard';
|
import { AuthGuard } from 'src/middleware/auth.guard';
|
||||||
import { ErrorInterceptor } from 'src/middleware/error.interceptor';
|
import { ErrorInterceptor } from 'src/middleware/error.interceptor';
|
||||||
import { FileUploadInterceptor } from 'src/middleware/file-upload.interceptor';
|
import { FileUploadInterceptor } from 'src/middleware/file-upload.interceptor';
|
||||||
import { AccessRepository } from 'src/repositories/access.repository';
|
import { repositories } from 'src/repositories';
|
||||||
import { ActivityRepository } from 'src/repositories/activity.repository';
|
import { services } from 'src/services';
|
||||||
import { AlbumRepository } from 'src/repositories/album.repository';
|
|
||||||
import { ApiKeyRepository } from 'src/repositories/api-key.repository';
|
|
||||||
import { AssetStackRepository } from 'src/repositories/asset-stack.repository';
|
|
||||||
import { AssetRepositoryV1 } from 'src/repositories/asset-v1.repository';
|
|
||||||
import { AssetRepository } from 'src/repositories/asset.repository';
|
|
||||||
import { AuditRepository } from 'src/repositories/audit.repository';
|
|
||||||
import { CryptoRepository } from 'src/repositories/crypto.repository';
|
|
||||||
import { DatabaseRepository } from 'src/repositories/database.repository';
|
|
||||||
import { EventRepository } from 'src/repositories/event.repository';
|
|
||||||
import { JobRepository } from 'src/repositories/job.repository';
|
|
||||||
import { LibraryRepository } from 'src/repositories/library.repository';
|
|
||||||
import { MachineLearningRepository } from 'src/repositories/machine-learning.repository';
|
|
||||||
import { MediaRepository } from 'src/repositories/media.repository';
|
|
||||||
import { MetadataRepository } from 'src/repositories/metadata.repository';
|
|
||||||
import { MetricRepository } from 'src/repositories/metric.repository';
|
|
||||||
import { MoveRepository } from 'src/repositories/move.repository';
|
|
||||||
import { PartnerRepository } from 'src/repositories/partner.repository';
|
|
||||||
import { PersonRepository } from 'src/repositories/person.repository';
|
|
||||||
import { SearchRepository } from 'src/repositories/search.repository';
|
|
||||||
import { ServerInfoRepository } from 'src/repositories/server-info.repository';
|
|
||||||
import { SharedLinkRepository } from 'src/repositories/shared-link.repository';
|
|
||||||
import { StorageRepository } from 'src/repositories/storage.repository';
|
|
||||||
import { SystemConfigRepository } from 'src/repositories/system-config.repository';
|
|
||||||
import { SystemMetadataRepository } from 'src/repositories/system-metadata.repository';
|
|
||||||
import { TagRepository } from 'src/repositories/tag.repository';
|
|
||||||
import { UserTokenRepository } from 'src/repositories/user-token.repository';
|
|
||||||
import { UserRepository } from 'src/repositories/user.repository';
|
|
||||||
import { ActivityService } from 'src/services/activity.service';
|
|
||||||
import { AlbumService } from 'src/services/album.service';
|
|
||||||
import { APIKeyService } from 'src/services/api-key.service';
|
|
||||||
import { ApiService } from 'src/services/api.service';
|
import { ApiService } from 'src/services/api.service';
|
||||||
import { AssetServiceV1 } from 'src/services/asset-v1.service';
|
|
||||||
import { AssetService } from 'src/services/asset.service';
|
|
||||||
import { AuditService } from 'src/services/audit.service';
|
|
||||||
import { AuthService } from 'src/services/auth.service';
|
|
||||||
import { DatabaseService } from 'src/services/database.service';
|
|
||||||
import { DownloadService } from 'src/services/download.service';
|
|
||||||
import { JobService } from 'src/services/job.service';
|
|
||||||
import { LibraryService } from 'src/services/library.service';
|
|
||||||
import { MediaService } from 'src/services/media.service';
|
|
||||||
import { MetadataService } from 'src/services/metadata.service';
|
|
||||||
import { MicroservicesService } from 'src/services/microservices.service';
|
import { MicroservicesService } from 'src/services/microservices.service';
|
||||||
import { PartnerService } from 'src/services/partner.service';
|
|
||||||
import { PersonService } from 'src/services/person.service';
|
|
||||||
import { SearchService } from 'src/services/search.service';
|
|
||||||
import { ServerInfoService } from 'src/services/server-info.service';
|
|
||||||
import { SharedLinkService } from 'src/services/shared-link.service';
|
|
||||||
import { SmartInfoService } from 'src/services/smart-info.service';
|
|
||||||
import { StorageTemplateService } from 'src/services/storage-template.service';
|
|
||||||
import { StorageService } from 'src/services/storage.service';
|
|
||||||
import { SystemConfigService } from 'src/services/system-config.service';
|
|
||||||
import { TagService } from 'src/services/tag.service';
|
|
||||||
import { TimelineService } from 'src/services/timeline.service';
|
|
||||||
import { TrashService } from 'src/services/trash.service';
|
|
||||||
import { UserService } from 'src/services/user.service';
|
|
||||||
import { otelConfig } from 'src/utils/instrumentation';
|
import { otelConfig } from 'src/utils/instrumentation';
|
||||||
import { ImmichLogger } from 'src/utils/logger';
|
import { ImmichLogger } from 'src/utils/logger';
|
||||||
|
|
||||||
const commands = [
|
const providers = [ImmichLogger];
|
||||||
ResetAdminPasswordCommand,
|
const common = [...services, ...providers, ...repositories];
|
||||||
PromptPasswordQuestions,
|
|
||||||
EnablePasswordLoginCommand,
|
|
||||||
DisablePasswordLoginCommand,
|
|
||||||
EnableOAuthLogin,
|
|
||||||
DisableOAuthLogin,
|
|
||||||
ListUsersCommand,
|
|
||||||
];
|
|
||||||
|
|
||||||
const controllers = [
|
|
||||||
ActivityController,
|
|
||||||
AssetsController,
|
|
||||||
AssetControllerV1,
|
|
||||||
AssetController,
|
|
||||||
AppController,
|
|
||||||
AlbumController,
|
|
||||||
APIKeyController,
|
|
||||||
AuditController,
|
|
||||||
AuthController,
|
|
||||||
DownloadController,
|
|
||||||
FaceController,
|
|
||||||
JobController,
|
|
||||||
LibraryController,
|
|
||||||
OAuthController,
|
|
||||||
PartnerController,
|
|
||||||
SearchController,
|
|
||||||
ServerInfoController,
|
|
||||||
SharedLinkController,
|
|
||||||
SystemConfigController,
|
|
||||||
TagController,
|
|
||||||
TimelineController,
|
|
||||||
TrashController,
|
|
||||||
UserController,
|
|
||||||
PersonController,
|
|
||||||
];
|
|
||||||
|
|
||||||
const services: Provider[] = [
|
|
||||||
ApiService,
|
|
||||||
MicroservicesService,
|
|
||||||
APIKeyService,
|
|
||||||
ActivityService,
|
|
||||||
AlbumService,
|
|
||||||
AssetService,
|
|
||||||
AssetServiceV1,
|
|
||||||
AuditService,
|
|
||||||
AuthService,
|
|
||||||
DatabaseService,
|
|
||||||
DownloadService,
|
|
||||||
ImmichLogger,
|
|
||||||
JobService,
|
|
||||||
LibraryService,
|
|
||||||
MediaService,
|
|
||||||
MetadataService,
|
|
||||||
PartnerService,
|
|
||||||
PersonService,
|
|
||||||
SearchService,
|
|
||||||
ServerInfoService,
|
|
||||||
SharedLinkService,
|
|
||||||
SmartInfoService,
|
|
||||||
StorageService,
|
|
||||||
StorageTemplateService,
|
|
||||||
SystemConfigService,
|
|
||||||
TagService,
|
|
||||||
TimelineService,
|
|
||||||
TrashService,
|
|
||||||
UserService,
|
|
||||||
];
|
|
||||||
|
|
||||||
const repositories: Provider[] = [
|
|
||||||
{ provide: IActivityRepository, useClass: ActivityRepository },
|
|
||||||
{ provide: IAccessRepository, useClass: AccessRepository },
|
|
||||||
{ provide: IAlbumRepository, useClass: AlbumRepository },
|
|
||||||
{ provide: IAssetRepository, useClass: AssetRepository },
|
|
||||||
{ provide: IAssetRepositoryV1, useClass: AssetRepositoryV1 },
|
|
||||||
{ provide: IAssetStackRepository, useClass: AssetStackRepository },
|
|
||||||
{ provide: IAuditRepository, useClass: AuditRepository },
|
|
||||||
{ provide: ICryptoRepository, useClass: CryptoRepository },
|
|
||||||
{ provide: IDatabaseRepository, useClass: DatabaseRepository },
|
|
||||||
{ provide: IEventRepository, useClass: EventRepository },
|
|
||||||
{ provide: IJobRepository, useClass: JobRepository },
|
|
||||||
{ provide: ILibraryRepository, useClass: LibraryRepository },
|
|
||||||
{ provide: IKeyRepository, useClass: ApiKeyRepository },
|
|
||||||
{ provide: IMachineLearningRepository, useClass: MachineLearningRepository },
|
|
||||||
{ provide: IMetadataRepository, useClass: MetadataRepository },
|
|
||||||
{ provide: IMetricRepository, useClass: MetricRepository },
|
|
||||||
{ provide: IMoveRepository, useClass: MoveRepository },
|
|
||||||
{ provide: IPartnerRepository, useClass: PartnerRepository },
|
|
||||||
{ provide: IPersonRepository, useClass: PersonRepository },
|
|
||||||
{ provide: IServerInfoRepository, useClass: ServerInfoRepository },
|
|
||||||
{ provide: ISharedLinkRepository, useClass: SharedLinkRepository },
|
|
||||||
{ provide: ISearchRepository, useClass: SearchRepository },
|
|
||||||
{ provide: IStorageRepository, useClass: StorageRepository },
|
|
||||||
{ provide: ISystemConfigRepository, useClass: SystemConfigRepository },
|
|
||||||
{ provide: ISystemMetadataRepository, useClass: SystemMetadataRepository },
|
|
||||||
{ provide: ITagRepository, useClass: TagRepository },
|
|
||||||
{ provide: IMediaRepository, useClass: MediaRepository },
|
|
||||||
{ provide: IUserRepository, useClass: UserRepository },
|
|
||||||
{ provide: IUserTokenRepository, useClass: UserTokenRepository },
|
|
||||||
];
|
|
||||||
|
|
||||||
const middleware = [
|
const middleware = [
|
||||||
FileUploadInterceptor,
|
FileUploadInterceptor,
|
||||||
@ -243,13 +38,13 @@ const imports = [
|
|||||||
EventEmitterModule.forRoot(),
|
EventEmitterModule.forRoot(),
|
||||||
OpenTelemetryModule.forRoot(otelConfig),
|
OpenTelemetryModule.forRoot(otelConfig),
|
||||||
TypeOrmModule.forRoot(databaseConfig),
|
TypeOrmModule.forRoot(databaseConfig),
|
||||||
TypeOrmModule.forFeature(databaseEntities),
|
TypeOrmModule.forFeature(entities),
|
||||||
];
|
];
|
||||||
|
|
||||||
@Module({
|
@Module({
|
||||||
imports: [...imports, ScheduleModule.forRoot()],
|
imports: [...imports, ScheduleModule.forRoot()],
|
||||||
controllers: [...controllers],
|
controllers: [...controllers],
|
||||||
providers: [...services, ...repositories, ...middleware],
|
providers: [...common, ...middleware],
|
||||||
})
|
})
|
||||||
export class ApiModule implements OnModuleInit {
|
export class ApiModule implements OnModuleInit {
|
||||||
constructor(private service: ApiService) {}
|
constructor(private service: ApiService) {}
|
||||||
@ -261,7 +56,7 @@ export class ApiModule implements OnModuleInit {
|
|||||||
|
|
||||||
@Module({
|
@Module({
|
||||||
imports: [...imports],
|
imports: [...imports],
|
||||||
providers: [...services, ...repositories, SchedulerRegistry],
|
providers: [...common, SchedulerRegistry],
|
||||||
})
|
})
|
||||||
export class MicroservicesModule implements OnModuleInit {
|
export class MicroservicesModule implements OnModuleInit {
|
||||||
constructor(private service: MicroservicesService) {}
|
constructor(private service: MicroservicesService) {}
|
||||||
@ -273,7 +68,7 @@ export class MicroservicesModule implements OnModuleInit {
|
|||||||
|
|
||||||
@Module({
|
@Module({
|
||||||
imports: [...imports],
|
imports: [...imports],
|
||||||
providers: [...services, ...repositories, ...commands, SchedulerRegistry],
|
providers: [...common, ...commands, SchedulerRegistry],
|
||||||
})
|
})
|
||||||
export class ImmichAdminModule {}
|
export class ImmichAdminModule {}
|
||||||
|
|
||||||
@ -282,10 +77,10 @@ export class ImmichAdminModule {}
|
|||||||
ConfigModule.forRoot(immichAppConfig),
|
ConfigModule.forRoot(immichAppConfig),
|
||||||
EventEmitterModule.forRoot(),
|
EventEmitterModule.forRoot(),
|
||||||
TypeOrmModule.forRoot(databaseConfig),
|
TypeOrmModule.forRoot(databaseConfig),
|
||||||
TypeOrmModule.forFeature(databaseEntities),
|
TypeOrmModule.forFeature(entities),
|
||||||
OpenTelemetryModule.forRoot(otelConfig),
|
OpenTelemetryModule.forRoot(otelConfig),
|
||||||
],
|
],
|
||||||
controllers: [...controllers],
|
controllers: [...controllers],
|
||||||
providers: [...services, ...repositories, ...middleware, SchedulerRegistry],
|
providers: [...common, ...middleware, SchedulerRegistry],
|
||||||
})
|
})
|
||||||
export class AppTestModule {}
|
export class AppTestModule {}
|
||||||
|
14
server/src/commands/index.ts
Normal file
14
server/src/commands/index.ts
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
import { ListUsersCommand } from 'src/commands/list-users.command';
|
||||||
|
import { DisableOAuthLogin, EnableOAuthLogin } from 'src/commands/oauth-login';
|
||||||
|
import { DisablePasswordLoginCommand, EnablePasswordLoginCommand } from 'src/commands/password-login';
|
||||||
|
import { PromptPasswordQuestions, ResetAdminPasswordCommand } from 'src/commands/reset-admin-password.command';
|
||||||
|
|
||||||
|
export const commands = [
|
||||||
|
ResetAdminPasswordCommand,
|
||||||
|
PromptPasswordQuestions,
|
||||||
|
EnablePasswordLoginCommand,
|
||||||
|
DisablePasswordLoginCommand,
|
||||||
|
EnableOAuthLogin,
|
||||||
|
DisableOAuthLogin,
|
||||||
|
ListUsersCommand,
|
||||||
|
];
|
50
server/src/controllers/index.ts
Normal file
50
server/src/controllers/index.ts
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
import { ActivityController } from 'src/controllers/activity.controller';
|
||||||
|
import { AlbumController } from 'src/controllers/album.controller';
|
||||||
|
import { APIKeyController } from 'src/controllers/api-key.controller';
|
||||||
|
import { AppController } from 'src/controllers/app.controller';
|
||||||
|
import { AssetControllerV1 } from 'src/controllers/asset-v1.controller';
|
||||||
|
import { AssetController, AssetsController } from 'src/controllers/asset.controller';
|
||||||
|
import { AuditController } from 'src/controllers/audit.controller';
|
||||||
|
import { AuthController } from 'src/controllers/auth.controller';
|
||||||
|
import { DownloadController } from 'src/controllers/download.controller';
|
||||||
|
import { FaceController } from 'src/controllers/face.controller';
|
||||||
|
import { JobController } from 'src/controllers/job.controller';
|
||||||
|
import { LibraryController } from 'src/controllers/library.controller';
|
||||||
|
import { OAuthController } from 'src/controllers/oauth.controller';
|
||||||
|
import { PartnerController } from 'src/controllers/partner.controller';
|
||||||
|
import { PersonController } from 'src/controllers/person.controller';
|
||||||
|
import { SearchController } from 'src/controllers/search.controller';
|
||||||
|
import { ServerInfoController } from 'src/controllers/server-info.controller';
|
||||||
|
import { SharedLinkController } from 'src/controllers/shared-link.controller';
|
||||||
|
import { SystemConfigController } from 'src/controllers/system-config.controller';
|
||||||
|
import { TagController } from 'src/controllers/tag.controller';
|
||||||
|
import { TimelineController } from 'src/controllers/timeline.controller';
|
||||||
|
import { TrashController } from 'src/controllers/trash.controller';
|
||||||
|
import { UserController } from 'src/controllers/user.controller';
|
||||||
|
|
||||||
|
export const controllers = [
|
||||||
|
ActivityController,
|
||||||
|
AssetsController,
|
||||||
|
AssetControllerV1,
|
||||||
|
AssetController,
|
||||||
|
AppController,
|
||||||
|
AlbumController,
|
||||||
|
APIKeyController,
|
||||||
|
AuditController,
|
||||||
|
AuthController,
|
||||||
|
DownloadController,
|
||||||
|
FaceController,
|
||||||
|
JobController,
|
||||||
|
LibraryController,
|
||||||
|
OAuthController,
|
||||||
|
PartnerController,
|
||||||
|
SearchController,
|
||||||
|
ServerInfoController,
|
||||||
|
SharedLinkController,
|
||||||
|
SystemConfigController,
|
||||||
|
TagController,
|
||||||
|
TimelineController,
|
||||||
|
TrashController,
|
||||||
|
UserController,
|
||||||
|
PersonController,
|
||||||
|
];
|
@ -21,7 +21,7 @@ import { TagEntity } from 'src/entities/tag.entity';
|
|||||||
import { UserTokenEntity } from 'src/entities/user-token.entity';
|
import { UserTokenEntity } from 'src/entities/user-token.entity';
|
||||||
import { UserEntity } from 'src/entities/user.entity';
|
import { UserEntity } from 'src/entities/user.entity';
|
||||||
|
|
||||||
export const databaseEntities = [
|
export const entities = [
|
||||||
ActivityEntity,
|
ActivityEntity,
|
||||||
AlbumEntity,
|
AlbumEntity,
|
||||||
APIKeyEntity,
|
APIKeyEntity,
|
||||||
|
54
server/src/queries/activity.repository.sql
Normal file
54
server/src/queries/activity.repository.sql
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
-- NOTE: This file is auto generated by ./sql-generator
|
||||||
|
|
||||||
|
-- ActivityRepository.search
|
||||||
|
SELECT
|
||||||
|
"ActivityEntity"."id" AS "ActivityEntity_id",
|
||||||
|
"ActivityEntity"."createdAt" AS "ActivityEntity_createdAt",
|
||||||
|
"ActivityEntity"."updatedAt" AS "ActivityEntity_updatedAt",
|
||||||
|
"ActivityEntity"."albumId" AS "ActivityEntity_albumId",
|
||||||
|
"ActivityEntity"."userId" AS "ActivityEntity_userId",
|
||||||
|
"ActivityEntity"."assetId" AS "ActivityEntity_assetId",
|
||||||
|
"ActivityEntity"."comment" AS "ActivityEntity_comment",
|
||||||
|
"ActivityEntity"."isLiked" AS "ActivityEntity_isLiked",
|
||||||
|
"ActivityEntity__ActivityEntity_user"."id" AS "ActivityEntity__ActivityEntity_user_id",
|
||||||
|
"ActivityEntity__ActivityEntity_user"."name" AS "ActivityEntity__ActivityEntity_user_name",
|
||||||
|
"ActivityEntity__ActivityEntity_user"."avatarColor" AS "ActivityEntity__ActivityEntity_user_avatarColor",
|
||||||
|
"ActivityEntity__ActivityEntity_user"."isAdmin" AS "ActivityEntity__ActivityEntity_user_isAdmin",
|
||||||
|
"ActivityEntity__ActivityEntity_user"."email" AS "ActivityEntity__ActivityEntity_user_email",
|
||||||
|
"ActivityEntity__ActivityEntity_user"."storageLabel" AS "ActivityEntity__ActivityEntity_user_storageLabel",
|
||||||
|
"ActivityEntity__ActivityEntity_user"."oauthId" AS "ActivityEntity__ActivityEntity_user_oauthId",
|
||||||
|
"ActivityEntity__ActivityEntity_user"."profileImagePath" AS "ActivityEntity__ActivityEntity_user_profileImagePath",
|
||||||
|
"ActivityEntity__ActivityEntity_user"."shouldChangePassword" AS "ActivityEntity__ActivityEntity_user_shouldChangePassword",
|
||||||
|
"ActivityEntity__ActivityEntity_user"."createdAt" AS "ActivityEntity__ActivityEntity_user_createdAt",
|
||||||
|
"ActivityEntity__ActivityEntity_user"."deletedAt" AS "ActivityEntity__ActivityEntity_user_deletedAt",
|
||||||
|
"ActivityEntity__ActivityEntity_user"."status" AS "ActivityEntity__ActivityEntity_user_status",
|
||||||
|
"ActivityEntity__ActivityEntity_user"."updatedAt" AS "ActivityEntity__ActivityEntity_user_updatedAt",
|
||||||
|
"ActivityEntity__ActivityEntity_user"."memoriesEnabled" AS "ActivityEntity__ActivityEntity_user_memoriesEnabled",
|
||||||
|
"ActivityEntity__ActivityEntity_user"."quotaSizeInBytes" AS "ActivityEntity__ActivityEntity_user_quotaSizeInBytes",
|
||||||
|
"ActivityEntity__ActivityEntity_user"."quotaUsageInBytes" AS "ActivityEntity__ActivityEntity_user_quotaUsageInBytes"
|
||||||
|
FROM
|
||||||
|
"activity" "ActivityEntity"
|
||||||
|
LEFT JOIN "users" "ActivityEntity__ActivityEntity_user" ON "ActivityEntity__ActivityEntity_user"."id" = "ActivityEntity"."userId"
|
||||||
|
AND (
|
||||||
|
"ActivityEntity__ActivityEntity_user"."deletedAt" IS NULL
|
||||||
|
)
|
||||||
|
WHERE
|
||||||
|
(("ActivityEntity"."albumId" = $1))
|
||||||
|
ORDER BY
|
||||||
|
"ActivityEntity"."createdAt" ASC
|
||||||
|
|
||||||
|
-- ActivityRepository.getStatistics
|
||||||
|
SELECT
|
||||||
|
COUNT(DISTINCT ("ActivityEntity"."id")) AS "cnt"
|
||||||
|
FROM
|
||||||
|
"activity" "ActivityEntity"
|
||||||
|
LEFT JOIN "users" "ActivityEntity__ActivityEntity_user" ON "ActivityEntity__ActivityEntity_user"."id" = "ActivityEntity"."userId"
|
||||||
|
AND (
|
||||||
|
"ActivityEntity__ActivityEntity_user"."deletedAt" IS NULL
|
||||||
|
)
|
||||||
|
WHERE
|
||||||
|
(
|
||||||
|
("ActivityEntity"."assetId" = $1)
|
||||||
|
AND ("ActivityEntity"."albumId" = $2)
|
||||||
|
AND ("ActivityEntity"."isLiked" = $3)
|
||||||
|
)
|
@ -1,5 +1,88 @@
|
|||||||
-- NOTE: This file is auto generated by ./sql-generator
|
-- NOTE: This file is auto generated by ./sql-generator
|
||||||
|
|
||||||
|
-- AssetRepository.getByDayOfYear
|
||||||
|
SELECT
|
||||||
|
"entity"."id" AS "entity_id",
|
||||||
|
"entity"."deviceAssetId" AS "entity_deviceAssetId",
|
||||||
|
"entity"."ownerId" AS "entity_ownerId",
|
||||||
|
"entity"."libraryId" AS "entity_libraryId",
|
||||||
|
"entity"."deviceId" AS "entity_deviceId",
|
||||||
|
"entity"."type" AS "entity_type",
|
||||||
|
"entity"."originalPath" AS "entity_originalPath",
|
||||||
|
"entity"."resizePath" AS "entity_resizePath",
|
||||||
|
"entity"."webpPath" AS "entity_webpPath",
|
||||||
|
"entity"."thumbhash" AS "entity_thumbhash",
|
||||||
|
"entity"."encodedVideoPath" AS "entity_encodedVideoPath",
|
||||||
|
"entity"."createdAt" AS "entity_createdAt",
|
||||||
|
"entity"."updatedAt" AS "entity_updatedAt",
|
||||||
|
"entity"."deletedAt" AS "entity_deletedAt",
|
||||||
|
"entity"."fileCreatedAt" AS "entity_fileCreatedAt",
|
||||||
|
"entity"."localDateTime" AS "entity_localDateTime",
|
||||||
|
"entity"."fileModifiedAt" AS "entity_fileModifiedAt",
|
||||||
|
"entity"."isFavorite" AS "entity_isFavorite",
|
||||||
|
"entity"."isArchived" AS "entity_isArchived",
|
||||||
|
"entity"."isExternal" AS "entity_isExternal",
|
||||||
|
"entity"."isReadOnly" AS "entity_isReadOnly",
|
||||||
|
"entity"."isOffline" AS "entity_isOffline",
|
||||||
|
"entity"."checksum" AS "entity_checksum",
|
||||||
|
"entity"."duration" AS "entity_duration",
|
||||||
|
"entity"."isVisible" AS "entity_isVisible",
|
||||||
|
"entity"."livePhotoVideoId" AS "entity_livePhotoVideoId",
|
||||||
|
"entity"."originalFileName" AS "entity_originalFileName",
|
||||||
|
"entity"."sidecarPath" AS "entity_sidecarPath",
|
||||||
|
"entity"."stackId" AS "entity_stackId",
|
||||||
|
"exifInfo"."assetId" AS "exifInfo_assetId",
|
||||||
|
"exifInfo"."description" AS "exifInfo_description",
|
||||||
|
"exifInfo"."exifImageWidth" AS "exifInfo_exifImageWidth",
|
||||||
|
"exifInfo"."exifImageHeight" AS "exifInfo_exifImageHeight",
|
||||||
|
"exifInfo"."fileSizeInByte" AS "exifInfo_fileSizeInByte",
|
||||||
|
"exifInfo"."orientation" AS "exifInfo_orientation",
|
||||||
|
"exifInfo"."dateTimeOriginal" AS "exifInfo_dateTimeOriginal",
|
||||||
|
"exifInfo"."modifyDate" AS "exifInfo_modifyDate",
|
||||||
|
"exifInfo"."timeZone" AS "exifInfo_timeZone",
|
||||||
|
"exifInfo"."latitude" AS "exifInfo_latitude",
|
||||||
|
"exifInfo"."longitude" AS "exifInfo_longitude",
|
||||||
|
"exifInfo"."projectionType" AS "exifInfo_projectionType",
|
||||||
|
"exifInfo"."city" AS "exifInfo_city",
|
||||||
|
"exifInfo"."livePhotoCID" AS "exifInfo_livePhotoCID",
|
||||||
|
"exifInfo"."autoStackId" AS "exifInfo_autoStackId",
|
||||||
|
"exifInfo"."state" AS "exifInfo_state",
|
||||||
|
"exifInfo"."country" AS "exifInfo_country",
|
||||||
|
"exifInfo"."make" AS "exifInfo_make",
|
||||||
|
"exifInfo"."model" AS "exifInfo_model",
|
||||||
|
"exifInfo"."lensModel" AS "exifInfo_lensModel",
|
||||||
|
"exifInfo"."fNumber" AS "exifInfo_fNumber",
|
||||||
|
"exifInfo"."focalLength" AS "exifInfo_focalLength",
|
||||||
|
"exifInfo"."iso" AS "exifInfo_iso",
|
||||||
|
"exifInfo"."exposureTime" AS "exifInfo_exposureTime",
|
||||||
|
"exifInfo"."profileDescription" AS "exifInfo_profileDescription",
|
||||||
|
"exifInfo"."colorspace" AS "exifInfo_colorspace",
|
||||||
|
"exifInfo"."bitsPerSample" AS "exifInfo_bitsPerSample",
|
||||||
|
"exifInfo"."fps" AS "exifInfo_fps"
|
||||||
|
FROM
|
||||||
|
"assets" "entity"
|
||||||
|
LEFT JOIN "exif" "exifInfo" ON "exifInfo"."assetId" = "entity"."id"
|
||||||
|
WHERE
|
||||||
|
(
|
||||||
|
"entity"."ownerId" IN ($1)
|
||||||
|
AND "entity"."isVisible" = true
|
||||||
|
AND "entity"."isArchived" = false
|
||||||
|
AND "entity"."resizePath" IS NOT NULL
|
||||||
|
AND EXTRACT(
|
||||||
|
DAY
|
||||||
|
FROM
|
||||||
|
"entity"."localDateTime" AT TIME ZONE 'UTC'
|
||||||
|
) = $2
|
||||||
|
AND EXTRACT(
|
||||||
|
MONTH
|
||||||
|
FROM
|
||||||
|
"entity"."localDateTime" AT TIME ZONE 'UTC'
|
||||||
|
) = $3
|
||||||
|
)
|
||||||
|
AND ("entity"."deletedAt" IS NULL)
|
||||||
|
ORDER BY
|
||||||
|
"entity"."localDateTime" ASC
|
||||||
|
|
||||||
-- AssetRepository.getByIds
|
-- AssetRepository.getByIds
|
||||||
SELECT
|
SELECT
|
||||||
"AssetEntity"."id" AS "AssetEntity_id",
|
"AssetEntity"."id" AS "AssetEntity_id",
|
||||||
@ -170,6 +253,34 @@ DELETE FROM "assets"
|
|||||||
WHERE
|
WHERE
|
||||||
"ownerId" = $1
|
"ownerId" = $1
|
||||||
|
|
||||||
|
-- AssetRepository.getLibraryAssetPaths
|
||||||
|
SELECT DISTINCT
|
||||||
|
"distinctAlias"."AssetEntity_id" AS "ids_AssetEntity_id"
|
||||||
|
FROM
|
||||||
|
(
|
||||||
|
SELECT
|
||||||
|
"AssetEntity"."id" AS "AssetEntity_id",
|
||||||
|
"AssetEntity"."originalPath" AS "AssetEntity_originalPath",
|
||||||
|
"AssetEntity"."isOffline" AS "AssetEntity_isOffline"
|
||||||
|
FROM
|
||||||
|
"assets" "AssetEntity"
|
||||||
|
LEFT JOIN "libraries" "AssetEntity__AssetEntity_library" ON "AssetEntity__AssetEntity_library"."id" = "AssetEntity"."libraryId"
|
||||||
|
AND (
|
||||||
|
"AssetEntity__AssetEntity_library"."deletedAt" IS NULL
|
||||||
|
)
|
||||||
|
WHERE
|
||||||
|
(
|
||||||
|
(
|
||||||
|
((("AssetEntity__AssetEntity_library"."id" = $1)))
|
||||||
|
)
|
||||||
|
)
|
||||||
|
AND ("AssetEntity"."deletedAt" IS NULL)
|
||||||
|
) "distinctAlias"
|
||||||
|
ORDER BY
|
||||||
|
"AssetEntity_id" ASC
|
||||||
|
LIMIT
|
||||||
|
2
|
||||||
|
|
||||||
-- AssetRepository.getByLibraryIdAndOriginalPath
|
-- AssetRepository.getByLibraryIdAndOriginalPath
|
||||||
SELECT DISTINCT
|
SELECT DISTINCT
|
||||||
"distinctAlias"."AssetEntity_id" AS "ids_AssetEntity_id"
|
"distinctAlias"."AssetEntity_id" AS "ids_AssetEntity_id"
|
||||||
|
@ -1 +0,0 @@
|
|||||||
-- NOTE: This file is auto generated by ./sql-generator
|
|
66
server/src/queries/metadata.repository.sql
Normal file
66
server/src/queries/metadata.repository.sql
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
-- NOTE: This file is auto generated by ./sql-generator
|
||||||
|
|
||||||
|
-- MetadataRepository.getCountries
|
||||||
|
SELECT DISTINCT
|
||||||
|
ON ("exif"."country") "exif"."country" AS "exif_country",
|
||||||
|
"exif"."assetId" AS "exif_assetId"
|
||||||
|
FROM
|
||||||
|
"exif" "exif"
|
||||||
|
LEFT JOIN "assets" "asset" ON "asset"."id" = "exif"."assetId"
|
||||||
|
AND ("asset"."deletedAt" IS NULL)
|
||||||
|
WHERE
|
||||||
|
"asset"."ownerId" = $1
|
||||||
|
AND "exif"."country" IS NOT NULL
|
||||||
|
|
||||||
|
-- MetadataRepository.getStates
|
||||||
|
SELECT DISTINCT
|
||||||
|
ON ("exif"."state") "exif"."state" AS "exif_state",
|
||||||
|
"exif"."assetId" AS "exif_assetId"
|
||||||
|
FROM
|
||||||
|
"exif" "exif"
|
||||||
|
LEFT JOIN "assets" "asset" ON "asset"."id" = "exif"."assetId"
|
||||||
|
AND ("asset"."deletedAt" IS NULL)
|
||||||
|
WHERE
|
||||||
|
"asset"."ownerId" = $1
|
||||||
|
AND "exif"."state" IS NOT NULL
|
||||||
|
AND "exif"."country" = $2
|
||||||
|
|
||||||
|
-- MetadataRepository.getCities
|
||||||
|
SELECT DISTINCT
|
||||||
|
ON ("exif"."city") "exif"."city" AS "exif_city",
|
||||||
|
"exif"."assetId" AS "exif_assetId"
|
||||||
|
FROM
|
||||||
|
"exif" "exif"
|
||||||
|
LEFT JOIN "assets" "asset" ON "asset"."id" = "exif"."assetId"
|
||||||
|
AND ("asset"."deletedAt" IS NULL)
|
||||||
|
WHERE
|
||||||
|
"asset"."ownerId" = $1
|
||||||
|
AND "exif"."city" IS NOT NULL
|
||||||
|
AND "exif"."country" = $2
|
||||||
|
AND "exif"."state" = $3
|
||||||
|
|
||||||
|
-- MetadataRepository.getCameraMakes
|
||||||
|
SELECT DISTINCT
|
||||||
|
ON ("exif"."make") "exif"."make" AS "exif_make",
|
||||||
|
"exif"."assetId" AS "exif_assetId"
|
||||||
|
FROM
|
||||||
|
"exif" "exif"
|
||||||
|
LEFT JOIN "assets" "asset" ON "asset"."id" = "exif"."assetId"
|
||||||
|
AND ("asset"."deletedAt" IS NULL)
|
||||||
|
WHERE
|
||||||
|
"asset"."ownerId" = $1
|
||||||
|
AND "exif"."make" IS NOT NULL
|
||||||
|
AND "exif"."model" = $2
|
||||||
|
|
||||||
|
-- MetadataRepository.getCameraModels
|
||||||
|
SELECT DISTINCT
|
||||||
|
ON ("exif"."model") "exif"."model" AS "exif_model",
|
||||||
|
"exif"."assetId" AS "exif_assetId"
|
||||||
|
FROM
|
||||||
|
"exif" "exif"
|
||||||
|
LEFT JOIN "assets" "asset" ON "asset"."id" = "exif"."assetId"
|
||||||
|
AND ("asset"."deletedAt" IS NULL)
|
||||||
|
WHERE
|
||||||
|
"asset"."ownerId" = $1
|
||||||
|
AND "exif"."model" IS NOT NULL
|
||||||
|
AND "exif"."make" = $2
|
@ -1 +0,0 @@
|
|||||||
-- NOTE: This file is auto generated by ./sql-generator
|
|
@ -278,7 +278,7 @@ WITH RECURSIVE
|
|||||||
exif
|
exif
|
||||||
INNER JOIN assets ON exif."assetId" = assets.id
|
INNER JOIN assets ON exif."assetId" = assets.id
|
||||||
WHERE
|
WHERE
|
||||||
"ownerId" = ANY ('$1'::uuid [])
|
"ownerId" = ANY ($1::uuid [])
|
||||||
AND "isVisible" = $2
|
AND "isVisible" = $2
|
||||||
AND "isArchived" = $3
|
AND "isArchived" = $3
|
||||||
AND type = $4
|
AND type = $4
|
||||||
@ -302,7 +302,7 @@ WITH RECURSIVE
|
|||||||
INNER JOIN assets ON exif."assetId" = assets.id
|
INNER JOIN assets ON exif."assetId" = assets.id
|
||||||
WHERE
|
WHERE
|
||||||
city > c.city
|
city > c.city
|
||||||
AND "ownerId" = ANY ('$1'::uuid [])
|
AND "ownerId" = ANY ($1::uuid [])
|
||||||
AND "isVisible" = $2
|
AND "isVisible" = $2
|
||||||
AND "isArchived" = $3
|
AND "isArchived" = $3
|
||||||
AND type = $4
|
AND type = $4
|
||||||
|
@ -1 +0,0 @@
|
|||||||
-- NOTE: This file is auto generated by ./sql-generator
|
|
@ -1 +0,0 @@
|
|||||||
-- NOTE: This file is auto generated by ./sql-generator
|
|
@ -75,7 +75,7 @@ export class AssetRepository implements IAssetRepository {
|
|||||||
return this.repository.save(asset);
|
return this.repository.save(asset);
|
||||||
}
|
}
|
||||||
|
|
||||||
@GenerateSql({ params: [DummyValue.UUID, { day: 1, month: 1 }] })
|
@GenerateSql({ params: [[DummyValue.UUID], { day: 1, month: 1 }] })
|
||||||
getByDayOfYear(ownerIds: string[], { day, month }: MonthDay): Promise<AssetEntity[]> {
|
getByDayOfYear(ownerIds: string[], { day, month }: MonthDay): Promise<AssetEntity[]> {
|
||||||
return this.repository
|
return this.repository
|
||||||
.createQueryBuilder('entity')
|
.createQueryBuilder('entity')
|
||||||
@ -159,7 +159,7 @@ export class AssetRepository implements IAssetRepository {
|
|||||||
return this.getAll(pagination, { ...options, userIds: [userId] });
|
return this.getAll(pagination, { ...options, userIds: [userId] });
|
||||||
}
|
}
|
||||||
|
|
||||||
@GenerateSql({ params: [[DummyValue.UUID]] })
|
@GenerateSql({ params: [{ take: 1, skip: 0 }, DummyValue.UUID] })
|
||||||
getLibraryAssetPaths(pagination: PaginationOptions, libraryId: string): Paginated<AssetPathEntity> {
|
getLibraryAssetPaths(pagination: PaginationOptions, libraryId: string): Paginated<AssetPathEntity> {
|
||||||
return paginate(this.repository, pagination, {
|
return paginate(this.repository, pagination, {
|
||||||
select: { id: true, originalPath: true, isOffline: true },
|
select: { id: true, originalPath: true, isOffline: true },
|
||||||
|
90
server/src/repositories/index.ts
Normal file
90
server/src/repositories/index.ts
Normal file
@ -0,0 +1,90 @@
|
|||||||
|
import { IAccessRepository } from 'src/interfaces/access.interface';
|
||||||
|
import { IActivityRepository } from 'src/interfaces/activity.interface';
|
||||||
|
import { IAlbumRepository } from 'src/interfaces/album.interface';
|
||||||
|
import { IKeyRepository } from 'src/interfaces/api-key.interface';
|
||||||
|
import { IAssetStackRepository } from 'src/interfaces/asset-stack.interface';
|
||||||
|
import { IAssetRepositoryV1 } from 'src/interfaces/asset-v1.interface';
|
||||||
|
import { IAssetRepository } from 'src/interfaces/asset.interface';
|
||||||
|
import { IAuditRepository } from 'src/interfaces/audit.interface';
|
||||||
|
import { ICryptoRepository } from 'src/interfaces/crypto.interface';
|
||||||
|
import { IDatabaseRepository } from 'src/interfaces/database.interface';
|
||||||
|
import { IEventRepository } from 'src/interfaces/event.interface';
|
||||||
|
import { IJobRepository } from 'src/interfaces/job.interface';
|
||||||
|
import { ILibraryRepository } from 'src/interfaces/library.interface';
|
||||||
|
import { IMachineLearningRepository } from 'src/interfaces/machine-learning.interface';
|
||||||
|
import { IMediaRepository } from 'src/interfaces/media.interface';
|
||||||
|
import { IMetadataRepository } from 'src/interfaces/metadata.interface';
|
||||||
|
import { IMetricRepository } from 'src/interfaces/metric.interface';
|
||||||
|
import { IMoveRepository } from 'src/interfaces/move.interface';
|
||||||
|
import { IPartnerRepository } from 'src/interfaces/partner.interface';
|
||||||
|
import { IPersonRepository } from 'src/interfaces/person.interface';
|
||||||
|
import { ISearchRepository } from 'src/interfaces/search.interface';
|
||||||
|
import { IServerInfoRepository } from 'src/interfaces/server-info.interface';
|
||||||
|
import { ISharedLinkRepository } from 'src/interfaces/shared-link.interface';
|
||||||
|
import { IStorageRepository } from 'src/interfaces/storage.interface';
|
||||||
|
import { ISystemConfigRepository } from 'src/interfaces/system-config.interface';
|
||||||
|
import { ISystemMetadataRepository } from 'src/interfaces/system-metadata.interface';
|
||||||
|
import { ITagRepository } from 'src/interfaces/tag.interface';
|
||||||
|
import { IUserTokenRepository } from 'src/interfaces/user-token.interface';
|
||||||
|
import { IUserRepository } from 'src/interfaces/user.interface';
|
||||||
|
import { AccessRepository } from 'src/repositories/access.repository';
|
||||||
|
import { ActivityRepository } from 'src/repositories/activity.repository';
|
||||||
|
import { AlbumRepository } from 'src/repositories/album.repository';
|
||||||
|
import { ApiKeyRepository } from 'src/repositories/api-key.repository';
|
||||||
|
import { AssetStackRepository } from 'src/repositories/asset-stack.repository';
|
||||||
|
import { AssetRepositoryV1 } from 'src/repositories/asset-v1.repository';
|
||||||
|
import { AssetRepository } from 'src/repositories/asset.repository';
|
||||||
|
import { AuditRepository } from 'src/repositories/audit.repository';
|
||||||
|
import { CryptoRepository } from 'src/repositories/crypto.repository';
|
||||||
|
import { DatabaseRepository } from 'src/repositories/database.repository';
|
||||||
|
import { EventRepository } from 'src/repositories/event.repository';
|
||||||
|
import { JobRepository } from 'src/repositories/job.repository';
|
||||||
|
import { LibraryRepository } from 'src/repositories/library.repository';
|
||||||
|
import { MachineLearningRepository } from 'src/repositories/machine-learning.repository';
|
||||||
|
import { MediaRepository } from 'src/repositories/media.repository';
|
||||||
|
import { MetadataRepository } from 'src/repositories/metadata.repository';
|
||||||
|
import { MetricRepository } from 'src/repositories/metric.repository';
|
||||||
|
import { MoveRepository } from 'src/repositories/move.repository';
|
||||||
|
import { PartnerRepository } from 'src/repositories/partner.repository';
|
||||||
|
import { PersonRepository } from 'src/repositories/person.repository';
|
||||||
|
import { SearchRepository } from 'src/repositories/search.repository';
|
||||||
|
import { ServerInfoRepository } from 'src/repositories/server-info.repository';
|
||||||
|
import { SharedLinkRepository } from 'src/repositories/shared-link.repository';
|
||||||
|
import { StorageRepository } from 'src/repositories/storage.repository';
|
||||||
|
import { SystemConfigRepository } from 'src/repositories/system-config.repository';
|
||||||
|
import { SystemMetadataRepository } from 'src/repositories/system-metadata.repository';
|
||||||
|
import { TagRepository } from 'src/repositories/tag.repository';
|
||||||
|
import { UserTokenRepository } from 'src/repositories/user-token.repository';
|
||||||
|
import { UserRepository } from 'src/repositories/user.repository';
|
||||||
|
|
||||||
|
export const repositories = [
|
||||||
|
{ provide: IActivityRepository, useClass: ActivityRepository },
|
||||||
|
{ provide: IAccessRepository, useClass: AccessRepository },
|
||||||
|
{ provide: IAlbumRepository, useClass: AlbumRepository },
|
||||||
|
{ provide: IAssetRepository, useClass: AssetRepository },
|
||||||
|
{ provide: IAssetRepositoryV1, useClass: AssetRepositoryV1 },
|
||||||
|
{ provide: IAssetStackRepository, useClass: AssetStackRepository },
|
||||||
|
{ provide: IAuditRepository, useClass: AuditRepository },
|
||||||
|
{ provide: ICryptoRepository, useClass: CryptoRepository },
|
||||||
|
{ provide: IDatabaseRepository, useClass: DatabaseRepository },
|
||||||
|
{ provide: IEventRepository, useClass: EventRepository },
|
||||||
|
{ provide: IJobRepository, useClass: JobRepository },
|
||||||
|
{ provide: ILibraryRepository, useClass: LibraryRepository },
|
||||||
|
{ provide: IKeyRepository, useClass: ApiKeyRepository },
|
||||||
|
{ provide: IMachineLearningRepository, useClass: MachineLearningRepository },
|
||||||
|
{ provide: IMetadataRepository, useClass: MetadataRepository },
|
||||||
|
{ provide: IMetricRepository, useClass: MetricRepository },
|
||||||
|
{ provide: IMoveRepository, useClass: MoveRepository },
|
||||||
|
{ provide: IPartnerRepository, useClass: PartnerRepository },
|
||||||
|
{ provide: IPersonRepository, useClass: PersonRepository },
|
||||||
|
{ provide: IServerInfoRepository, useClass: ServerInfoRepository },
|
||||||
|
{ provide: ISharedLinkRepository, useClass: SharedLinkRepository },
|
||||||
|
{ provide: ISearchRepository, useClass: SearchRepository },
|
||||||
|
{ provide: IStorageRepository, useClass: StorageRepository },
|
||||||
|
{ provide: ISystemConfigRepository, useClass: SystemConfigRepository },
|
||||||
|
{ provide: ISystemMetadataRepository, useClass: SystemMetadataRepository },
|
||||||
|
{ provide: ITagRepository, useClass: TagRepository },
|
||||||
|
{ provide: IMediaRepository, useClass: MediaRepository },
|
||||||
|
{ provide: IUserRepository, useClass: UserRepository },
|
||||||
|
{ provide: IUserTokenRepository, useClass: UserTokenRepository },
|
||||||
|
];
|
@ -5,7 +5,7 @@ import { LibraryStatsResponseDto } from 'src/dtos/library.dto';
|
|||||||
import { LibraryEntity, LibraryType } from 'src/entities/library.entity';
|
import { LibraryEntity, LibraryType } from 'src/entities/library.entity';
|
||||||
import { ILibraryRepository } from 'src/interfaces/library.interface';
|
import { ILibraryRepository } from 'src/interfaces/library.interface';
|
||||||
import { Instrumentation } from 'src/utils/instrumentation';
|
import { Instrumentation } from 'src/utils/instrumentation';
|
||||||
import { IsNull, Not } from 'typeorm';
|
import { EntityNotFoundError, IsNull, Not } from 'typeorm';
|
||||||
import { Repository } from 'typeorm/repository/Repository.js';
|
import { Repository } from 'typeorm/repository/Repository.js';
|
||||||
|
|
||||||
@Instrumentation()
|
@Instrumentation()
|
||||||
@ -139,6 +139,10 @@ export class LibraryRepository implements ILibraryRepository {
|
|||||||
.where('libraries.id = :id', { id })
|
.where('libraries.id = :id', { id })
|
||||||
.getRawOne();
|
.getRawOne();
|
||||||
|
|
||||||
|
if (!stats) {
|
||||||
|
throw new EntityNotFoundError(LibraryEntity, { where: { id } });
|
||||||
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
photos: Number(stats.photos),
|
photos: Number(stats.photos),
|
||||||
videos: Number(stats.videos),
|
videos: Number(stats.videos),
|
||||||
|
@ -107,6 +107,7 @@ export class PersonRepository implements IPersonRepository {
|
|||||||
|
|
||||||
@GenerateSql({ params: [DummyValue.UUID] })
|
@GenerateSql({ params: [DummyValue.UUID] })
|
||||||
getFaceById(id: string): Promise<AssetFaceEntity> {
|
getFaceById(id: string): Promise<AssetFaceEntity> {
|
||||||
|
// TODO return null instead of find or fail
|
||||||
return this.assetFaceRepository.findOneOrFail({
|
return this.assetFaceRepository.findOneOrFail({
|
||||||
where: { id },
|
where: { id },
|
||||||
relations: {
|
relations: {
|
||||||
|
@ -225,7 +225,7 @@ export class SearchRepository implements ISearchRepository {
|
|||||||
.getMany();
|
.getMany();
|
||||||
}
|
}
|
||||||
|
|
||||||
@GenerateSql({ params: [[DummyValue.UUID, DummyValue.UUID]] })
|
@GenerateSql({ params: [[DummyValue.UUID]] })
|
||||||
async getAssetsByCity(userIds: string[]): Promise<AssetEntity[]> {
|
async getAssetsByCity(userIds: string[]): Promise<AssetEntity[]> {
|
||||||
const parameters = [userIds, true, false, AssetType.IMAGE];
|
const parameters = [userIds, true, false, AssetType.IMAGE];
|
||||||
const rawRes = await this.repository.query(this.assetsByCityQuery, parameters);
|
const rawRes = await this.repository.query(this.assetsByCityQuery, parameters);
|
||||||
@ -315,7 +315,7 @@ WITH RECURSIVE cte AS (
|
|||||||
SELECT city, "assetId"
|
SELECT city, "assetId"
|
||||||
FROM exif
|
FROM exif
|
||||||
INNER JOIN assets ON exif."assetId" = assets.id
|
INNER JOIN assets ON exif."assetId" = assets.id
|
||||||
WHERE "ownerId" = ANY('$1'::uuid[]) AND "isVisible" = $2 AND "isArchived" = $3 AND type = $4
|
WHERE "ownerId" = ANY($1::uuid[]) AND "isVisible" = $2 AND "isArchived" = $3 AND type = $4
|
||||||
ORDER BY city
|
ORDER BY city
|
||||||
LIMIT 1
|
LIMIT 1
|
||||||
)
|
)
|
||||||
@ -328,7 +328,7 @@ WITH RECURSIVE cte AS (
|
|||||||
SELECT city, "assetId"
|
SELECT city, "assetId"
|
||||||
FROM exif
|
FROM exif
|
||||||
INNER JOIN assets ON exif."assetId" = assets.id
|
INNER JOIN assets ON exif."assetId" = assets.id
|
||||||
WHERE city > c.city AND "ownerId" = ANY('$1'::uuid[]) AND "isVisible" = $2 AND "isArchived" = $3 AND type = $4
|
WHERE city > c.city AND "ownerId" = ANY($1::uuid[]) AND "isVisible" = $2 AND "isArchived" = $3 AND type = $4
|
||||||
ORDER BY city
|
ORDER BY city
|
||||||
LIMIT 1
|
LIMIT 1
|
||||||
) l
|
) l
|
||||||
|
59
server/src/services/index.ts
Normal file
59
server/src/services/index.ts
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
import { ActivityService } from 'src/services/activity.service';
|
||||||
|
import { AlbumService } from 'src/services/album.service';
|
||||||
|
import { APIKeyService } from 'src/services/api-key.service';
|
||||||
|
import { ApiService } from 'src/services/api.service';
|
||||||
|
import { AssetServiceV1 } from 'src/services/asset-v1.service';
|
||||||
|
import { AssetService } from 'src/services/asset.service';
|
||||||
|
import { AuditService } from 'src/services/audit.service';
|
||||||
|
import { AuthService } from 'src/services/auth.service';
|
||||||
|
import { DatabaseService } from 'src/services/database.service';
|
||||||
|
import { DownloadService } from 'src/services/download.service';
|
||||||
|
import { JobService } from 'src/services/job.service';
|
||||||
|
import { LibraryService } from 'src/services/library.service';
|
||||||
|
import { MediaService } from 'src/services/media.service';
|
||||||
|
import { MetadataService } from 'src/services/metadata.service';
|
||||||
|
import { MicroservicesService } from 'src/services/microservices.service';
|
||||||
|
import { PartnerService } from 'src/services/partner.service';
|
||||||
|
import { PersonService } from 'src/services/person.service';
|
||||||
|
import { SearchService } from 'src/services/search.service';
|
||||||
|
import { ServerInfoService } from 'src/services/server-info.service';
|
||||||
|
import { SharedLinkService } from 'src/services/shared-link.service';
|
||||||
|
import { SmartInfoService } from 'src/services/smart-info.service';
|
||||||
|
import { StorageTemplateService } from 'src/services/storage-template.service';
|
||||||
|
import { StorageService } from 'src/services/storage.service';
|
||||||
|
import { SystemConfigService } from 'src/services/system-config.service';
|
||||||
|
import { TagService } from 'src/services/tag.service';
|
||||||
|
import { TimelineService } from 'src/services/timeline.service';
|
||||||
|
import { TrashService } from 'src/services/trash.service';
|
||||||
|
import { UserService } from 'src/services/user.service';
|
||||||
|
|
||||||
|
export const services = [
|
||||||
|
ApiService,
|
||||||
|
MicroservicesService,
|
||||||
|
APIKeyService,
|
||||||
|
ActivityService,
|
||||||
|
AlbumService,
|
||||||
|
AssetService,
|
||||||
|
AssetServiceV1,
|
||||||
|
AuditService,
|
||||||
|
AuthService,
|
||||||
|
DatabaseService,
|
||||||
|
DownloadService,
|
||||||
|
JobService,
|
||||||
|
LibraryService,
|
||||||
|
MediaService,
|
||||||
|
MetadataService,
|
||||||
|
PartnerService,
|
||||||
|
PersonService,
|
||||||
|
SearchService,
|
||||||
|
ServerInfoService,
|
||||||
|
SharedLinkService,
|
||||||
|
SmartInfoService,
|
||||||
|
StorageService,
|
||||||
|
StorageTemplateService,
|
||||||
|
SystemConfigService,
|
||||||
|
TagService,
|
||||||
|
TimelineService,
|
||||||
|
TrashService,
|
||||||
|
UserService,
|
||||||
|
];
|
@ -1,31 +1,21 @@
|
|||||||
#!/usr/bin/env node
|
#!/usr/bin/env node
|
||||||
import { INestApplication } from '@nestjs/common';
|
import { INestApplication } from '@nestjs/common';
|
||||||
import { Reflector } from '@nestjs/core';
|
import { Reflector } from '@nestjs/core';
|
||||||
|
import { EventEmitterModule } from '@nestjs/event-emitter';
|
||||||
|
import { SchedulerRegistry } from '@nestjs/schedule';
|
||||||
import { Test } from '@nestjs/testing';
|
import { Test } from '@nestjs/testing';
|
||||||
import { TypeOrmModule } from '@nestjs/typeorm';
|
import { TypeOrmModule } from '@nestjs/typeorm';
|
||||||
|
import { OpenTelemetryModule } from 'nestjs-otel';
|
||||||
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 { format } from 'sql-formatter';
|
import { format } from 'sql-formatter';
|
||||||
import { databaseConfig } from 'src/database.config';
|
import { databaseConfig } from 'src/database.config';
|
||||||
import { GENERATE_SQL_KEY, GenerateSqlQueries } from 'src/decorators';
|
import { GENERATE_SQL_KEY, GenerateSqlQueries } from 'src/decorators';
|
||||||
import { databaseEntities } from 'src/entities';
|
import { entities } from 'src/entities';
|
||||||
import { ISystemConfigRepository } from 'src/interfaces/system-config.interface';
|
import { repositories } from 'src/repositories';
|
||||||
import { AccessRepository } from 'src/repositories/access.repository';
|
import { AccessRepository } from 'src/repositories/access.repository';
|
||||||
import { AlbumRepository } from 'src/repositories/album.repository';
|
import { AuthService } from 'src/services/auth.service';
|
||||||
import { ApiKeyRepository } from 'src/repositories/api-key.repository';
|
import { otelConfig } from 'src/utils/instrumentation';
|
||||||
import { AssetRepository } from 'src/repositories/asset.repository';
|
|
||||||
import { AuditRepository } from 'src/repositories/audit.repository';
|
|
||||||
import { LibraryRepository } from 'src/repositories/library.repository';
|
|
||||||
import { MoveRepository } from 'src/repositories/move.repository';
|
|
||||||
import { PartnerRepository } from 'src/repositories/partner.repository';
|
|
||||||
import { PersonRepository } from 'src/repositories/person.repository';
|
|
||||||
import { SearchRepository } from 'src/repositories/search.repository';
|
|
||||||
import { SharedLinkRepository } from 'src/repositories/shared-link.repository';
|
|
||||||
import { SystemConfigRepository } from 'src/repositories/system-config.repository';
|
|
||||||
import { SystemMetadataRepository } from 'src/repositories/system-metadata.repository';
|
|
||||||
import { TagRepository } from 'src/repositories/tag.repository';
|
|
||||||
import { UserTokenRepository } from 'src/repositories/user-token.repository';
|
|
||||||
import { UserRepository } from 'src/repositories/user.repository';
|
|
||||||
import { Logger } from 'typeorm';
|
import { Logger } from 'typeorm';
|
||||||
|
|
||||||
export class SqlLogger implements Logger {
|
export class SqlLogger implements Logger {
|
||||||
@ -52,26 +42,9 @@ export class SqlLogger implements Logger {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const reflector = new Reflector();
|
const reflector = new Reflector();
|
||||||
const repositories = [
|
|
||||||
AccessRepository,
|
|
||||||
AlbumRepository,
|
|
||||||
ApiKeyRepository,
|
|
||||||
AssetRepository,
|
|
||||||
AuditRepository,
|
|
||||||
LibraryRepository,
|
|
||||||
MoveRepository,
|
|
||||||
PartnerRepository,
|
|
||||||
PersonRepository,
|
|
||||||
SharedLinkRepository,
|
|
||||||
SearchRepository,
|
|
||||||
SystemConfigRepository,
|
|
||||||
SystemMetadataRepository,
|
|
||||||
TagRepository,
|
|
||||||
UserTokenRepository,
|
|
||||||
UserRepository,
|
|
||||||
];
|
|
||||||
|
|
||||||
type Repository = (typeof repositories)[0];
|
type Repository = (typeof repositories)[0]['useClass'];
|
||||||
|
type Provider = { provide: any; useClass: Repository };
|
||||||
type SqlGeneratorOptions = { targetDir: string };
|
type SqlGeneratorOptions = { targetDir: string };
|
||||||
|
|
||||||
class SqlGenerator {
|
class SqlGenerator {
|
||||||
@ -84,8 +57,8 @@ class SqlGenerator {
|
|||||||
async run() {
|
async run() {
|
||||||
try {
|
try {
|
||||||
await this.setup();
|
await this.setup();
|
||||||
for (const Repository of repositories) {
|
for (const repository of repositories) {
|
||||||
await this.process(Repository);
|
await this.process(repository);
|
||||||
}
|
}
|
||||||
await this.write();
|
await this.write();
|
||||||
this.stats();
|
this.stats();
|
||||||
@ -102,25 +75,27 @@ class SqlGenerator {
|
|||||||
imports: [
|
imports: [
|
||||||
TypeOrmModule.forRoot({
|
TypeOrmModule.forRoot({
|
||||||
...databaseConfig,
|
...databaseConfig,
|
||||||
entities: databaseEntities,
|
entities,
|
||||||
logging: ['query'],
|
logging: ['query'],
|
||||||
logger: this.sqlLogger,
|
logger: this.sqlLogger,
|
||||||
}),
|
}),
|
||||||
TypeOrmModule.forFeature(databaseEntities),
|
TypeOrmModule.forFeature(entities),
|
||||||
|
EventEmitterModule.forRoot(),
|
||||||
|
OpenTelemetryModule.forRoot(otelConfig),
|
||||||
],
|
],
|
||||||
providers: [{ provide: ISystemConfigRepository, useClass: SystemConfigRepository }, ...repositories],
|
providers: [...repositories, AuthService, SchedulerRegistry],
|
||||||
}).compile();
|
}).compile();
|
||||||
|
|
||||||
this.app = await moduleFixture.createNestApplication().init();
|
this.app = await moduleFixture.createNestApplication().init();
|
||||||
}
|
}
|
||||||
|
|
||||||
async process(Repository: Repository) {
|
async process({ provide: token, useClass: Repository }: Provider) {
|
||||||
if (!this.app) {
|
if (!this.app) {
|
||||||
throw new Error('Not initialized');
|
throw new Error('Not initialized');
|
||||||
}
|
}
|
||||||
|
|
||||||
const data: string[] = [`-- NOTE: This file is auto generated by ./sql-generator`];
|
const data: string[] = [`-- NOTE: This file is auto generated by ./sql-generator`];
|
||||||
const instance = this.app.get<Repository>(Repository);
|
const instance = this.app.get<Repository>(token);
|
||||||
|
|
||||||
// normal repositories
|
// normal repositories
|
||||||
data.push(...(await this.runTargets(instance, `${Repository.name}`)));
|
data.push(...(await this.runTargets(instance, `${Repository.name}`)));
|
||||||
@ -180,6 +155,10 @@ class SqlGenerator {
|
|||||||
|
|
||||||
private async write() {
|
private async write() {
|
||||||
for (const [repoName, data] of Object.entries(this.results)) {
|
for (const [repoName, data] of Object.entries(this.results)) {
|
||||||
|
// only contains the header
|
||||||
|
if (data.length === 1) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
const filename = repoName.replaceAll(/[A-Z]/g, (letter) => `.${letter.toLowerCase()}`).replace('.', '');
|
const filename = repoName.replaceAll(/[A-Z]/g, (letter) => `.${letter.toLowerCase()}`).replace('.', '');
|
||||||
const file = join(this.options.targetDir, `${filename}.sql`);
|
const file = join(this.options.targetDir, `${filename}.sql`);
|
||||||
await writeFile(file, data.join('\n\n') + '\n');
|
await writeFile(file, data.join('\n\n') + '\n');
|
||||||
|
Loading…
x
Reference in New Issue
Block a user