Container.ts 63 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249
  1. import * as winston from 'winston'
  2. import Redis from 'ioredis'
  3. import { Container, interfaces } from 'inversify'
  4. import { Env } from './Env'
  5. import TYPES from './Types'
  6. import { AppDataSource } from './DataSource'
  7. import { SNSClient, SNSClientConfig } from '@aws-sdk/client-sns'
  8. import { ItemRepositoryInterface } from '../Domain/Item/ItemRepositoryInterface'
  9. import { SQLLegacyItemRepository } from '../Infra/TypeORM/SQLLegacyItemRepository'
  10. import { MongoRepository, Repository } from 'typeorm'
  11. import { Item } from '../Domain/Item/Item'
  12. import {
  13. DirectCallDomainEventPublisher,
  14. DirectCallEventMessageHandler,
  15. SNSDomainEventPublisher,
  16. SQSDomainEventSubscriberFactory,
  17. SQSEventMessageHandler,
  18. } from '@standardnotes/domain-events-infra'
  19. import { DomainEventFactoryInterface } from '../Domain/Event/DomainEventFactoryInterface'
  20. import { DomainEventFactory } from '../Domain/Event/DomainEventFactory'
  21. import { Timer, TimerInterface } from '@standardnotes/time'
  22. import { ItemTransferCalculatorInterface } from '../Domain/Item/ItemTransferCalculatorInterface'
  23. import { ItemTransferCalculator } from '../Domain/Item/ItemTransferCalculator'
  24. import { ItemConflict } from '../Domain/Item/ItemConflict'
  25. import { ContentFilter } from '../Domain/Item/SaveRule/ContentFilter'
  26. import { ContentTypeFilter } from '../Domain/Item/SaveRule/ContentTypeFilter'
  27. import { OwnershipFilter } from '../Domain/Item/SaveRule/OwnershipFilter'
  28. import { TimeDifferenceFilter } from '../Domain/Item/SaveRule/TimeDifferenceFilter'
  29. import { ItemSaveValidator } from '../Domain/Item/SaveValidator/ItemSaveValidator'
  30. import { ItemSaveValidatorInterface } from '../Domain/Item/SaveValidator/ItemSaveValidatorInterface'
  31. import { SyncResponseFactory20161215 } from '../Domain/Item/SyncResponse/SyncResponseFactory20161215'
  32. import { SyncResponseFactory20200115 } from '../Domain/Item/SyncResponse/SyncResponseFactory20200115'
  33. import { SyncResponseFactoryResolver } from '../Domain/Item/SyncResponse/SyncResponseFactoryResolver'
  34. import { SyncResponseFactoryResolverInterface } from '../Domain/Item/SyncResponse/SyncResponseFactoryResolverInterface'
  35. import { CheckIntegrity } from '../Domain/UseCase/Syncing/CheckIntegrity/CheckIntegrity'
  36. import { GetItem } from '../Domain/UseCase/Syncing/GetItem/GetItem'
  37. import { SyncItems } from '../Domain/UseCase/Syncing/SyncItems/SyncItems'
  38. import { InversifyExpressAuthMiddleware } from '../Infra/InversifyExpressUtils/Middleware/InversifyExpressAuthMiddleware'
  39. import { S3Client } from '@aws-sdk/client-s3'
  40. import { SQSClient, SQSClientConfig } from '@aws-sdk/client-sqs'
  41. import { ContentDecoder, ContentDecoderInterface } from '@standardnotes/common'
  42. import {
  43. DomainEventMessageHandlerInterface,
  44. DomainEventHandlerInterface,
  45. DomainEventSubscriberFactoryInterface,
  46. DomainEventPublisherInterface,
  47. } from '@standardnotes/domain-events'
  48. import axios, { AxiosInstance } from 'axios'
  49. import { AuthHttpServiceInterface } from '../Domain/Auth/AuthHttpServiceInterface'
  50. import { ExtensionsHttpService } from '../Domain/Extension/ExtensionsHttpService'
  51. import { ExtensionsHttpServiceInterface } from '../Domain/Extension/ExtensionsHttpServiceInterface'
  52. import { AccountDeletionRequestedEventHandler } from '../Domain/Handler/AccountDeletionRequestedEventHandler'
  53. import { DuplicateItemSyncedEventHandler } from '../Domain/Handler/DuplicateItemSyncedEventHandler'
  54. import { EmailBackupRequestedEventHandler } from '../Domain/Handler/EmailBackupRequestedEventHandler'
  55. import { ItemRevisionCreationRequestedEventHandler } from '../Domain/Handler/ItemRevisionCreationRequestedEventHandler'
  56. import { ItemBackupServiceInterface } from '../Domain/Item/ItemBackupServiceInterface'
  57. import { FSItemBackupService } from '../Infra/FS/FSItemBackupService'
  58. import { AuthHttpService } from '../Infra/HTTP/AuthHttpService'
  59. import { S3ItemBackupService } from '../Infra/S3/S3ItemBackupService'
  60. import {
  61. ControllerContainer,
  62. ControllerContainerInterface,
  63. MapperInterface,
  64. SharedVaultUser,
  65. } from '@standardnotes/domain-core'
  66. import { BaseItemsController } from '../Infra/InversifyExpressUtils/Base/BaseItemsController'
  67. import { Transform } from 'stream'
  68. import { SQLLegacyItem } from '../Infra/TypeORM/SQLLegacyItem'
  69. import { SQLLegacyItemPersistenceMapper } from '../Mapping/Persistence/SQLLegacyItemPersistenceMapper'
  70. import { ItemHttpRepresentation } from '../Mapping/Http/ItemHttpRepresentation'
  71. import { ItemHttpMapper } from '../Mapping/Http/ItemHttpMapper'
  72. import { SavedItemHttpRepresentation } from '../Mapping/Http/SavedItemHttpRepresentation'
  73. import { SavedItemHttpMapper } from '../Mapping/Http/SavedItemHttpMapper'
  74. import { ItemConflictHttpRepresentation } from '../Mapping/Http/ItemConflictHttpRepresentation'
  75. import { ItemConflictHttpMapper } from '../Mapping/Http/ItemConflictHttpMapper'
  76. import { ItemBackupRepresentation } from '../Mapping/Backup/ItemBackupRepresentation'
  77. import { ItemBackupMapper } from '../Mapping/Backup/ItemBackupMapper'
  78. import { SaveNewItem } from '../Domain/UseCase/Syncing/SaveNewItem/SaveNewItem'
  79. import { UpdateExistingItem } from '../Domain/UseCase/Syncing/UpdateExistingItem/UpdateExistingItem'
  80. import { GetItems } from '../Domain/UseCase/Syncing/GetItems/GetItems'
  81. import { SaveItems } from '../Domain/UseCase/Syncing/SaveItems/SaveItems'
  82. import { ItemHashHttpMapper } from '../Mapping/Http/ItemHashHttpMapper'
  83. import { ItemHash } from '../Domain/Item/ItemHash'
  84. import { ItemHashHttpRepresentation } from '../Mapping/Http/ItemHashHttpRepresentation'
  85. import { BaseSharedVaultInvitesController } from '../Infra/InversifyExpressUtils/Base/BaseSharedVaultInvitesController'
  86. import { InviteUserToSharedVault } from '../Domain/UseCase/SharedVaults/InviteUserToSharedVault/InviteUserToSharedVault'
  87. import { TypeORMSharedVaultRepository } from '../Infra/TypeORM/TypeORMSharedVaultRepository'
  88. import { TypeORMSharedVault } from '../Infra/TypeORM/TypeORMSharedVault'
  89. import { TypeORMSharedVaultInvite } from '../Infra/TypeORM/TypeORMSharedVaultInvite'
  90. import { TypeORMSharedVaultUser } from '../Infra/TypeORM/TypeORMSharedVaultUser'
  91. import { SharedVaultRepositoryInterface } from '../Domain/SharedVault/SharedVaultRepositoryInterface'
  92. import { SharedVaultPersistenceMapper } from '../Mapping/Persistence/SharedVaultPersistenceMapper'
  93. import { SharedVault } from '../Domain/SharedVault/SharedVault'
  94. import { SharedVaultUserPersistenceMapper } from '../Mapping/Persistence/SharedVaultUserPersistenceMapper'
  95. import { SharedVaultInvite } from '../Domain/SharedVault/User/Invite/SharedVaultInvite'
  96. import { SharedVaultInvitePersistenceMapper } from '../Mapping/Persistence/SharedVaultInvitePersistenceMapper'
  97. import { SharedVaultUserRepositoryInterface } from '../Domain/SharedVault/User/SharedVaultUserRepositoryInterface'
  98. import { TypeORMSharedVaultUserRepository } from '../Infra/TypeORM/TypeORMSharedVaultUserRepository'
  99. import { SharedVaultInviteRepositoryInterface } from '../Domain/SharedVault/User/Invite/SharedVaultInviteRepositoryInterface'
  100. import { TypeORMSharedVaultInviteRepository } from '../Infra/TypeORM/TypeORMSharedVaultInviteRepository'
  101. import { UpdateSharedVaultInvite } from '../Domain/UseCase/SharedVaults/UpdateSharedVaultInvite/UpdateSharedVaultInvite'
  102. import { AcceptInviteToSharedVault } from '../Domain/UseCase/SharedVaults/AcceptInviteToSharedVault/AcceptInviteToSharedVault'
  103. import { AddUserToSharedVault } from '../Domain/UseCase/SharedVaults/AddUserToSharedVault/AddUserToSharedVault'
  104. import { CancelInviteToSharedVault } from '../Domain/UseCase/SharedVaults/CancelInviteToSharedVault/CancelInviteToSharedVault'
  105. import { DeleteSharedVaultInvitesToUser } from '../Domain/UseCase/SharedVaults/DeleteSharedVaultInvitesToUser/DeleteSharedVaultInvitesToUser'
  106. import { DeleteSharedVaultInvitesSentByUser } from '../Domain/UseCase/SharedVaults/DeleteSharedVaultInvitesSentByUser/DeleteSharedVaultInvitesSentByUser'
  107. import { GetSharedVaultInvitesSentByUser } from '../Domain/UseCase/SharedVaults/GetSharedVaultInvitesSentByUser/GetSharedVaultInvitesSentByUser'
  108. import { GetSharedVaultInvitesSentToUser } from '../Domain/UseCase/SharedVaults/GetSharedVaultInvitesSentToUser/GetSharedVaultInvitesSentToUser'
  109. import { BaseSharedVaultUsersController } from '../Infra/InversifyExpressUtils/Base/BaseSharedVaultUsersController'
  110. import { GetSharedVaultUsers } from '../Domain/UseCase/SharedVaults/GetSharedVaultUsers/GetSharedVaultUsers'
  111. import { RemoveUserFromSharedVault } from '../Domain/UseCase/SharedVaults/RemoveUserFromSharedVault/RemoveUserFromSharedVault'
  112. import { AddNotificationForUser } from '../Domain/UseCase/Messaging/AddNotificationForUser/AddNotificationForUser'
  113. import { TypeORMNotification } from '../Infra/TypeORM/TypeORMNotification'
  114. import { NotificationRepositoryInterface } from '../Domain/Notifications/NotificationRepositoryInterface'
  115. import { TypeORMNotificationRepository } from '../Infra/TypeORM/TypeORMNotificationRepository'
  116. import { NotificationPersistenceMapper } from '../Mapping/Persistence/NotificationPersistenceMapper'
  117. import { Notification } from '../Domain/Notifications/Notification'
  118. import { SharedVaultUserHttpRepresentation } from '../Mapping/Http/SharedVaultUserHttpRepresentation'
  119. import { SharedVaultUserHttpMapper } from '../Mapping/Http/SharedVaultUserHttpMapper'
  120. import { BaseSharedVaultsController } from '../Infra/InversifyExpressUtils/Base/BaseSharedVaultsController'
  121. import { GetSharedVaults } from '../Domain/UseCase/SharedVaults/GetSharedVaults/GetSharedVaults'
  122. import { CreateSharedVault } from '../Domain/UseCase/SharedVaults/CreateSharedVault/CreateSharedVault'
  123. import { DeleteSharedVault } from '../Domain/UseCase/SharedVaults/DeleteSharedVault/DeleteSharedVault'
  124. import { CreateSharedVaultFileValetToken } from '../Domain/UseCase/SharedVaults/CreateSharedVaultFileValetToken/CreateSharedVaultFileValetToken'
  125. import { SharedVaultValetTokenData, TokenEncoder, TokenEncoderInterface } from '@standardnotes/security'
  126. import { SharedVaultHttpRepresentation } from '../Mapping/Http/SharedVaultHttpRepresentation'
  127. import { SharedVaultHttpMapper } from '../Mapping/Http/SharedVaultHttpMapper'
  128. import { SharedVaultInviteHttpRepresentation } from '../Mapping/Http/SharedVaultInviteHttpRepresentation'
  129. import { SharedVaultInviteHttpMapper } from '../Mapping/Http/SharedVaultInviteHttpMapper'
  130. import { BaseMessagesController } from '../Infra/InversifyExpressUtils/Base/BaseMessagesController'
  131. import { GetMessagesSentToUser } from '../Domain/UseCase/Messaging/GetMessagesSentToUser/GetMessagesSentToUser'
  132. import { TypeORMMessage } from '../Infra/TypeORM/TypeORMMessage'
  133. import { MessageRepositoryInterface } from '../Domain/Message/MessageRepositoryInterface'
  134. import { TypeORMMessageRepository } from '../Infra/TypeORM/TypeORMMessageRepository'
  135. import { Message } from '../Domain/Message/Message'
  136. import { MessagePersistenceMapper } from '../Mapping/Persistence/MessagePersistenceMapper'
  137. import { GetMessagesSentByUser } from '../Domain/UseCase/Messaging/GetMessagesSentByUser/GetMessagesSentByUser'
  138. import { SendMessageToUser } from '../Domain/UseCase/Messaging/SendMessageToUser/SendMessageToUser'
  139. import { DeleteAllMessagesSentToUser } from '../Domain/UseCase/Messaging/DeleteAllMessagesSentToUser/DeleteAllMessagesSentToUser'
  140. import { DeleteMessage } from '../Domain/UseCase/Messaging/DeleteMessage/DeleteMessage'
  141. import { MessageHttpRepresentation } from '../Mapping/Http/MessageHttpRepresentation'
  142. import { MessageHttpMapper } from '../Mapping/Http/MessageHttpMapper'
  143. import { GetUserNotifications } from '../Domain/UseCase/Messaging/GetUserNotifications/GetUserNotifications'
  144. import { NotificationHttpMapper } from '../Mapping/Http/NotificationHttpMapper'
  145. import { NotificationHttpRepresentation } from '../Mapping/Http/NotificationHttpRepresentation'
  146. import { DetermineSharedVaultOperationOnItem } from '../Domain/UseCase/SharedVaults/DetermineSharedVaultOperationOnItem/DetermineSharedVaultOperationOnItem'
  147. import { SharedVaultFilter } from '../Domain/Item/SaveRule/SharedVaultFilter'
  148. import { RemoveNotificationsForUser } from '../Domain/UseCase/Messaging/RemoveNotificationsForUser/RemoveNotificationsForUser'
  149. import { SharedVaultSnjsFilter } from '../Domain/Item/SaveRule/SharedVaultSnjsFilter'
  150. import { UpdateStorageQuotaUsedInSharedVault } from '../Domain/UseCase/SharedVaults/UpdateStorageQuotaUsedInSharedVault/UpdateStorageQuotaUsedInSharedVault'
  151. import { SharedVaultFileUploadedEventHandler } from '../Domain/Handler/SharedVaultFileUploadedEventHandler'
  152. import { SharedVaultFileRemovedEventHandler } from '../Domain/Handler/SharedVaultFileRemovedEventHandler'
  153. import { AddNotificationsForUsers } from '../Domain/UseCase/Messaging/AddNotificationsForUsers/AddNotificationsForUsers'
  154. import { MongoDBItem } from '../Infra/TypeORM/MongoDBItem'
  155. import { MongoDBItemRepository } from '../Infra/TypeORM/MongoDBItemRepository'
  156. import { MongoDBItemPersistenceMapper } from '../Mapping/Persistence/MongoDB/MongoDBItemPersistenceMapper'
  157. import { Logger } from 'winston'
  158. import { ItemRepositoryResolverInterface } from '../Domain/Item/ItemRepositoryResolverInterface'
  159. import { TypeORMItemRepositoryResolver } from '../Infra/TypeORM/TypeORMItemRepositoryResolver'
  160. import { TransitionItemsFromPrimaryToSecondaryDatabaseForUser } from '../Domain/UseCase/Transition/TransitionItemsFromPrimaryToSecondaryDatabaseForUser/TransitionItemsFromPrimaryToSecondaryDatabaseForUser'
  161. import { SharedVaultFileMovedEventHandler } from '../Domain/Handler/SharedVaultFileMovedEventHandler'
  162. import { SQLItem } from '../Infra/TypeORM/SQLItem'
  163. import { SQLItemPersistenceMapper } from '../Mapping/Persistence/SQLItemPersistenceMapper'
  164. import { SQLItemRepository } from '../Infra/TypeORM/SQLItemRepository'
  165. import { SendEventToClient } from '../Domain/UseCase/Syncing/SendEventToClient/SendEventToClient'
  166. import { TransitionRequestedEventHandler } from '../Domain/Handler/TransitionRequestedEventHandler'
  167. import { DeleteSharedVaults } from '../Domain/UseCase/SharedVaults/DeleteSharedVaults/DeleteSharedVaults'
  168. import { RemoveItemsFromSharedVault } from '../Domain/UseCase/SharedVaults/RemoveItemsFromSharedVault/RemoveItemsFromSharedVault'
  169. import { SharedVaultRemovedEventHandler } from '../Domain/Handler/SharedVaultRemovedEventHandler'
  170. import { DesignateSurvivor } from '../Domain/UseCase/SharedVaults/DesignateSurvivor/DesignateSurvivor'
  171. import { RemoveUserFromSharedVaults } from '../Domain/UseCase/SharedVaults/RemoveUserFromSharedVaults/RemoveUserFromSharedVaults'
  172. import { TransferSharedVault } from '../Domain/UseCase/SharedVaults/TransferSharedVault/TransferSharedVault'
  173. import { TransitionRepositoryInterface } from '../Domain/Transition/TransitionRepositoryInterface'
  174. import { RedisTransitionRepository } from '../Infra/Redis/RedisTransitionRepository'
  175. import { TransferSharedVaultItems } from '../Domain/UseCase/SharedVaults/TransferSharedVaultItems/TransferSharedVaultItems'
  176. import { DumpItem } from '../Domain/UseCase/Syncing/DumpItem/DumpItem'
  177. export class ContainerConfigLoader {
  178. private readonly DEFAULT_CONTENT_SIZE_TRANSFER_LIMIT = 10_000_000
  179. private readonly DEFAULT_MAX_ITEMS_LIMIT = 300
  180. private readonly DEFAULT_FILE_UPLOAD_PATH = `${__dirname}/../../uploads`
  181. constructor(private mode: 'server' | 'worker' = 'server') {}
  182. async load(configuration?: {
  183. controllerConatiner?: ControllerContainerInterface
  184. directCallDomainEventPublisher?: DirectCallDomainEventPublisher
  185. logger?: Transform
  186. environmentOverrides?: { [name: string]: string }
  187. }): Promise<Container> {
  188. const directCallDomainEventPublisher =
  189. configuration?.directCallDomainEventPublisher ?? new DirectCallDomainEventPublisher()
  190. const env: Env = new Env(configuration?.environmentOverrides)
  191. env.load()
  192. const container = new Container({
  193. defaultScope: 'Singleton',
  194. })
  195. let logger: winston.Logger
  196. if (configuration?.logger) {
  197. logger = configuration.logger as winston.Logger
  198. } else {
  199. const winstonFormatters = [winston.format.splat(), winston.format.json()]
  200. if (env.get('NEW_RELIC_ENABLED', true) === 'true') {
  201. await import('newrelic')
  202. // eslint-disable-next-line @typescript-eslint/no-var-requires
  203. const newrelicFormatter = require('@newrelic/winston-enricher')
  204. const newrelicWinstonFormatter = newrelicFormatter(winston)
  205. winstonFormatters.push(newrelicWinstonFormatter())
  206. }
  207. logger = winston.createLogger({
  208. level: env.get('LOG_LEVEL', true) || 'info',
  209. format: winston.format.combine(...winstonFormatters),
  210. transports: [new winston.transports.Console({ level: env.get('LOG_LEVEL', true) || 'info' })],
  211. defaultMeta: { service: 'syncing-server' },
  212. })
  213. }
  214. container.bind<winston.Logger>(TYPES.Sync_Logger).toConstantValue(logger)
  215. const appDataSource = new AppDataSource({ env, runMigrations: this.mode === 'server' })
  216. await appDataSource.initialize()
  217. logger.debug('Database initialized')
  218. container.bind<TimerInterface>(TYPES.Sync_Timer).toConstantValue(new Timer())
  219. const isConfiguredForHomeServer = env.get('MODE', true) === 'home-server'
  220. const isConfiguredForSelfHosting = env.get('MODE', true) === 'self-hosted'
  221. const isConfiguredForHomeServerOrSelfHosting = isConfiguredForHomeServer || isConfiguredForSelfHosting
  222. const isSecondaryDatabaseEnabled = env.get('SECONDARY_DB_ENABLED', true) === 'true'
  223. const isConfiguredForInMemoryCache = env.get('CACHE_TYPE', true) === 'memory'
  224. if (!isConfiguredForInMemoryCache) {
  225. const redisUrl = env.get('REDIS_URL')
  226. const isRedisInClusterMode = redisUrl.indexOf(',') > 0
  227. let redis
  228. if (isRedisInClusterMode) {
  229. redis = new Redis.Cluster(redisUrl.split(','))
  230. } else {
  231. redis = new Redis(redisUrl)
  232. }
  233. container.bind(TYPES.Sync_Redis).toConstantValue(redis)
  234. container
  235. .bind<TransitionRepositoryInterface>(TYPES.Sync_TransitionStatusRepository)
  236. .toConstantValue(new RedisTransitionRepository(container.get<Redis>(TYPES.Sync_Redis)))
  237. }
  238. container.bind<Env>(TYPES.Sync_Env).toConstantValue(env)
  239. if (isConfiguredForHomeServer) {
  240. container
  241. .bind<DomainEventPublisherInterface>(TYPES.Sync_DomainEventPublisher)
  242. .toConstantValue(directCallDomainEventPublisher)
  243. } else {
  244. container.bind(TYPES.Sync_SNS_TOPIC_ARN).toConstantValue(env.get('SNS_TOPIC_ARN'))
  245. container.bind(TYPES.Sync_SNS_AWS_REGION).toConstantValue(env.get('SNS_AWS_REGION', true))
  246. container.bind(TYPES.Sync_SQS_QUEUE_URL).toConstantValue(env.get('SQS_QUEUE_URL'))
  247. container.bind(TYPES.Sync_S3_AWS_REGION).toConstantValue(env.get('S3_AWS_REGION', true))
  248. container.bind(TYPES.Sync_S3_BACKUP_BUCKET_NAME).toConstantValue(env.get('S3_BACKUP_BUCKET_NAME', true))
  249. container.bind(TYPES.Sync_EXTENSIONS_SERVER_URL).toConstantValue(env.get('EXTENSIONS_SERVER_URL', true))
  250. container.bind<SNSClient>(TYPES.Sync_SNS).toDynamicValue((context: interfaces.Context) => {
  251. const env: Env = context.container.get(TYPES.Sync_Env)
  252. const snsConfig: SNSClientConfig = {
  253. apiVersion: 'latest',
  254. region: env.get('SNS_AWS_REGION', true),
  255. }
  256. if (env.get('SNS_ENDPOINT', true)) {
  257. snsConfig.endpoint = env.get('SNS_ENDPOINT', true)
  258. }
  259. if (env.get('SNS_ACCESS_KEY_ID', true) && env.get('SNS_SECRET_ACCESS_KEY', true)) {
  260. snsConfig.credentials = {
  261. accessKeyId: env.get('SNS_ACCESS_KEY_ID', true),
  262. secretAccessKey: env.get('SNS_SECRET_ACCESS_KEY', true),
  263. }
  264. }
  265. return new SNSClient(snsConfig)
  266. })
  267. container
  268. .bind<DomainEventPublisherInterface>(TYPES.Sync_DomainEventPublisher)
  269. .toDynamicValue((context: interfaces.Context) => {
  270. return new SNSDomainEventPublisher(
  271. context.container.get(TYPES.Sync_SNS),
  272. context.container.get(TYPES.Sync_SNS_TOPIC_ARN),
  273. )
  274. })
  275. container.bind<SQSClient>(TYPES.Sync_SQS).toDynamicValue((context: interfaces.Context) => {
  276. const env: Env = context.container.get(TYPES.Sync_Env)
  277. const sqsConfig: SQSClientConfig = {
  278. region: env.get('SQS_AWS_REGION'),
  279. }
  280. if (env.get('SQS_ENDPOINT', true)) {
  281. sqsConfig.endpoint = env.get('SQS_ENDPOINT', true)
  282. }
  283. if (env.get('SQS_ACCESS_KEY_ID', true) && env.get('SQS_SECRET_ACCESS_KEY', true)) {
  284. sqsConfig.credentials = {
  285. accessKeyId: env.get('SQS_ACCESS_KEY_ID', true),
  286. secretAccessKey: env.get('SQS_SECRET_ACCESS_KEY', true),
  287. }
  288. }
  289. return new SQSClient(sqsConfig)
  290. })
  291. container.bind<S3Client | undefined>(TYPES.Sync_S3).toDynamicValue((context: interfaces.Context) => {
  292. const env: Env = context.container.get(TYPES.Sync_Env)
  293. let s3Client = undefined
  294. if (env.get('S3_AWS_REGION', true)) {
  295. s3Client = new S3Client({
  296. apiVersion: 'latest',
  297. region: env.get('S3_AWS_REGION', true),
  298. })
  299. }
  300. return s3Client
  301. })
  302. }
  303. container
  304. .bind(TYPES.Sync_EMAIL_ATTACHMENT_MAX_BYTE_SIZE)
  305. .toConstantValue(
  306. env.get('EMAIL_ATTACHMENT_MAX_BYTE_SIZE', true) ? +env.get('EMAIL_ATTACHMENT_MAX_BYTE_SIZE', true) : 10485760,
  307. )
  308. container.bind(TYPES.Sync_NEW_RELIC_ENABLED).toConstantValue(env.get('NEW_RELIC_ENABLED', true))
  309. container
  310. .bind(TYPES.Sync_FILE_UPLOAD_PATH)
  311. .toConstantValue(
  312. env.get('FILE_UPLOAD_PATH', true) ? env.get('FILE_UPLOAD_PATH', true) : this.DEFAULT_FILE_UPLOAD_PATH,
  313. )
  314. // Mapping
  315. container
  316. .bind<MapperInterface<Item, SQLLegacyItem>>(TYPES.Sync_SQLLegacyItemPersistenceMapper)
  317. .toConstantValue(new SQLLegacyItemPersistenceMapper())
  318. container
  319. .bind<MapperInterface<Item, SQLItem>>(TYPES.Sync_SQLItemPersistenceMapper)
  320. .toConstantValue(new SQLItemPersistenceMapper())
  321. container
  322. .bind<MapperInterface<ItemHash, ItemHashHttpRepresentation>>(TYPES.Sync_ItemHashHttpMapper)
  323. .toConstantValue(new ItemHashHttpMapper())
  324. container
  325. .bind<MapperInterface<Item, ItemHttpRepresentation>>(TYPES.Sync_ItemHttpMapper)
  326. .toConstantValue(new ItemHttpMapper(container.get(TYPES.Sync_Timer)))
  327. container
  328. .bind<MapperInterface<Item, SavedItemHttpRepresentation>>(TYPES.Sync_SavedItemHttpMapper)
  329. .toConstantValue(new SavedItemHttpMapper(container.get(TYPES.Sync_Timer)))
  330. container
  331. .bind<MapperInterface<ItemConflict, ItemConflictHttpRepresentation>>(TYPES.Sync_ItemConflictHttpMapper)
  332. .toConstantValue(
  333. new ItemConflictHttpMapper(
  334. container.get(TYPES.Sync_ItemHttpMapper),
  335. container.get(TYPES.Sync_ItemHashHttpMapper),
  336. ),
  337. )
  338. container
  339. .bind<MapperInterface<Item, ItemBackupRepresentation>>(TYPES.Sync_ItemBackupMapper)
  340. .toConstantValue(new ItemBackupMapper(container.get(TYPES.Sync_Timer)))
  341. container
  342. .bind<MapperInterface<SharedVault, TypeORMSharedVault>>(TYPES.Sync_SharedVaultPersistenceMapper)
  343. .toConstantValue(new SharedVaultPersistenceMapper())
  344. container
  345. .bind<MapperInterface<SharedVaultUser, TypeORMSharedVaultUser>>(TYPES.Sync_SharedVaultUserPersistenceMapper)
  346. .toConstantValue(new SharedVaultUserPersistenceMapper())
  347. container
  348. .bind<MapperInterface<SharedVaultInvite, TypeORMSharedVaultInvite>>(TYPES.Sync_SharedVaultInvitePersistenceMapper)
  349. .toConstantValue(new SharedVaultInvitePersistenceMapper())
  350. container
  351. .bind<MapperInterface<Notification, TypeORMNotification>>(TYPES.Sync_NotificationPersistenceMapper)
  352. .toConstantValue(new NotificationPersistenceMapper())
  353. container
  354. .bind<MapperInterface<SharedVaultUser, SharedVaultUserHttpRepresentation>>(TYPES.Sync_SharedVaultUserHttpMapper)
  355. .toConstantValue(new SharedVaultUserHttpMapper())
  356. container
  357. .bind<MapperInterface<SharedVault, SharedVaultHttpRepresentation>>(TYPES.Sync_SharedVaultHttpMapper)
  358. .toConstantValue(new SharedVaultHttpMapper())
  359. container
  360. .bind<MapperInterface<SharedVaultInvite, SharedVaultInviteHttpRepresentation>>(
  361. TYPES.Sync_SharedVaultInviteHttpMapper,
  362. )
  363. .toConstantValue(new SharedVaultInviteHttpMapper())
  364. container
  365. .bind<MapperInterface<Message, TypeORMMessage>>(TYPES.Sync_MessagePersistenceMapper)
  366. .toConstantValue(new MessagePersistenceMapper())
  367. container
  368. .bind<MapperInterface<Message, MessageHttpRepresentation>>(TYPES.Sync_MessageHttpMapper)
  369. .toConstantValue(new MessageHttpMapper())
  370. container
  371. .bind<MapperInterface<Notification, NotificationHttpRepresentation>>(TYPES.Sync_NotificationHttpMapper)
  372. .toConstantValue(new NotificationHttpMapper())
  373. // ORM
  374. container
  375. .bind<Repository<SQLLegacyItem>>(TYPES.Sync_ORMLegacyItemRepository)
  376. .toDynamicValue(() => appDataSource.getRepository(SQLLegacyItem))
  377. container
  378. .bind<Repository<SQLItem>>(TYPES.Sync_ORMItemRepository)
  379. .toConstantValue(appDataSource.getRepository(SQLItem))
  380. container
  381. .bind<Repository<TypeORMSharedVault>>(TYPES.Sync_ORMSharedVaultRepository)
  382. .toConstantValue(appDataSource.getRepository(TypeORMSharedVault))
  383. container
  384. .bind<Repository<TypeORMSharedVaultInvite>>(TYPES.Sync_ORMSharedVaultInviteRepository)
  385. .toConstantValue(appDataSource.getRepository(TypeORMSharedVaultInvite))
  386. container
  387. .bind<Repository<TypeORMSharedVaultUser>>(TYPES.Sync_ORMSharedVaultUserRepository)
  388. .toConstantValue(appDataSource.getRepository(TypeORMSharedVaultUser))
  389. container
  390. .bind<Repository<TypeORMNotification>>(TYPES.Sync_ORMNotificationRepository)
  391. .toConstantValue(appDataSource.getRepository(TypeORMNotification))
  392. container
  393. .bind<Repository<TypeORMMessage>>(TYPES.Sync_ORMMessageRepository)
  394. .toConstantValue(appDataSource.getRepository(TypeORMMessage))
  395. // Mongo
  396. if (isSecondaryDatabaseEnabled) {
  397. container
  398. .bind<MapperInterface<Item, MongoDBItem>>(TYPES.Sync_MongoDBItemPersistenceMapper)
  399. .toConstantValue(new MongoDBItemPersistenceMapper())
  400. container
  401. .bind<MongoRepository<MongoDBItem>>(TYPES.Sync_ORMMongoItemRepository)
  402. .toConstantValue(appDataSource.getMongoRepository(MongoDBItem))
  403. container
  404. .bind<ItemRepositoryInterface>(TYPES.Sync_MongoDBItemRepository)
  405. .toConstantValue(
  406. new MongoDBItemRepository(
  407. container.get<MongoRepository<MongoDBItem>>(TYPES.Sync_ORMMongoItemRepository),
  408. container.get<MapperInterface<Item, MongoDBItem>>(TYPES.Sync_MongoDBItemPersistenceMapper),
  409. container.get<Logger>(TYPES.Sync_Logger),
  410. ),
  411. )
  412. }
  413. // Repositories
  414. container
  415. .bind<ItemRepositoryInterface>(TYPES.Sync_SQLItemRepository)
  416. .toConstantValue(
  417. isConfiguredForHomeServerOrSelfHosting
  418. ? new SQLItemRepository(
  419. container.get<Repository<SQLItem>>(TYPES.Sync_ORMItemRepository),
  420. container.get<MapperInterface<Item, SQLItem>>(TYPES.Sync_SQLItemPersistenceMapper),
  421. container.get<Logger>(TYPES.Sync_Logger),
  422. )
  423. : new SQLLegacyItemRepository(
  424. container.get<Repository<SQLLegacyItem>>(TYPES.Sync_ORMLegacyItemRepository),
  425. container.get<MapperInterface<Item, SQLLegacyItem>>(TYPES.Sync_SQLLegacyItemPersistenceMapper),
  426. container.get<Logger>(TYPES.Sync_Logger),
  427. ),
  428. )
  429. container
  430. .bind<ItemRepositoryResolverInterface>(TYPES.Sync_ItemRepositoryResolver)
  431. .toConstantValue(
  432. new TypeORMItemRepositoryResolver(
  433. container.get<ItemRepositoryInterface>(TYPES.Sync_SQLItemRepository),
  434. isSecondaryDatabaseEnabled ? container.get<ItemRepositoryInterface>(TYPES.Sync_MongoDBItemRepository) : null,
  435. ),
  436. )
  437. container
  438. .bind<SharedVaultRepositoryInterface>(TYPES.Sync_SharedVaultRepository)
  439. .toConstantValue(
  440. new TypeORMSharedVaultRepository(
  441. container.get(TYPES.Sync_ORMSharedVaultRepository),
  442. container.get(TYPES.Sync_SharedVaultPersistenceMapper),
  443. ),
  444. )
  445. container
  446. .bind<SharedVaultUserRepositoryInterface>(TYPES.Sync_SharedVaultUserRepository)
  447. .toConstantValue(
  448. new TypeORMSharedVaultUserRepository(
  449. container.get(TYPES.Sync_ORMSharedVaultUserRepository),
  450. container.get(TYPES.Sync_SharedVaultUserPersistenceMapper),
  451. ),
  452. )
  453. container
  454. .bind<SharedVaultInviteRepositoryInterface>(TYPES.Sync_SharedVaultInviteRepository)
  455. .toConstantValue(
  456. new TypeORMSharedVaultInviteRepository(
  457. container.get(TYPES.Sync_ORMSharedVaultInviteRepository),
  458. container.get(TYPES.Sync_SharedVaultInvitePersistenceMapper),
  459. ),
  460. )
  461. container
  462. .bind<NotificationRepositoryInterface>(TYPES.Sync_NotificationRepository)
  463. .toConstantValue(
  464. new TypeORMNotificationRepository(
  465. container.get(TYPES.Sync_ORMNotificationRepository),
  466. container.get(TYPES.Sync_NotificationPersistenceMapper),
  467. ),
  468. )
  469. container
  470. .bind<MessageRepositoryInterface>(TYPES.Sync_MessageRepository)
  471. .toConstantValue(
  472. new TypeORMMessageRepository(
  473. container.get(TYPES.Sync_ORMMessageRepository),
  474. container.get(TYPES.Sync_MessagePersistenceMapper),
  475. ),
  476. )
  477. container
  478. .bind<DomainEventFactoryInterface>(TYPES.Sync_DomainEventFactory)
  479. .toDynamicValue((context: interfaces.Context) => {
  480. return new DomainEventFactory(context.container.get(TYPES.Sync_Timer))
  481. })
  482. container
  483. .bind<ItemTransferCalculatorInterface>(TYPES.Sync_ItemTransferCalculator)
  484. .toDynamicValue((context: interfaces.Context) => {
  485. return new ItemTransferCalculator(context.container.get<Logger>(TYPES.Sync_Logger))
  486. })
  487. // Middleware
  488. container
  489. .bind<InversifyExpressAuthMiddleware>(TYPES.Sync_AuthMiddleware)
  490. .toDynamicValue((context: interfaces.Context) => {
  491. return new InversifyExpressAuthMiddleware(
  492. context.container.get(TYPES.Sync_AUTH_JWT_SECRET),
  493. context.container.get(TYPES.Sync_Logger),
  494. )
  495. })
  496. // env vars
  497. container.bind(TYPES.Sync_AUTH_JWT_SECRET).toConstantValue(env.get('AUTH_JWT_SECRET'))
  498. container
  499. .bind(TYPES.Sync_REVISIONS_FREQUENCY)
  500. .toConstantValue(env.get('REVISIONS_FREQUENCY', true) ? +env.get('REVISIONS_FREQUENCY', true) : 300)
  501. container.bind(TYPES.Sync_NEW_RELIC_ENABLED).toConstantValue(env.get('NEW_RELIC_ENABLED', true))
  502. container.bind(TYPES.Sync_VERSION).toConstantValue(env.get('VERSION', true) ?? 'development')
  503. container
  504. .bind(TYPES.Sync_CONTENT_SIZE_TRANSFER_LIMIT)
  505. .toConstantValue(
  506. env.get('CONTENT_SIZE_TRANSFER_LIMIT', true)
  507. ? +env.get('CONTENT_SIZE_TRANSFER_LIMIT', true)
  508. : this.DEFAULT_CONTENT_SIZE_TRANSFER_LIMIT,
  509. )
  510. container
  511. .bind(TYPES.Sync_MAX_ITEMS_LIMIT)
  512. .toConstantValue(
  513. env.get('MAX_ITEMS_LIMIT', true) ? +env.get('MAX_ITEMS_LIMIT', true) : this.DEFAULT_MAX_ITEMS_LIMIT,
  514. )
  515. container.bind(TYPES.Sync_VALET_TOKEN_SECRET).toConstantValue(env.get('VALET_TOKEN_SECRET', true))
  516. container
  517. .bind(TYPES.Sync_VALET_TOKEN_TTL)
  518. .toConstantValue(env.get('VALET_TOKEN_TTL', true) ? +env.get('VALET_TOKEN_TTL', true) : 7200)
  519. container
  520. .bind<TokenEncoderInterface<SharedVaultValetTokenData>>(TYPES.Sync_SharedVaultValetTokenEncoder)
  521. .toConstantValue(new TokenEncoder<SharedVaultValetTokenData>(container.get(TYPES.Sync_VALET_TOKEN_SECRET)))
  522. container
  523. .bind<DetermineSharedVaultOperationOnItem>(TYPES.Sync_DetermineSharedVaultOperationOnItem)
  524. .toConstantValue(new DetermineSharedVaultOperationOnItem())
  525. container.bind<OwnershipFilter>(TYPES.Sync_OwnershipFilter).toConstantValue(new OwnershipFilter())
  526. container
  527. .bind<TimeDifferenceFilter>(TYPES.Sync_TimeDifferenceFilter)
  528. .toConstantValue(new TimeDifferenceFilter(container.get(TYPES.Sync_Timer)))
  529. container.bind<ContentTypeFilter>(TYPES.Sync_ContentTypeFilter).toConstantValue(new ContentTypeFilter())
  530. container.bind<ContentFilter>(TYPES.Sync_ContentFilter).toConstantValue(new ContentFilter())
  531. container
  532. .bind<SharedVaultFilter>(TYPES.Sync_SharedVaultFilter)
  533. .toConstantValue(
  534. new SharedVaultFilter(
  535. container.get(TYPES.Sync_DetermineSharedVaultOperationOnItem),
  536. container.get(TYPES.Sync_SharedVaultUserRepository),
  537. ),
  538. )
  539. container.bind<SharedVaultSnjsFilter>(TYPES.Sync_SharedVaultSnjsFilter).toConstantValue(new SharedVaultSnjsFilter())
  540. container
  541. .bind<ItemSaveValidatorInterface>(TYPES.Sync_ItemSaveValidator)
  542. .toConstantValue(
  543. new ItemSaveValidator([
  544. container.get(TYPES.Sync_OwnershipFilter),
  545. container.get(TYPES.Sync_TimeDifferenceFilter),
  546. container.get(TYPES.Sync_ContentTypeFilter),
  547. container.get(TYPES.Sync_ContentFilter),
  548. container.get(TYPES.Sync_SharedVaultFilter),
  549. container.get(TYPES.Sync_SharedVaultSnjsFilter),
  550. ]),
  551. )
  552. container
  553. .bind<ItemBackupServiceInterface>(TYPES.Sync_ItemBackupService)
  554. .toConstantValue(
  555. env.get('S3_AWS_REGION', true)
  556. ? new S3ItemBackupService(
  557. container.get(TYPES.Sync_S3_BACKUP_BUCKET_NAME),
  558. container.get(TYPES.Sync_ItemBackupMapper),
  559. container.get(TYPES.Sync_ItemHttpMapper),
  560. container.get(TYPES.Sync_Logger),
  561. container.get(TYPES.Sync_S3),
  562. )
  563. : new FSItemBackupService(
  564. container.get(TYPES.Sync_FILE_UPLOAD_PATH),
  565. container.get(TYPES.Sync_ItemBackupMapper),
  566. container.get(TYPES.Sync_Logger),
  567. ),
  568. )
  569. // use cases
  570. container
  571. .bind<GetItems>(TYPES.Sync_GetItems)
  572. .toConstantValue(
  573. new GetItems(
  574. container.get(TYPES.Sync_ItemRepositoryResolver),
  575. container.get(TYPES.Sync_SharedVaultUserRepository),
  576. container.get(TYPES.Sync_CONTENT_SIZE_TRANSFER_LIMIT),
  577. container.get(TYPES.Sync_ItemTransferCalculator),
  578. container.get(TYPES.Sync_Timer),
  579. container.get(TYPES.Sync_MAX_ITEMS_LIMIT),
  580. ),
  581. )
  582. container
  583. .bind<SaveNewItem>(TYPES.Sync_SaveNewItem)
  584. .toConstantValue(
  585. new SaveNewItem(
  586. container.get(TYPES.Sync_ItemRepositoryResolver),
  587. container.get(TYPES.Sync_Timer),
  588. container.get(TYPES.Sync_DomainEventPublisher),
  589. container.get(TYPES.Sync_DomainEventFactory),
  590. ),
  591. )
  592. container
  593. .bind<SendEventToClient>(TYPES.Sync_SendEventToClient)
  594. .toConstantValue(
  595. new SendEventToClient(
  596. container.get<DomainEventFactoryInterface>(TYPES.Sync_DomainEventFactory),
  597. container.get<DomainEventPublisherInterface>(TYPES.Sync_DomainEventPublisher),
  598. ),
  599. )
  600. container
  601. .bind<AddNotificationForUser>(TYPES.Sync_AddNotificationForUser)
  602. .toConstantValue(
  603. new AddNotificationForUser(
  604. container.get<NotificationRepositoryInterface>(TYPES.Sync_NotificationRepository),
  605. container.get<TimerInterface>(TYPES.Sync_Timer),
  606. container.get<DomainEventFactoryInterface>(TYPES.Sync_DomainEventFactory),
  607. container.get<SendEventToClient>(TYPES.Sync_SendEventToClient),
  608. container.get<Logger>(TYPES.Sync_Logger),
  609. ),
  610. )
  611. container
  612. .bind<AddNotificationsForUsers>(TYPES.Sync_AddNotificationsForUsers)
  613. .toConstantValue(
  614. new AddNotificationsForUsers(
  615. container.get<SharedVaultUserRepositoryInterface>(TYPES.Sync_SharedVaultUserRepository),
  616. container.get<AddNotificationForUser>(TYPES.Sync_AddNotificationForUser),
  617. ),
  618. )
  619. container
  620. .bind<RemoveNotificationsForUser>(TYPES.Sync_RemoveNotificationsForUser)
  621. .toConstantValue(new RemoveNotificationsForUser(container.get(TYPES.Sync_NotificationRepository)))
  622. container
  623. .bind<UpdateExistingItem>(TYPES.Sync_UpdateExistingItem)
  624. .toConstantValue(
  625. new UpdateExistingItem(
  626. container.get<ItemRepositoryResolverInterface>(TYPES.Sync_ItemRepositoryResolver),
  627. container.get<TimerInterface>(TYPES.Sync_Timer),
  628. container.get<DomainEventPublisherInterface>(TYPES.Sync_DomainEventPublisher),
  629. container.get<DomainEventFactoryInterface>(TYPES.Sync_DomainEventFactory),
  630. container.get<number>(TYPES.Sync_REVISIONS_FREQUENCY),
  631. container.get<DetermineSharedVaultOperationOnItem>(TYPES.Sync_DetermineSharedVaultOperationOnItem),
  632. container.get<AddNotificationsForUsers>(TYPES.Sync_AddNotificationsForUsers),
  633. container.get<RemoveNotificationsForUser>(TYPES.Sync_RemoveNotificationsForUser),
  634. ),
  635. )
  636. container
  637. .bind<SaveItems>(TYPES.Sync_SaveItems)
  638. .toConstantValue(
  639. new SaveItems(
  640. container.get(TYPES.Sync_ItemSaveValidator),
  641. container.get(TYPES.Sync_ItemRepositoryResolver),
  642. container.get(TYPES.Sync_Timer),
  643. container.get(TYPES.Sync_SaveNewItem),
  644. container.get(TYPES.Sync_UpdateExistingItem),
  645. container.get(TYPES.Sync_Logger),
  646. ),
  647. )
  648. container
  649. .bind<GetUserNotifications>(TYPES.Sync_GetUserNotifications)
  650. .toConstantValue(new GetUserNotifications(container.get(TYPES.Sync_NotificationRepository)))
  651. container
  652. .bind<GetSharedVaults>(TYPES.Sync_GetSharedVaults)
  653. .toConstantValue(
  654. new GetSharedVaults(
  655. container.get(TYPES.Sync_SharedVaultUserRepository),
  656. container.get(TYPES.Sync_SharedVaultRepository),
  657. ),
  658. )
  659. container
  660. .bind<GetSharedVaultInvitesSentToUser>(TYPES.Sync_GetSharedVaultInvitesSentToUser)
  661. .toConstantValue(new GetSharedVaultInvitesSentToUser(container.get(TYPES.Sync_SharedVaultInviteRepository)))
  662. container
  663. .bind<GetMessagesSentToUser>(TYPES.Sync_GetMessagesSentToUser)
  664. .toConstantValue(new GetMessagesSentToUser(container.get(TYPES.Sync_MessageRepository)))
  665. container
  666. .bind<SyncItems>(TYPES.Sync_SyncItems)
  667. .toConstantValue(
  668. new SyncItems(
  669. container.get<ItemRepositoryResolverInterface>(TYPES.Sync_ItemRepositoryResolver),
  670. container.get<GetItems>(TYPES.Sync_GetItems),
  671. container.get<SaveItems>(TYPES.Sync_SaveItems),
  672. container.get<GetSharedVaults>(TYPES.Sync_GetSharedVaults),
  673. container.get<GetSharedVaultInvitesSentToUser>(TYPES.Sync_GetSharedVaultInvitesSentToUser),
  674. container.get<GetMessagesSentToUser>(TYPES.Sync_GetMessagesSentToUser),
  675. container.get<GetUserNotifications>(TYPES.Sync_GetUserNotifications),
  676. container.get<Logger>(TYPES.Sync_Logger),
  677. ),
  678. )
  679. container.bind<CheckIntegrity>(TYPES.Sync_CheckIntegrity).toDynamicValue((context: interfaces.Context) => {
  680. return new CheckIntegrity(context.container.get(TYPES.Sync_ItemRepositoryResolver))
  681. })
  682. container.bind<GetItem>(TYPES.Sync_GetItem).toDynamicValue((context: interfaces.Context) => {
  683. return new GetItem(context.container.get(TYPES.Sync_ItemRepositoryResolver))
  684. })
  685. container
  686. .bind<InviteUserToSharedVault>(TYPES.Sync_InviteUserToSharedVault)
  687. .toConstantValue(
  688. new InviteUserToSharedVault(
  689. container.get<SharedVaultRepositoryInterface>(TYPES.Sync_SharedVaultRepository),
  690. container.get<SharedVaultInviteRepositoryInterface>(TYPES.Sync_SharedVaultInviteRepository),
  691. container.get<SharedVaultUserRepositoryInterface>(TYPES.Sync_SharedVaultUserRepository),
  692. container.get<TimerInterface>(TYPES.Sync_Timer),
  693. container.get<DomainEventFactoryInterface>(TYPES.Sync_DomainEventFactory),
  694. container.get<SendEventToClient>(TYPES.Sync_SendEventToClient),
  695. container.get<Logger>(TYPES.Sync_Logger),
  696. ),
  697. )
  698. container
  699. .bind<UpdateSharedVaultInvite>(TYPES.Sync_UpdateSharedVaultInvite)
  700. .toConstantValue(
  701. new UpdateSharedVaultInvite(
  702. container.get(TYPES.Sync_SharedVaultInviteRepository),
  703. container.get(TYPES.Sync_Timer),
  704. ),
  705. )
  706. container
  707. .bind<AddUserToSharedVault>(TYPES.Sync_AddUserToSharedVault)
  708. .toConstantValue(
  709. new AddUserToSharedVault(
  710. container.get<SharedVaultRepositoryInterface>(TYPES.Sync_SharedVaultRepository),
  711. container.get<SharedVaultUserRepositoryInterface>(TYPES.Sync_SharedVaultUserRepository),
  712. container.get<TimerInterface>(TYPES.Sync_Timer),
  713. container.get<DomainEventFactoryInterface>(TYPES.Sync_DomainEventFactory),
  714. container.get<DomainEventPublisherInterface>(TYPES.Sync_DomainEventPublisher),
  715. container.get<AddNotificationsForUsers>(TYPES.Sync_AddNotificationsForUsers),
  716. ),
  717. )
  718. container
  719. .bind<AcceptInviteToSharedVault>(TYPES.Sync_AcceptInviteToSharedVault)
  720. .toConstantValue(
  721. new AcceptInviteToSharedVault(
  722. container.get(TYPES.Sync_AddUserToSharedVault),
  723. container.get(TYPES.Sync_SharedVaultInviteRepository),
  724. ),
  725. )
  726. container
  727. .bind<CancelInviteToSharedVault>(TYPES.Sync_DeclineInviteToSharedVault)
  728. .toConstantValue(
  729. new CancelInviteToSharedVault(
  730. container.get<SharedVaultInviteRepositoryInterface>(TYPES.Sync_SharedVaultInviteRepository),
  731. container.get<AddNotificationForUser>(TYPES.Sync_AddNotificationForUser),
  732. ),
  733. )
  734. container
  735. .bind<DeleteSharedVaultInvitesToUser>(TYPES.Sync_DeleteSharedVaultInvitesToUser)
  736. .toConstantValue(
  737. new DeleteSharedVaultInvitesToUser(
  738. container.get(TYPES.Sync_SharedVaultInviteRepository),
  739. container.get(TYPES.Sync_DeclineInviteToSharedVault),
  740. ),
  741. )
  742. container
  743. .bind<DeleteSharedVaultInvitesSentByUser>(TYPES.Sync_DeleteSharedVaultInvitesSentByUser)
  744. .toConstantValue(
  745. new DeleteSharedVaultInvitesSentByUser(
  746. container.get(TYPES.Sync_SharedVaultInviteRepository),
  747. container.get(TYPES.Sync_DeclineInviteToSharedVault),
  748. ),
  749. )
  750. container
  751. .bind<GetSharedVaultInvitesSentByUser>(TYPES.Sync_GetSharedVaultInvitesSentByUser)
  752. .toConstantValue(new GetSharedVaultInvitesSentByUser(container.get(TYPES.Sync_SharedVaultInviteRepository)))
  753. container
  754. .bind<GetSharedVaultUsers>(TYPES.Sync_GetSharedVaultUsers)
  755. .toConstantValue(
  756. new GetSharedVaultUsers(
  757. container.get(TYPES.Sync_SharedVaultUserRepository),
  758. container.get(TYPES.Sync_SharedVaultRepository),
  759. ),
  760. )
  761. container
  762. .bind<RemoveUserFromSharedVault>(TYPES.Sync_RemoveSharedVaultUser)
  763. .toConstantValue(
  764. new RemoveUserFromSharedVault(
  765. container.get<SharedVaultUserRepositoryInterface>(TYPES.Sync_SharedVaultUserRepository),
  766. container.get<SharedVaultRepositoryInterface>(TYPES.Sync_SharedVaultRepository),
  767. container.get<AddNotificationsForUsers>(TYPES.Sync_AddNotificationsForUsers),
  768. container.get<AddNotificationForUser>(TYPES.Sync_AddNotificationForUser),
  769. container.get<DomainEventFactoryInterface>(TYPES.Sync_DomainEventFactory),
  770. container.get<DomainEventPublisherInterface>(TYPES.Sync_DomainEventPublisher),
  771. ),
  772. )
  773. container
  774. .bind<CreateSharedVault>(TYPES.Sync_CreateSharedVault)
  775. .toConstantValue(
  776. new CreateSharedVault(
  777. container.get(TYPES.Sync_AddUserToSharedVault),
  778. container.get(TYPES.Sync_SharedVaultRepository),
  779. container.get(TYPES.Sync_Timer),
  780. ),
  781. )
  782. container
  783. .bind<CreateSharedVaultFileValetToken>(TYPES.Sync_CreateSharedVaultFileValetToken)
  784. .toConstantValue(
  785. new CreateSharedVaultFileValetToken(
  786. container.get(TYPES.Sync_SharedVaultRepository),
  787. container.get(TYPES.Sync_SharedVaultUserRepository),
  788. container.get(TYPES.Sync_SharedVaultValetTokenEncoder),
  789. container.get(TYPES.Sync_VALET_TOKEN_TTL),
  790. ),
  791. )
  792. container
  793. .bind<GetMessagesSentByUser>(TYPES.Sync_GetMessagesSentByUser)
  794. .toConstantValue(new GetMessagesSentByUser(container.get(TYPES.Sync_MessageRepository)))
  795. container
  796. .bind<SendMessageToUser>(TYPES.Sync_SendMessageToUser)
  797. .toConstantValue(
  798. new SendMessageToUser(
  799. container.get<MessageRepositoryInterface>(TYPES.Sync_MessageRepository),
  800. container.get<TimerInterface>(TYPES.Sync_Timer),
  801. container.get<DomainEventFactoryInterface>(TYPES.Sync_DomainEventFactory),
  802. container.get<SendEventToClient>(TYPES.Sync_SendEventToClient),
  803. container.get<Logger>(TYPES.Sync_Logger),
  804. ),
  805. )
  806. container
  807. .bind<DeleteMessage>(TYPES.Sync_DeleteMessage)
  808. .toConstantValue(new DeleteMessage(container.get(TYPES.Sync_MessageRepository)))
  809. container
  810. .bind<DeleteAllMessagesSentToUser>(TYPES.Sync_DeleteAllMessagesSentToUser)
  811. .toConstantValue(
  812. new DeleteAllMessagesSentToUser(
  813. container.get(TYPES.Sync_MessageRepository),
  814. container.get(TYPES.Sync_DeleteMessage),
  815. ),
  816. )
  817. container
  818. .bind<UpdateStorageQuotaUsedInSharedVault>(TYPES.Sync_UpdateStorageQuotaUsedInSharedVault)
  819. .toConstantValue(
  820. new UpdateStorageQuotaUsedInSharedVault(
  821. container.get<SharedVaultRepositoryInterface>(TYPES.Sync_SharedVaultRepository),
  822. ),
  823. )
  824. container
  825. .bind<TransitionItemsFromPrimaryToSecondaryDatabaseForUser>(
  826. TYPES.Sync_TransitionItemsFromPrimaryToSecondaryDatabaseForUser,
  827. )
  828. .toConstantValue(
  829. new TransitionItemsFromPrimaryToSecondaryDatabaseForUser(
  830. container.get<ItemRepositoryInterface>(TYPES.Sync_SQLItemRepository),
  831. isSecondaryDatabaseEnabled ? container.get<ItemRepositoryInterface>(TYPES.Sync_MongoDBItemRepository) : null,
  832. isConfiguredForInMemoryCache
  833. ? null
  834. : container.get<TransitionRepositoryInterface>(TYPES.Sync_TransitionStatusRepository),
  835. container.get<TimerInterface>(TYPES.Sync_Timer),
  836. container.get<Logger>(TYPES.Sync_Logger),
  837. env.get('MIGRATION_BATCH_SIZE', true) ? +env.get('MIGRATION_BATCH_SIZE', true) : 100,
  838. container.get<DomainEventPublisherInterface>(TYPES.Sync_DomainEventPublisher),
  839. container.get<DomainEventFactoryInterface>(TYPES.Sync_DomainEventFactory),
  840. ),
  841. )
  842. container
  843. .bind<RemoveItemsFromSharedVault>(TYPES.Sync_RemoveItemsFromSharedVault)
  844. .toConstantValue(
  845. new RemoveItemsFromSharedVault(
  846. isSecondaryDatabaseEnabled
  847. ? container.get<ItemRepositoryInterface>(TYPES.Sync_MongoDBItemRepository)
  848. : container.get<ItemRepositoryInterface>(TYPES.Sync_SQLItemRepository),
  849. ),
  850. )
  851. container
  852. .bind<DesignateSurvivor>(TYPES.Sync_DesignateSurvivor)
  853. .toConstantValue(
  854. new DesignateSurvivor(
  855. container.get<SharedVaultRepositoryInterface>(TYPES.Sync_SharedVaultRepository),
  856. container.get<SharedVaultUserRepositoryInterface>(TYPES.Sync_SharedVaultUserRepository),
  857. container.get<TimerInterface>(TYPES.Sync_Timer),
  858. container.get<DomainEventFactoryInterface>(TYPES.Sync_DomainEventFactory),
  859. container.get<DomainEventPublisherInterface>(TYPES.Sync_DomainEventPublisher),
  860. container.get<AddNotificationForUser>(TYPES.Sync_AddNotificationForUser),
  861. ),
  862. )
  863. container
  864. .bind<RemoveUserFromSharedVaults>(TYPES.Sync_RemoveUserFromSharedVaults)
  865. .toConstantValue(
  866. new RemoveUserFromSharedVaults(
  867. container.get<SharedVaultUserRepositoryInterface>(TYPES.Sync_SharedVaultUserRepository),
  868. container.get<RemoveUserFromSharedVault>(TYPES.Sync_RemoveSharedVaultUser),
  869. container.get<Logger>(TYPES.Sync_Logger),
  870. ),
  871. )
  872. container
  873. .bind<TransferSharedVaultItems>(TYPES.Sync_TransferSharedVaultItems)
  874. .toConstantValue(
  875. new TransferSharedVaultItems(
  876. isSecondaryDatabaseEnabled
  877. ? container.get<ItemRepositoryInterface>(TYPES.Sync_MongoDBItemRepository)
  878. : container.get<ItemRepositoryInterface>(TYPES.Sync_SQLItemRepository),
  879. ),
  880. )
  881. container
  882. .bind<TransferSharedVault>(TYPES.Sync_TransferSharedVault)
  883. .toConstantValue(
  884. new TransferSharedVault(
  885. container.get<SharedVaultRepositoryInterface>(TYPES.Sync_SharedVaultRepository),
  886. container.get<SharedVaultUserRepositoryInterface>(TYPES.Sync_SharedVaultUserRepository),
  887. container.get<TransferSharedVaultItems>(TYPES.Sync_TransferSharedVaultItems),
  888. container.get<TimerInterface>(TYPES.Sync_Timer),
  889. ),
  890. )
  891. container
  892. .bind<DeleteSharedVault>(TYPES.Sync_DeleteSharedVault)
  893. .toConstantValue(
  894. new DeleteSharedVault(
  895. container.get<SharedVaultRepositoryInterface>(TYPES.Sync_SharedVaultRepository),
  896. container.get<SharedVaultUserRepositoryInterface>(TYPES.Sync_SharedVaultUserRepository),
  897. container.get<SharedVaultInviteRepositoryInterface>(TYPES.Sync_SharedVaultInviteRepository),
  898. container.get<RemoveUserFromSharedVault>(TYPES.Sync_RemoveSharedVaultUser),
  899. container.get<CancelInviteToSharedVault>(TYPES.Sync_DeclineInviteToSharedVault),
  900. container.get<DomainEventFactoryInterface>(TYPES.Sync_DomainEventFactory),
  901. container.get<DomainEventPublisherInterface>(TYPES.Sync_DomainEventPublisher),
  902. container.get<TransferSharedVault>(TYPES.Sync_TransferSharedVault),
  903. ),
  904. )
  905. container
  906. .bind<DeleteSharedVaults>(TYPES.Sync_DeleteSharedVaults)
  907. .toConstantValue(
  908. new DeleteSharedVaults(
  909. container.get<SharedVaultRepositoryInterface>(TYPES.Sync_SharedVaultRepository),
  910. container.get<DeleteSharedVault>(TYPES.Sync_DeleteSharedVault),
  911. ),
  912. )
  913. container
  914. .bind<DumpItem>(TYPES.Sync_DumpItem)
  915. .toConstantValue(
  916. new DumpItem(
  917. container.get<ItemRepositoryResolverInterface>(TYPES.Sync_ItemRepositoryResolver),
  918. container.get<ItemBackupServiceInterface>(TYPES.Sync_ItemBackupService),
  919. container.get<DomainEventFactoryInterface>(TYPES.Sync_DomainEventFactory),
  920. container.get<DomainEventPublisherInterface>(TYPES.Sync_DomainEventPublisher),
  921. ),
  922. )
  923. // Services
  924. container
  925. .bind<SyncResponseFactory20161215>(TYPES.Sync_SyncResponseFactory20161215)
  926. .toConstantValue(new SyncResponseFactory20161215(container.get(TYPES.Sync_ItemHttpMapper)))
  927. container
  928. .bind<SyncResponseFactory20200115>(TYPES.Sync_SyncResponseFactory20200115)
  929. .toConstantValue(
  930. new SyncResponseFactory20200115(
  931. container.get(TYPES.Sync_ItemHttpMapper),
  932. container.get(TYPES.Sync_ItemConflictHttpMapper),
  933. container.get(TYPES.Sync_SavedItemHttpMapper),
  934. container.get(TYPES.Sync_SharedVaultHttpMapper),
  935. container.get(TYPES.Sync_SharedVaultInviteHttpMapper),
  936. container.get(TYPES.Sync_MessageHttpMapper),
  937. container.get(TYPES.Sync_NotificationHttpMapper),
  938. ),
  939. )
  940. container
  941. .bind<SyncResponseFactoryResolverInterface>(TYPES.Sync_SyncResponseFactoryResolver)
  942. .toDynamicValue((context: interfaces.Context) => {
  943. return new SyncResponseFactoryResolver(
  944. context.container.get(TYPES.Sync_SyncResponseFactory20161215),
  945. context.container.get(TYPES.Sync_SyncResponseFactory20200115),
  946. )
  947. })
  948. // Handlers
  949. container
  950. .bind<DuplicateItemSyncedEventHandler>(TYPES.Sync_DuplicateItemSyncedEventHandler)
  951. .toConstantValue(
  952. new DuplicateItemSyncedEventHandler(
  953. container.get<ItemRepositoryResolverInterface>(TYPES.Sync_ItemRepositoryResolver),
  954. container.get<DomainEventFactoryInterface>(TYPES.Sync_DomainEventFactory),
  955. container.get<DomainEventPublisherInterface>(TYPES.Sync_DomainEventPublisher),
  956. container.get<Logger>(TYPES.Sync_Logger),
  957. ),
  958. )
  959. container
  960. .bind<AccountDeletionRequestedEventHandler>(TYPES.Sync_AccountDeletionRequestedEventHandler)
  961. .toConstantValue(
  962. new AccountDeletionRequestedEventHandler(
  963. container.get<ItemRepositoryResolverInterface>(TYPES.Sync_ItemRepositoryResolver),
  964. container.get<DeleteSharedVaults>(TYPES.Sync_DeleteSharedVaults),
  965. container.get<RemoveUserFromSharedVaults>(TYPES.Sync_RemoveUserFromSharedVaults),
  966. container.get<Logger>(TYPES.Sync_Logger),
  967. ),
  968. )
  969. container
  970. .bind<ItemRevisionCreationRequestedEventHandler>(TYPES.Sync_ItemRevisionCreationRequestedEventHandler)
  971. .toConstantValue(
  972. new ItemRevisionCreationRequestedEventHandler(
  973. container.get<DumpItem>(TYPES.Sync_DumpItem),
  974. container.get<Logger>(TYPES.Sync_Logger),
  975. ),
  976. )
  977. container
  978. .bind<SharedVaultFileUploadedEventHandler>(TYPES.Sync_SharedVaultFileUploadedEventHandler)
  979. .toConstantValue(
  980. new SharedVaultFileUploadedEventHandler(
  981. container.get<UpdateStorageQuotaUsedInSharedVault>(TYPES.Sync_UpdateStorageQuotaUsedInSharedVault),
  982. container.get<AddNotificationsForUsers>(TYPES.Sync_AddNotificationsForUsers),
  983. container.get<winston.Logger>(TYPES.Sync_Logger),
  984. ),
  985. )
  986. container
  987. .bind<SharedVaultFileRemovedEventHandler>(TYPES.Sync_SharedVaultFileRemovedEventHandler)
  988. .toConstantValue(
  989. new SharedVaultFileRemovedEventHandler(
  990. container.get<UpdateStorageQuotaUsedInSharedVault>(TYPES.Sync_UpdateStorageQuotaUsedInSharedVault),
  991. container.get<AddNotificationsForUsers>(TYPES.Sync_AddNotificationsForUsers),
  992. container.get<winston.Logger>(TYPES.Sync_Logger),
  993. ),
  994. )
  995. container
  996. .bind<SharedVaultFileMovedEventHandler>(TYPES.Sync_SharedVaultFileMovedEventHandler)
  997. .toConstantValue(
  998. new SharedVaultFileMovedEventHandler(
  999. container.get<UpdateStorageQuotaUsedInSharedVault>(TYPES.Sync_UpdateStorageQuotaUsedInSharedVault),
  1000. container.get<AddNotificationsForUsers>(TYPES.Sync_AddNotificationsForUsers),
  1001. container.get<winston.Logger>(TYPES.Sync_Logger),
  1002. ),
  1003. )
  1004. container
  1005. .bind<TransitionRequestedEventHandler>(TYPES.Sync_TransitionRequestedEventHandler)
  1006. .toConstantValue(
  1007. new TransitionRequestedEventHandler(
  1008. false,
  1009. container.get<TransitionItemsFromPrimaryToSecondaryDatabaseForUser>(
  1010. TYPES.Sync_TransitionItemsFromPrimaryToSecondaryDatabaseForUser,
  1011. ),
  1012. container.get<Logger>(TYPES.Sync_Logger),
  1013. ),
  1014. )
  1015. container
  1016. .bind<SharedVaultRemovedEventHandler>(TYPES.Sync_SharedVaultRemovedEventHandler)
  1017. .toConstantValue(
  1018. new SharedVaultRemovedEventHandler(
  1019. container.get<RemoveItemsFromSharedVault>(TYPES.Sync_RemoveItemsFromSharedVault),
  1020. container.get<Logger>(TYPES.Sync_Logger),
  1021. ),
  1022. )
  1023. // Services
  1024. container.bind<ContentDecoder>(TYPES.Sync_ContentDecoder).toDynamicValue(() => new ContentDecoder())
  1025. container.bind<AxiosInstance>(TYPES.Sync_HTTPClient).toDynamicValue(() => axios.create())
  1026. container
  1027. .bind<ExtensionsHttpServiceInterface>(TYPES.Sync_ExtensionsHttpService)
  1028. .toConstantValue(
  1029. new ExtensionsHttpService(
  1030. container.get<AxiosInstance>(TYPES.Sync_HTTPClient),
  1031. container.get<ItemRepositoryInterface>(TYPES.Sync_SQLItemRepository),
  1032. isSecondaryDatabaseEnabled ? container.get<ItemRepositoryInterface>(TYPES.Sync_MongoDBItemRepository) : null,
  1033. container.get<ContentDecoderInterface>(TYPES.Sync_ContentDecoder),
  1034. container.get<DomainEventPublisherInterface>(TYPES.Sync_DomainEventPublisher),
  1035. container.get<DomainEventFactoryInterface>(TYPES.Sync_DomainEventFactory),
  1036. container.get<Logger>(TYPES.Sync_Logger),
  1037. ),
  1038. )
  1039. const eventHandlers: Map<string, DomainEventHandlerInterface> = new Map([
  1040. ['DUPLICATE_ITEM_SYNCED', container.get(TYPES.Sync_DuplicateItemSyncedEventHandler)],
  1041. ['ACCOUNT_DELETION_REQUESTED', container.get(TYPES.Sync_AccountDeletionRequestedEventHandler)],
  1042. ['ITEM_REVISION_CREATION_REQUESTED', container.get(TYPES.Sync_ItemRevisionCreationRequestedEventHandler)],
  1043. [
  1044. 'SHARED_VAULT_FILE_UPLOADED',
  1045. container.get<SharedVaultFileUploadedEventHandler>(TYPES.Sync_SharedVaultFileUploadedEventHandler),
  1046. ],
  1047. [
  1048. 'SHARED_VAULT_FILE_REMOVED',
  1049. container.get<SharedVaultFileRemovedEventHandler>(TYPES.Sync_SharedVaultFileRemovedEventHandler),
  1050. ],
  1051. [
  1052. 'SHARED_VAULT_FILE_MOVED',
  1053. container.get<SharedVaultFileMovedEventHandler>(TYPES.Sync_SharedVaultFileMovedEventHandler),
  1054. ],
  1055. [
  1056. 'TRANSITION_REQUESTED',
  1057. container.get<TransitionRequestedEventHandler>(TYPES.Sync_TransitionRequestedEventHandler),
  1058. ],
  1059. [
  1060. 'SHARED_VAULT_REMOVED',
  1061. container.get<SharedVaultRemovedEventHandler>(TYPES.Sync_SharedVaultRemovedEventHandler),
  1062. ],
  1063. ])
  1064. if (!isConfiguredForHomeServer) {
  1065. container.bind(TYPES.Sync_AUTH_SERVER_URL).toConstantValue(env.get('AUTH_SERVER_URL'))
  1066. container
  1067. .bind<AuthHttpServiceInterface>(TYPES.Sync_AuthHttpService)
  1068. .toDynamicValue((context: interfaces.Context) => {
  1069. return new AuthHttpService(
  1070. context.container.get(TYPES.Sync_HTTPClient),
  1071. context.container.get(TYPES.Sync_AUTH_SERVER_URL),
  1072. )
  1073. })
  1074. container
  1075. .bind<EmailBackupRequestedEventHandler>(TYPES.Sync_EmailBackupRequestedEventHandler)
  1076. .toConstantValue(
  1077. new EmailBackupRequestedEventHandler(
  1078. container.get<ItemRepositoryInterface>(TYPES.Sync_SQLItemRepository),
  1079. isSecondaryDatabaseEnabled
  1080. ? container.get<ItemRepositoryInterface>(TYPES.Sync_MongoDBItemRepository)
  1081. : null,
  1082. container.get<AuthHttpServiceInterface>(TYPES.Sync_AuthHttpService),
  1083. container.get<ItemBackupServiceInterface>(TYPES.Sync_ItemBackupService),
  1084. container.get<DomainEventPublisherInterface>(TYPES.Sync_DomainEventPublisher),
  1085. container.get<DomainEventFactoryInterface>(TYPES.Sync_DomainEventFactory),
  1086. container.get<number>(TYPES.Sync_EMAIL_ATTACHMENT_MAX_BYTE_SIZE),
  1087. container.get<ItemTransferCalculatorInterface>(TYPES.Sync_ItemTransferCalculator),
  1088. container.get<string>(TYPES.Sync_S3_BACKUP_BUCKET_NAME),
  1089. container.get<Logger>(TYPES.Sync_Logger),
  1090. ),
  1091. )
  1092. eventHandlers.set('EMAIL_BACKUP_REQUESTED', container.get(TYPES.Sync_EmailBackupRequestedEventHandler))
  1093. }
  1094. if (isConfiguredForHomeServer) {
  1095. const directCallEventMessageHandler = new DirectCallEventMessageHandler(
  1096. eventHandlers,
  1097. container.get(TYPES.Sync_Logger),
  1098. )
  1099. directCallDomainEventPublisher.register(directCallEventMessageHandler)
  1100. container
  1101. .bind<DomainEventMessageHandlerInterface>(TYPES.Sync_DomainEventMessageHandler)
  1102. .toConstantValue(directCallEventMessageHandler)
  1103. } else {
  1104. container
  1105. .bind<DomainEventMessageHandlerInterface>(TYPES.Sync_DomainEventMessageHandler)
  1106. .toConstantValue(new SQSEventMessageHandler(eventHandlers, container.get(TYPES.Sync_Logger)))
  1107. }
  1108. container
  1109. .bind<DomainEventSubscriberFactoryInterface>(TYPES.Sync_DomainEventSubscriberFactory)
  1110. .toDynamicValue((context: interfaces.Context) => {
  1111. return new SQSDomainEventSubscriberFactory(
  1112. context.container.get(TYPES.Sync_SQS),
  1113. context.container.get(TYPES.Sync_SQS_QUEUE_URL),
  1114. context.container.get(TYPES.Sync_DomainEventMessageHandler),
  1115. )
  1116. })
  1117. container
  1118. .bind<ControllerContainerInterface>(TYPES.Sync_ControllerContainer)
  1119. .toConstantValue(configuration?.controllerConatiner ?? new ControllerContainer())
  1120. if (isConfiguredForHomeServer) {
  1121. container
  1122. .bind<BaseItemsController>(TYPES.Sync_BaseItemsController)
  1123. .toConstantValue(
  1124. new BaseItemsController(
  1125. container.get<SyncItems>(TYPES.Sync_SyncItems),
  1126. container.get<CheckIntegrity>(TYPES.Sync_CheckIntegrity),
  1127. container.get<GetItem>(TYPES.Sync_GetItem),
  1128. container.get<MapperInterface<Item, ItemHttpRepresentation>>(TYPES.Sync_ItemHttpMapper),
  1129. container.get<SyncResponseFactoryResolverInterface>(TYPES.Sync_SyncResponseFactoryResolver),
  1130. container.get<ControllerContainerInterface>(TYPES.Sync_ControllerContainer),
  1131. ),
  1132. )
  1133. container
  1134. .bind<BaseSharedVaultInvitesController>(TYPES.Sync_BaseSharedVaultInvitesController)
  1135. .toConstantValue(
  1136. new BaseSharedVaultInvitesController(
  1137. container.get(TYPES.Sync_InviteUserToSharedVault),
  1138. container.get(TYPES.Sync_UpdateSharedVaultInvite),
  1139. container.get(TYPES.Sync_AcceptInviteToSharedVault),
  1140. container.get(TYPES.Sync_DeclineInviteToSharedVault),
  1141. container.get(TYPES.Sync_DeleteSharedVaultInvitesToUser),
  1142. container.get(TYPES.Sync_DeleteSharedVaultInvitesSentByUser),
  1143. container.get(TYPES.Sync_GetSharedVaultInvitesSentByUser),
  1144. container.get(TYPES.Sync_GetSharedVaultInvitesSentToUser),
  1145. container.get(TYPES.Sync_SharedVaultInviteHttpMapper),
  1146. container.get(TYPES.Sync_ControllerContainer),
  1147. ),
  1148. )
  1149. container
  1150. .bind<BaseSharedVaultUsersController>(TYPES.Sync_BaseSharedVaultUsersController)
  1151. .toConstantValue(
  1152. new BaseSharedVaultUsersController(
  1153. container.get<GetSharedVaultUsers>(TYPES.Sync_GetSharedVaultUsers),
  1154. container.get<RemoveUserFromSharedVault>(TYPES.Sync_RemoveSharedVaultUser),
  1155. container.get<DesignateSurvivor>(TYPES.Sync_DesignateSurvivor),
  1156. container.get<MapperInterface<SharedVaultUser, SharedVaultUserHttpRepresentation>>(
  1157. TYPES.Sync_SharedVaultUserHttpMapper,
  1158. ),
  1159. container.get<ControllerContainerInterface>(TYPES.Sync_ControllerContainer),
  1160. ),
  1161. )
  1162. container
  1163. .bind<BaseSharedVaultsController>(TYPES.Sync_BaseSharedVaultsController)
  1164. .toConstantValue(
  1165. new BaseSharedVaultsController(
  1166. container.get(TYPES.Sync_GetSharedVaults),
  1167. container.get(TYPES.Sync_CreateSharedVault),
  1168. container.get(TYPES.Sync_DeleteSharedVault),
  1169. container.get(TYPES.Sync_CreateSharedVaultFileValetToken),
  1170. container.get(TYPES.Sync_SharedVaultHttpMapper),
  1171. container.get(TYPES.Sync_SharedVaultUserHttpMapper),
  1172. container.get(TYPES.Sync_ControllerContainer),
  1173. ),
  1174. )
  1175. container
  1176. .bind<BaseMessagesController>(TYPES.Sync_BaseMessagesController)
  1177. .toConstantValue(
  1178. new BaseMessagesController(
  1179. container.get(TYPES.Sync_GetMessagesSentToUser),
  1180. container.get(TYPES.Sync_GetMessagesSentByUser),
  1181. container.get(TYPES.Sync_SendMessageToUser),
  1182. container.get(TYPES.Sync_DeleteAllMessagesSentToUser),
  1183. container.get(TYPES.Sync_DeleteMessage),
  1184. container.get(TYPES.Sync_MessageHttpMapper),
  1185. container.get(TYPES.Sync_ControllerContainer),
  1186. ),
  1187. )
  1188. }
  1189. logger.debug('Configuration complete')
  1190. return container
  1191. }
  1192. }