Browse Source

chore: add logs for failed item dumps

Karol Sójko 1 year ago
parent
commit
aa2b5f3b74

+ 3 - 3
docker-compose.ci.yml

@@ -53,7 +53,7 @@ services:
     image: mysql:8
     container_name: db-ci
     env_file: .github/ci.env
-    expose:
+    ports:
       - 3306
     restart: unless-stopped
     command: --default-authentication-plugin=mysql_native_password --character-set-server=utf8mb4 --collation-server=utf8mb4_general_ci
@@ -66,7 +66,7 @@ services:
   secondary_db:
     image: mongo:5.0
     container_name: secondary_db-ci
-    expose:
+    ports:
       - 27017
     restart: unless-stopped
     volumes:
@@ -83,7 +83,7 @@ services:
     container_name: cache-ci
     volumes:
       - ./data/redis/:/data
-    expose:
+    ports:
       - 6379
     restart: unless-stopped
     networks:

+ 1 - 0
packages/revisions/src/Bootstrap/Container.ts

@@ -419,6 +419,7 @@ export class ContainerConfigLoader {
         new ItemDumpedEventHandler(
           container.get<DumpRepositoryInterface>(TYPES.Revisions_DumpRepository),
           container.get<RevisionRepositoryResolverInterface>(TYPES.Revisions_RevisionRepositoryResolver),
+          container.get<winston.Logger>(TYPES.Revisions_Logger),
         ),
       )
     container

+ 20 - 2
packages/revisions/src/Domain/Handler/ItemDumpedEventHandler.spec.ts

@@ -1,4 +1,7 @@
 import { ItemDumpedEvent } from '@standardnotes/domain-events'
+import { Logger } from 'winston'
+import { Uuid, ContentType, Dates } from '@standardnotes/domain-core'
+
 import { DumpRepositoryInterface } from '../Dump/DumpRepositoryInterface'
 import { Revision } from '../Revision/Revision'
 import { RevisionRepositoryInterface } from '../Revision/RevisionRepositoryInterface'
@@ -11,11 +14,22 @@ describe('ItemDumpedEventHandler', () => {
   let revisionRepositoryResolver: RevisionRepositoryResolverInterface
   let revision: Revision
   let event: ItemDumpedEvent
+  let logger: Logger
 
-  const createHandler = () => new ItemDumpedEventHandler(dumpRepository, revisionRepositoryResolver)
+  const createHandler = () => new ItemDumpedEventHandler(dumpRepository, revisionRepositoryResolver, logger)
 
   beforeEach(() => {
-    revision = {} as jest.Mocked<Revision>
+    revision = Revision.create({
+      itemUuid: Uuid.create('84c0f8e8-544a-4c7e-9adf-26209303bc1d').getValue(),
+      userUuid: Uuid.create('84c0f8e8-544a-4c7e-9adf-26209303bc1d').getValue(),
+      content: 'test',
+      contentType: ContentType.create('Note').getValue(),
+      itemsKeyId: 'test',
+      encItemKey: 'test',
+      authHash: 'test',
+      creationDate: new Date(1),
+      dates: Dates.create(new Date(1), new Date(2)).getValue(),
+    }).getValue()
 
     dumpRepository = {} as jest.Mocked<DumpRepositoryInterface>
     dumpRepository.getRevisionFromDumpPath = jest.fn().mockReturnValue(revision)
@@ -32,6 +46,10 @@ describe('ItemDumpedEventHandler', () => {
       fileDumpPath: 'foobar',
       roleNames: ['CORE_USER'],
     }
+
+    logger = {} as jest.Mocked<Logger>
+    logger.debug = jest.fn()
+    logger.error = jest.fn()
   })
 
   it('should save a revision from file dump', async () => {

+ 10 - 1
packages/revisions/src/Domain/Handler/ItemDumpedEventHandler.ts

@@ -3,16 +3,20 @@ import { DomainEventHandlerInterface, ItemDumpedEvent } from '@standardnotes/dom
 import { DumpRepositoryInterface } from '../Dump/DumpRepositoryInterface'
 import { RevisionRepositoryResolverInterface } from '../Revision/RevisionRepositoryResolverInterface'
 import { RoleNameCollection } from '@standardnotes/domain-core'
+import { Logger } from 'winston'
 
 export class ItemDumpedEventHandler implements DomainEventHandlerInterface {
   constructor(
     private dumpRepository: DumpRepositoryInterface,
     private revisionRepositoryResolver: RevisionRepositoryResolverInterface,
+    private logger: Logger,
   ) {}
 
   async handle(event: ItemDumpedEvent): Promise<void> {
     const revision = await this.dumpRepository.getRevisionFromDumpPath(event.payload.fileDumpPath)
     if (revision === null) {
+      this.logger.error(`Revision not found for dump path ${event.payload.fileDumpPath}`)
+
       await this.dumpRepository.removeDump(event.payload.fileDumpPath)
 
       return
@@ -20,6 +24,8 @@ export class ItemDumpedEventHandler implements DomainEventHandlerInterface {
 
     const roleNamesOrError = RoleNameCollection.create(event.payload.roleNames)
     if (roleNamesOrError.isFailed()) {
+      this.logger.error(`Invalid role names ${event.payload.roleNames}`)
+
       await this.dumpRepository.removeDump(event.payload.fileDumpPath)
 
       return
@@ -28,7 +34,10 @@ export class ItemDumpedEventHandler implements DomainEventHandlerInterface {
 
     const revisionRepository = this.revisionRepositoryResolver.resolve(roleNames)
 
-    await revisionRepository.insert(revision)
+    const successfullyInserted = await revisionRepository.insert(revision)
+    if (!successfullyInserted) {
+      this.logger.error(`Could not insert revision ${revision.id.toString()}`)
+    }
 
     await this.dumpRepository.removeDump(event.payload.fileDumpPath)
   }

+ 6 - 0
packages/syncing-server/src/Infra/FS/FSItemBackupService.ts

@@ -33,6 +33,12 @@ export class FSItemBackupService implements ItemBackupServiceInterface {
 
     await promises.writeFile(path, contents)
 
+    const fileCreated = (await promises.stat(path)).isFile()
+
+    if (!fileCreated) {
+      throw new Error(`Could not create dump file ${path}`)
+    }
+
     return path
   }
 }

+ 1 - 1
packages/syncing-server/src/Infra/TypeORM/TypeORMSharedVaultInviteRepository.ts

@@ -32,7 +32,7 @@ export class TypeORMSharedVaultInviteRepository implements SharedVaultInviteRepo
     const persistence = await this.ormRepository
       .createQueryBuilder('shared_vault_invite')
       .where('shared_vault_invite.sender_uuid = :uuid', {
-        senderUuid: dto.senderUuid.value,
+        uuid: dto.senderUuid.value,
       })
       .andWhere('shared_vault_invite.shared_vault_uuid = :sharedVaultUuid', {
         sharedVaultUuid: dto.sharedVaultUuid.value,