Browse Source

fix(syncing-server): add more logs on successfull email backups requested

Karol Sójko 1 year ago
parent
commit
8c57f505be

+ 0 - 132
packages/syncing-server/src/Domain/Handler/DuplicateItemSyncedEventHandler.spec.ts

@@ -1,132 +0,0 @@
-import 'reflect-metadata'
-
-import {
-  DomainEventPublisherInterface,
-  DuplicateItemSyncedEvent,
-  RevisionsCopyRequestedEvent,
-} from '@standardnotes/domain-events'
-import { Logger } from 'winston'
-import { Item } from '../Item/Item'
-import { ItemRepositoryInterface } from '../Item/ItemRepositoryInterface'
-import { DuplicateItemSyncedEventHandler } from './DuplicateItemSyncedEventHandler'
-import { DomainEventFactoryInterface } from '../Event/DomainEventFactoryInterface'
-import { Uuid, ContentType, Dates, Timestamps, UniqueEntityId } from '@standardnotes/domain-core'
-import { ItemRepositoryResolverInterface } from '../Item/ItemRepositoryResolverInterface'
-
-describe('DuplicateItemSyncedEventHandler', () => {
-  let itemRepositoryResolver: ItemRepositoryResolverInterface
-  let itemRepository: ItemRepositoryInterface
-  let logger: Logger
-  let duplicateItem: Item
-  let originalItem: Item
-  let event: DuplicateItemSyncedEvent
-  let domainEventFactory: DomainEventFactoryInterface
-  let domainEventPublisher: DomainEventPublisherInterface
-
-  const createHandler = () =>
-    new DuplicateItemSyncedEventHandler(itemRepositoryResolver, domainEventFactory, domainEventPublisher, logger)
-
-  beforeEach(() => {
-    originalItem = Item.create(
-      {
-        userUuid: Uuid.create('00000000-0000-0000-0000-000000000000').getValue(),
-        updatedWithSession: null,
-        content: 'foobar',
-        contentType: ContentType.create(ContentType.TYPES.Note).getValue(),
-        encItemKey: null,
-        authHash: null,
-        itemsKeyId: null,
-        duplicateOf: null,
-        deleted: false,
-        dates: Dates.create(new Date(1616164633241311), new Date(1616164633241311)).getValue(),
-        timestamps: Timestamps.create(1616164633241311, 1616164633241311).getValue(),
-      },
-      new UniqueEntityId('00000000-0000-0000-0000-000000000000'),
-    ).getValue()
-
-    duplicateItem = Item.create(
-      {
-        userUuid: Uuid.create('00000000-0000-0000-0000-000000000000').getValue(),
-        updatedWithSession: null,
-        content: 'foobar',
-        contentType: ContentType.create(ContentType.TYPES.Note).getValue(),
-        encItemKey: null,
-        authHash: null,
-        itemsKeyId: null,
-        duplicateOf: Uuid.create('00000000-0000-0000-0000-000000000000').getValue(),
-        deleted: false,
-        dates: Dates.create(new Date(1616164633241311), new Date(1616164633241311)).getValue(),
-        timestamps: Timestamps.create(1616164633241311, 1616164633241311).getValue(),
-      },
-      new UniqueEntityId('00000000-0000-0000-0000-000000000001'),
-    ).getValue()
-
-    itemRepository = {} as jest.Mocked<ItemRepositoryInterface>
-    itemRepository.findByUuidAndUserUuid = jest
-      .fn()
-      .mockReturnValueOnce(duplicateItem)
-      .mockReturnValueOnce(originalItem)
-
-    itemRepositoryResolver = {} as jest.Mocked<ItemRepositoryResolverInterface>
-    itemRepositoryResolver.resolve = jest.fn().mockReturnValue(itemRepository)
-
-    logger = {} as jest.Mocked<Logger>
-    logger.warn = jest.fn()
-    logger.debug = jest.fn()
-
-    event = {} as jest.Mocked<DuplicateItemSyncedEvent>
-    event.createdAt = new Date(1)
-    event.payload = {
-      userUuid: '1-2-3',
-      itemUuid: '2-3-4',
-      roleNames: ['CORE_USER'],
-    }
-
-    domainEventFactory = {} as jest.Mocked<DomainEventFactoryInterface>
-    domainEventFactory.createRevisionsCopyRequestedEvent = jest
-      .fn()
-      .mockReturnValue({} as jest.Mocked<RevisionsCopyRequestedEvent>)
-
-    domainEventPublisher = {} as jest.Mocked<DomainEventPublisherInterface>
-    domainEventPublisher.publish = jest.fn()
-  })
-
-  it('should copy revisions from original item to the duplicate item', async () => {
-    await createHandler().handle(event)
-
-    expect(domainEventPublisher.publish).toHaveBeenCalled()
-  })
-
-  it('should do nothing if role names are not valid', async () => {
-    event.payload.roleNames = ['INVALID_ROLE_NAME']
-
-    await createHandler().handle(event)
-
-    expect(domainEventPublisher.publish).not.toHaveBeenCalled()
-  })
-
-  it('should not copy revisions if original item does not exist', async () => {
-    itemRepository.findByUuidAndUserUuid = jest.fn().mockReturnValueOnce(duplicateItem).mockReturnValueOnce(null)
-    itemRepositoryResolver.resolve = jest.fn().mockReturnValue(itemRepository)
-
-    await createHandler().handle(event)
-
-    expect(domainEventPublisher.publish).not.toHaveBeenCalled()
-  })
-
-  it('should not copy revisions if duplicate item does not exist', async () => {
-    itemRepository.findByUuidAndUserUuid = jest.fn().mockReturnValueOnce(null).mockReturnValueOnce(originalItem)
-    itemRepositoryResolver.resolve = jest.fn().mockReturnValue(itemRepository)
-
-    await createHandler().handle(event)
-
-    expect(domainEventPublisher.publish).not.toHaveBeenCalled()
-  })
-
-  it('should not copy revisions if duplicate item is not pointing to duplicate anything', async () => {
-    duplicateItem.props.duplicateOf = null
-    await createHandler().handle(event)
-
-    expect(domainEventPublisher.publish).not.toHaveBeenCalled()
-  })
-})

+ 0 - 137
packages/syncing-server/src/Domain/Handler/EmailBackupRequestedEventHandler.spec.ts

@@ -1,137 +0,0 @@
-import 'reflect-metadata'
-
-import {
-  DomainEventPublisherInterface,
-  EmailBackupRequestedEvent,
-  EmailRequestedEvent,
-} from '@standardnotes/domain-events'
-import { Logger } from 'winston'
-import { AuthHttpServiceInterface } from '../Auth/AuthHttpServiceInterface'
-import { DomainEventFactoryInterface } from '../Event/DomainEventFactoryInterface'
-import { Item } from '../Item/Item'
-import { ItemBackupServiceInterface } from '../Item/ItemBackupServiceInterface'
-import { ItemRepositoryInterface } from '../Item/ItemRepositoryInterface'
-import { EmailBackupRequestedEventHandler } from './EmailBackupRequestedEventHandler'
-import { ItemTransferCalculatorInterface } from '../Item/ItemTransferCalculatorInterface'
-import { ItemContentSizeDescriptor } from '../Item/ItemContentSizeDescriptor'
-
-describe('EmailBackupRequestedEventHandler', () => {
-  let primaryItemRepository: ItemRepositoryInterface
-  let secondaryItemRepository: ItemRepositoryInterface | null
-  let authHttpService: AuthHttpServiceInterface
-  let itemBackupService: ItemBackupServiceInterface
-  let domainEventPublisher: DomainEventPublisherInterface
-  let domainEventFactory: DomainEventFactoryInterface
-  const emailAttachmentMaxByteSize = 100
-  let itemTransferCalculator: ItemTransferCalculatorInterface
-  let item: Item
-  let event: EmailBackupRequestedEvent
-  let logger: Logger
-
-  const createHandler = () =>
-    new EmailBackupRequestedEventHandler(
-      primaryItemRepository,
-      secondaryItemRepository,
-      authHttpService,
-      itemBackupService,
-      domainEventPublisher,
-      domainEventFactory,
-      emailAttachmentMaxByteSize,
-      itemTransferCalculator,
-      's3-backup-bucket-name',
-      logger,
-    )
-
-  beforeEach(() => {
-    item = {} as jest.Mocked<Item>
-
-    primaryItemRepository = {} as jest.Mocked<ItemRepositoryInterface>
-    primaryItemRepository.findAll = jest.fn().mockReturnValue([item])
-    primaryItemRepository.findContentSizeForComputingTransferLimit = jest
-      .fn()
-      .mockResolvedValue([ItemContentSizeDescriptor.create('00000000-0000-0000-0000-000000000000', 20).getValue()])
-
-    authHttpService = {} as jest.Mocked<AuthHttpServiceInterface>
-    authHttpService.getUserKeyParams = jest.fn().mockReturnValue({ identifier: 'test@test.com' })
-
-    event = {} as jest.Mocked<EmailBackupRequestedEvent>
-    event.createdAt = new Date(1)
-    event.payload = {
-      userUuid: '1-2-3',
-      userHasEmailsMuted: false,
-      muteEmailsSettingUuid: '1-2-3',
-    }
-
-    itemBackupService = {} as jest.Mocked<ItemBackupServiceInterface>
-    itemBackupService.backup = jest.fn().mockReturnValue(['backup-file-name'])
-
-    domainEventPublisher = {} as jest.Mocked<DomainEventPublisherInterface>
-    domainEventPublisher.publish = jest.fn()
-
-    domainEventFactory = {} as jest.Mocked<DomainEventFactoryInterface>
-    domainEventFactory.createEmailRequestedEvent = jest.fn().mockReturnValue({} as jest.Mocked<EmailRequestedEvent>)
-
-    itemTransferCalculator = {} as jest.Mocked<ItemTransferCalculatorInterface>
-    itemTransferCalculator.computeItemUuidBundlesToFetch = jest.fn().mockReturnValue([['1-2-3']])
-
-    logger = {} as jest.Mocked<Logger>
-    logger.debug = jest.fn()
-    logger.warn = jest.fn()
-    logger.error = jest.fn()
-  })
-
-  it('should inform that backup attachment for email was created', async () => {
-    await createHandler().handle(event)
-
-    expect(domainEventPublisher.publish).toHaveBeenCalledTimes(1)
-    expect(domainEventFactory.createEmailRequestedEvent).toHaveBeenCalled()
-  })
-
-  it('should inform that backup attachment for email was created in the secondary repository', async () => {
-    secondaryItemRepository = {} as jest.Mocked<ItemRepositoryInterface>
-    secondaryItemRepository.findAll = jest.fn().mockReturnValue([item])
-    secondaryItemRepository.findContentSizeForComputingTransferLimit = jest
-      .fn()
-      .mockResolvedValue([ItemContentSizeDescriptor.create('00000000-0000-0000-0000-000000000000', 20).getValue()])
-
-    await createHandler().handle(event)
-
-    expect(domainEventPublisher.publish).toHaveBeenCalledTimes(2)
-    expect(domainEventFactory.createEmailRequestedEvent).toHaveBeenCalledTimes(2)
-
-    secondaryItemRepository = null
-  })
-
-  it('should inform that multipart backup attachment for email was created', async () => {
-    itemBackupService.backup = jest
-      .fn()
-      .mockReturnValueOnce(['backup-file-name-1'])
-      .mockReturnValueOnce(['backup-file-name-2', 'backup-file-name-3'])
-    itemTransferCalculator.computeItemUuidBundlesToFetch = jest.fn().mockReturnValue([['1-2-3'], ['2-3-4']])
-
-    await createHandler().handle(event)
-
-    expect(domainEventPublisher.publish).toHaveBeenCalledTimes(3)
-    expect(domainEventFactory.createEmailRequestedEvent).toHaveBeenCalledTimes(3)
-  })
-
-  it('should not inform that backup attachment for email was created if user key params cannot be obtained', async () => {
-    authHttpService.getUserKeyParams = jest.fn().mockImplementation(() => {
-      throw new Error('Oops!')
-    })
-
-    await createHandler().handle(event)
-
-    expect(domainEventPublisher.publish).not.toHaveBeenCalled()
-    expect(domainEventFactory.createEmailRequestedEvent).not.toHaveBeenCalled()
-  })
-
-  it('should not inform that backup attachment for email was created if backup file name is empty', async () => {
-    itemBackupService.backup = jest.fn().mockReturnValue('')
-
-    await createHandler().handle(event)
-
-    expect(domainEventPublisher.publish).not.toHaveBeenCalled()
-    expect(domainEventFactory.createEmailRequestedEvent).not.toHaveBeenCalled()
-  })
-})

+ 5 - 1
packages/syncing-server/src/Domain/Handler/EmailBackupRequestedEventHandler.ts

@@ -34,6 +34,8 @@ export class EmailBackupRequestedEventHandler implements DomainEventHandlerInter
     if (this.secondaryItemRepository) {
       await this.requestEmailWithBackupFile(event, this.secondaryItemRepository)
     }
+
+    this.logger.info(`Email with backup requested for user ${event.payload.userUuid}`)
   }
 
   private async requestEmailWithBackupFile(
@@ -47,7 +49,9 @@ export class EmailBackupRequestedEventHandler implements DomainEventHandlerInter
         authenticated: false,
       })
     } catch (error) {
-      this.logger.error(`Could not get user key params from auth service: ${JSON.stringify(error)}`)
+      this.logger.error(
+        `Could not get user key params from auth service for user ${event.payload.userUuid}: ${JSON.stringify(error)}`,
+      )
 
       return
     }