diff --git a/docker-compose.ci.yml b/docker-compose.ci.yml index 77cbdc02e..aa92f1b74 100644 --- a/docker-compose.ci.yml +++ b/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: diff --git a/packages/revisions/src/Bootstrap/Container.ts b/packages/revisions/src/Bootstrap/Container.ts index 47502b3e6..8fd4f9baa 100644 --- a/packages/revisions/src/Bootstrap/Container.ts +++ b/packages/revisions/src/Bootstrap/Container.ts @@ -419,6 +419,7 @@ export class ContainerConfigLoader { new ItemDumpedEventHandler( container.get(TYPES.Revisions_DumpRepository), container.get(TYPES.Revisions_RevisionRepositoryResolver), + container.get(TYPES.Revisions_Logger), ), ) container diff --git a/packages/revisions/src/Domain/Handler/ItemDumpedEventHandler.spec.ts b/packages/revisions/src/Domain/Handler/ItemDumpedEventHandler.spec.ts index a2a3d7984..476e266d3 100644 --- a/packages/revisions/src/Domain/Handler/ItemDumpedEventHandler.spec.ts +++ b/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.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 dumpRepository.getRevisionFromDumpPath = jest.fn().mockReturnValue(revision) @@ -32,6 +46,10 @@ describe('ItemDumpedEventHandler', () => { fileDumpPath: 'foobar', roleNames: ['CORE_USER'], } + + logger = {} as jest.Mocked + logger.debug = jest.fn() + logger.error = jest.fn() }) it('should save a revision from file dump', async () => { diff --git a/packages/revisions/src/Domain/Handler/ItemDumpedEventHandler.ts b/packages/revisions/src/Domain/Handler/ItemDumpedEventHandler.ts index 5038f2b83..2ffe892fa 100644 --- a/packages/revisions/src/Domain/Handler/ItemDumpedEventHandler.ts +++ b/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 { 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) } diff --git a/packages/syncing-server/src/Infra/FS/FSItemBackupService.ts b/packages/syncing-server/src/Infra/FS/FSItemBackupService.ts index abec72d37..47d31ce72 100644 --- a/packages/syncing-server/src/Infra/FS/FSItemBackupService.ts +++ b/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 } } diff --git a/packages/syncing-server/src/Infra/TypeORM/TypeORMSharedVaultInviteRepository.ts b/packages/syncing-server/src/Infra/TypeORM/TypeORMSharedVaultInviteRepository.ts index b00946117..c3cc63e0e 100644 --- a/packages/syncing-server/src/Infra/TypeORM/TypeORMSharedVaultInviteRepository.ts +++ b/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,