Explorar el Código

feat(revisions): add updating user uuid on revisions in async processing

Karol Sójko hace 2 años
padre
commit
0f67aa4058

+ 7 - 0
packages/domain-events/src/Domain/Event/RevisionsOwnershipUpdateRequestedEvent.ts

@@ -0,0 +1,7 @@
+import { DomainEventInterface } from './DomainEventInterface'
+import { RevisionsOwnershipUpdateRequestedEventPayload } from './RevisionsOwnershipUpdateRequestedEventPayload'
+
+export interface RevisionsOwnershipUpdateRequestedEvent extends DomainEventInterface {
+  type: 'REVISIONS_OWNERSHIP_UPDATE_REQUESTED'
+  payload: RevisionsOwnershipUpdateRequestedEventPayload
+}

+ 4 - 0
packages/domain-events/src/Domain/Event/RevisionsOwnershipUpdateRequestedEventPayload.ts

@@ -0,0 +1,4 @@
+export interface RevisionsOwnershipUpdateRequestedEventPayload {
+  itemUuid: string
+  userUuid: string
+}

+ 2 - 0
packages/domain-events/src/Domain/index.ts

@@ -76,6 +76,8 @@ export * from './Event/RefundProcessedEvent'
 export * from './Event/RefundProcessedEventPayload'
 export * from './Event/RefundProcessedEventPayload'
 export * from './Event/RevisionsCopyRequestedEvent'
 export * from './Event/RevisionsCopyRequestedEvent'
 export * from './Event/RevisionsCopyRequestedEventPayload'
 export * from './Event/RevisionsCopyRequestedEventPayload'
+export * from './Event/RevisionsOwnershipUpdateRequestedEvent'
+export * from './Event/RevisionsOwnershipUpdateRequestedEventPayload'
 export * from './Event/SharedSubscriptionInvitationCanceledEvent'
 export * from './Event/SharedSubscriptionInvitationCanceledEvent'
 export * from './Event/SharedSubscriptionInvitationCanceledEventPayload'
 export * from './Event/SharedSubscriptionInvitationCanceledEventPayload'
 export * from './Event/SharedSubscriptionInvitationCreatedEvent'
 export * from './Event/SharedSubscriptionInvitationCreatedEvent'

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

@@ -41,6 +41,7 @@ import { DeleteRevision } from '../Domain/UseCase/DeleteRevision/DeleteRevision'
 import { AccountDeletionRequestedEventHandler } from '../Domain/Handler/AccountDeletionRequestedEventHandler'
 import { AccountDeletionRequestedEventHandler } from '../Domain/Handler/AccountDeletionRequestedEventHandler'
 import { RevisionsCopyRequestedEventHandler } from '../Domain/Handler/RevisionsCopyRequestedEventHandler'
 import { RevisionsCopyRequestedEventHandler } from '../Domain/Handler/RevisionsCopyRequestedEventHandler'
 import { CopyRevisions } from '../Domain/UseCase/CopyRevisions/CopyRevisions'
 import { CopyRevisions } from '../Domain/UseCase/CopyRevisions/CopyRevisions'
+import { RevisionsOwnershipUpdateRequestedEventHandler } from '../Domain/Handler/RevisionsOwnershipUpdateRequestedEventHandler'
 
 
 // eslint-disable-next-line @typescript-eslint/no-var-requires
 // eslint-disable-next-line @typescript-eslint/no-var-requires
 const newrelicFormatter = require('@newrelic/winston-enricher')
 const newrelicFormatter = require('@newrelic/winston-enricher')
@@ -195,6 +196,9 @@ export class ContainerConfigLoader {
       .toConstantValue(
       .toConstantValue(
         new RevisionsCopyRequestedEventHandler(container.get(TYPES.CopyRevisions), container.get(TYPES.Logger)),
         new RevisionsCopyRequestedEventHandler(container.get(TYPES.CopyRevisions), container.get(TYPES.Logger)),
       )
       )
+    container
+      .bind<RevisionsOwnershipUpdateRequestedEventHandler>(TYPES.RevisionsOwnershipUpdateRequestedEventHandler)
+      .toConstantValue(new RevisionsOwnershipUpdateRequestedEventHandler(container.get(TYPES.RevisionRepository)))
 
 
     // Services
     // Services
     container
     container
@@ -210,6 +214,7 @@ export class ContainerConfigLoader {
       ['ITEM_DUMPED', container.get(TYPES.ItemDumpedEventHandler)],
       ['ITEM_DUMPED', container.get(TYPES.ItemDumpedEventHandler)],
       ['ACCOUNT_DELETION_REQUESTED', container.get(TYPES.AccountDeletionRequestedEventHandler)],
       ['ACCOUNT_DELETION_REQUESTED', container.get(TYPES.AccountDeletionRequestedEventHandler)],
       ['REVISIONS_COPY_REQUESTED', container.get(TYPES.RevisionsCopyRequestedEventHandler)],
       ['REVISIONS_COPY_REQUESTED', container.get(TYPES.RevisionsCopyRequestedEventHandler)],
+      ['REVISIONS_OWNERSHIP_UPDATE_REQUESTED', container.get(TYPES.RevisionsOwnershipUpdateRequestedEventHandler)],
     ])
     ])
 
 
     if (env.get('SQS_QUEUE_URL', true)) {
     if (env.get('SQS_QUEUE_URL', true)) {

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

@@ -34,6 +34,7 @@ const TYPES = {
   ItemDumpedEventHandler: Symbol.for('ItemDumpedEventHandler'),
   ItemDumpedEventHandler: Symbol.for('ItemDumpedEventHandler'),
   AccountDeletionRequestedEventHandler: Symbol.for('AccountDeletionRequestedEventHandler'),
   AccountDeletionRequestedEventHandler: Symbol.for('AccountDeletionRequestedEventHandler'),
   RevisionsCopyRequestedEventHandler: Symbol.for('RevisionsCopyRequestedEventHandler'),
   RevisionsCopyRequestedEventHandler: Symbol.for('RevisionsCopyRequestedEventHandler'),
+  RevisionsOwnershipUpdateRequestedEventHandler: Symbol.for('RevisionsOwnershipUpdateRequestedEventHandler'),
   // Services
   // Services
   CrossServiceTokenDecoder: Symbol.for('CrossServiceTokenDecoder'),
   CrossServiceTokenDecoder: Symbol.for('CrossServiceTokenDecoder'),
   DomainEventSubscriberFactory: Symbol.for('DomainEventSubscriberFactory'),
   DomainEventSubscriberFactory: Symbol.for('DomainEventSubscriberFactory'),

+ 25 - 0
packages/revisions/src/Domain/Handler/RevisionsOwnershipUpdateRequestedEventHandler.ts

@@ -0,0 +1,25 @@
+/* istanbul ignore file */
+
+import { Uuid } from '@standardnotes/domain-core'
+import { DomainEventHandlerInterface, RevisionsOwnershipUpdateRequestedEvent } from '@standardnotes/domain-events'
+import { RevisionRepositoryInterface } from '../Revision/RevisionRepositoryInterface'
+
+export class RevisionsOwnershipUpdateRequestedEventHandler implements DomainEventHandlerInterface {
+  constructor(private revisionRepository: RevisionRepositoryInterface) {}
+
+  async handle(event: RevisionsOwnershipUpdateRequestedEvent): Promise<void> {
+    const userUuidOrError = Uuid.create(event.payload.userUuid)
+    if (userUuidOrError.isFailed()) {
+      return
+    }
+    const userUuid = userUuidOrError.getValue()
+
+    const itemUuidOrError = Uuid.create(event.payload.itemUuid)
+    if (itemUuidOrError.isFailed()) {
+      return
+    }
+    const itemUuid = itemUuidOrError.getValue()
+
+    await this.revisionRepository.updateUserUuid(itemUuid, userUuid)
+  }
+}

+ 1 - 0
packages/revisions/src/Domain/Revision/RevisionRepositoryInterface.ts

@@ -9,5 +9,6 @@ export interface RevisionRepositoryInterface {
   findOneByUuid(revisionUuid: Uuid, userUuid: Uuid): Promise<Revision | null>
   findOneByUuid(revisionUuid: Uuid, userUuid: Uuid): Promise<Revision | null>
   findByItemUuid(itemUuid: Uuid): Promise<Array<Revision>>
   findByItemUuid(itemUuid: Uuid): Promise<Array<Revision>>
   findMetadataByItemId(itemUuid: Uuid, userUuid: Uuid): Promise<Array<RevisionMetadata>>
   findMetadataByItemId(itemUuid: Uuid, userUuid: Uuid): Promise<Array<RevisionMetadata>>
+  updateUserUuid(itemUuid: Uuid, userUuid: Uuid): Promise<void>
   save(revision: Revision): Promise<Revision>
   save(revision: Revision): Promise<Revision>
 }
 }

+ 11 - 0
packages/revisions/src/Infra/MySQL/MySQLRevisionRepository.ts

@@ -13,6 +13,17 @@ export class MySQLRevisionRepository implements RevisionRepositoryInterface {
     private revisionMapper: MapperInterface<Revision, TypeORMRevision>,
     private revisionMapper: MapperInterface<Revision, TypeORMRevision>,
   ) {}
   ) {}
 
 
+  async updateUserUuid(itemUuid: Uuid, userUuid: Uuid): Promise<void> {
+    await this.ormRepository
+      .createQueryBuilder()
+      .update()
+      .set({
+        userUuid: userUuid.value,
+      })
+      .where('item_uuid = :itemUuid', { itemUuid: itemUuid.value })
+      .execute()
+  }
+
   async findByItemUuid(itemUuid: Uuid): Promise<Revision[]> {
   async findByItemUuid(itemUuid: Uuid): Promise<Revision[]> {
     const typeormRevisions = await this.ormRepository
     const typeormRevisions = await this.ormRepository
       .createQueryBuilder()
       .createQueryBuilder()