infra.module.ts 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. import {
  2. ICryptoRepository,
  3. IDeviceInfoRepository,
  4. IJobRepository,
  5. IKeyRepository,
  6. ISharedLinkRepository,
  7. IStorageRepository,
  8. ISystemConfigRepository,
  9. IUserRepository,
  10. QueueName,
  11. } from '@app/domain';
  12. import { IUserTokenRepository } from '@app/domain/user-token';
  13. import { UserTokenRepository } from '@app/infra/db/repository/user-token.repository';
  14. import { BullModule } from '@nestjs/bull';
  15. import { Global, Module, Provider } from '@nestjs/common';
  16. import { TypeOrmModule } from '@nestjs/typeorm';
  17. import { CryptoRepository } from './auth/crypto.repository';
  18. import {
  19. APIKeyEntity,
  20. APIKeyRepository,
  21. databaseConfig,
  22. DeviceInfoEntity,
  23. DeviceInfoRepository,
  24. SharedLinkEntity,
  25. SharedLinkRepository,
  26. SystemConfigEntity,
  27. SystemConfigRepository,
  28. UserEntity,
  29. UserRepository,
  30. UserTokenEntity,
  31. } from './db';
  32. import { JobRepository } from './job';
  33. import { FilesystemProvider } from './storage';
  34. const providers: Provider[] = [
  35. { provide: ICryptoRepository, useClass: CryptoRepository },
  36. { provide: IDeviceInfoRepository, useClass: DeviceInfoRepository },
  37. { provide: IKeyRepository, useClass: APIKeyRepository },
  38. { provide: IJobRepository, useClass: JobRepository },
  39. { provide: ISharedLinkRepository, useClass: SharedLinkRepository },
  40. { provide: IStorageRepository, useClass: FilesystemProvider },
  41. { provide: ISystemConfigRepository, useClass: SystemConfigRepository },
  42. { provide: IUserRepository, useClass: UserRepository },
  43. { provide: IUserTokenRepository, useClass: UserTokenRepository },
  44. ];
  45. @Global()
  46. @Module({
  47. imports: [
  48. TypeOrmModule.forRoot(databaseConfig),
  49. TypeOrmModule.forFeature([
  50. APIKeyEntity,
  51. DeviceInfoEntity,
  52. UserEntity,
  53. SharedLinkEntity,
  54. SystemConfigEntity,
  55. UserTokenEntity,
  56. ]),
  57. BullModule.forRootAsync({
  58. useFactory: async () => ({
  59. prefix: 'immich_bull',
  60. redis: {
  61. host: process.env.REDIS_HOSTNAME || 'immich_redis',
  62. port: parseInt(process.env.REDIS_PORT || '6379'),
  63. db: parseInt(process.env.REDIS_DBINDEX || '0'),
  64. password: process.env.REDIS_PASSWORD || undefined,
  65. path: process.env.REDIS_SOCKET || undefined,
  66. },
  67. defaultJobOptions: {
  68. attempts: 3,
  69. removeOnComplete: true,
  70. removeOnFail: false,
  71. },
  72. }),
  73. }),
  74. BullModule.registerQueue(
  75. { name: QueueName.USER_DELETION },
  76. { name: QueueName.THUMBNAIL_GENERATION },
  77. { name: QueueName.ASSET_UPLOADED },
  78. { name: QueueName.METADATA_EXTRACTION },
  79. { name: QueueName.VIDEO_CONVERSION },
  80. { name: QueueName.CHECKSUM_GENERATION },
  81. { name: QueueName.MACHINE_LEARNING },
  82. { name: QueueName.CONFIG },
  83. { name: QueueName.BACKGROUND_TASK },
  84. ),
  85. ],
  86. providers: [...providers],
  87. exports: [...providers, BullModule],
  88. })
  89. export class InfraModule {}