Container.ts 63 KB

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