Container.ts 56 KB

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