Container.ts 49 KB

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