Selaa lähdekoodia

fix: setting status for already migrated users

Karol Sójko 1 vuosi sitten
vanhempi
commit
9be4c002b7

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

@@ -443,6 +443,7 @@ export class ContainerConfigLoader {
       .bind<TransitionStatusUpdatedEventHandler>(TYPES.Revisions_TransitionStatusUpdatedEventHandler)
       .toConstantValue(
         new TransitionStatusUpdatedEventHandler(
+          container.get<RevisionRepositoryInterface>(TYPES.Revisions_SQLRevisionRepository),
           container.get<TransitionRevisionsFromPrimaryToSecondaryDatabaseForUser>(
             TYPES.Revisions_TransitionRevisionsFromPrimaryToSecondaryDatabaseForUser,
           ),

+ 45 - 0
packages/revisions/src/Domain/Handler/TransitionStatusUpdatedEventHandler.ts

@@ -6,9 +6,12 @@ import {
 import { Logger } from 'winston'
 import { DomainEventFactoryInterface } from '../Event/DomainEventFactoryInterface'
 import { TransitionRevisionsFromPrimaryToSecondaryDatabaseForUser } from '../UseCase/Transition/TransitionRevisionsFromPrimaryToSecondaryDatabaseForUser/TransitionRevisionsFromPrimaryToSecondaryDatabaseForUser'
+import { Uuid } from '@standardnotes/domain-core'
+import { RevisionRepositoryInterface } from '../Revision/RevisionRepositoryInterface'
 
 export class TransitionStatusUpdatedEventHandler implements DomainEventHandlerInterface {
   constructor(
+    private primaryRevisionsRepository: RevisionRepositoryInterface,
     private transitionRevisionsFromPrimaryToSecondaryDatabaseForUser: TransitionRevisionsFromPrimaryToSecondaryDatabaseForUser,
     private domainEventPublisher: DomainEventPublisherInterface,
     private domainEventFactory: DomainEventFactoryInterface,
@@ -29,6 +32,36 @@ export class TransitionStatusUpdatedEventHandler implements DomainEventHandlerIn
     }
 
     if (event.payload.status === 'STARTED' && event.payload.transitionType === 'revisions') {
+      const userUuidOrError = Uuid.create(event.payload.userUuid)
+      if (userUuidOrError.isFailed()) {
+        this.logger.error(
+          `Failed to transition revisions for user ${event.payload.userUuid}: ${userUuidOrError.getError()}`,
+        )
+        await this.domainEventPublisher.publish(
+          this.domainEventFactory.createTransitionStatusUpdatedEvent({
+            userUuid: event.payload.userUuid,
+            status: 'FAILED',
+            transitionType: 'revisions',
+          }),
+        )
+
+        return
+      }
+
+      if (await this.isAlreadyMigrated(userUuidOrError.getValue())) {
+        this.logger.info(`Revisions for user ${event.payload.userUuid} are already migrated`)
+
+        await this.domainEventPublisher.publish(
+          this.domainEventFactory.createTransitionStatusUpdatedEvent({
+            userUuid: event.payload.userUuid,
+            status: 'FINISHED',
+            transitionType: 'revisions',
+          }),
+        )
+
+        return
+      }
+
       await this.domainEventPublisher.publish(
         this.domainEventFactory.createTransitionStatusUpdatedEvent({
           userUuid: event.payload.userUuid,
@@ -66,4 +99,16 @@ export class TransitionStatusUpdatedEventHandler implements DomainEventHandlerIn
       return
     }
   }
+
+  private async isAlreadyMigrated(userUuid: Uuid): Promise<boolean> {
+    const totalRevisionsCountForUserInPrimary = await this.primaryRevisionsRepository.countByUserUuid(userUuid)
+
+    if (totalRevisionsCountForUserInPrimary > 0) {
+      this.logger.info(
+        `User ${userUuid.value} has ${totalRevisionsCountForUserInPrimary} revisions in primary database.`,
+      )
+    }
+
+    return totalRevisionsCountForUserInPrimary === 0
+  }
 }

+ 0 - 18
packages/revisions/src/Domain/UseCase/Transition/TransitionRevisionsFromPrimaryToSecondaryDatabaseForUser/TransitionRevisionsFromPrimaryToSecondaryDatabaseForUser.ts

@@ -29,12 +29,6 @@ export class TransitionRevisionsFromPrimaryToSecondaryDatabaseForUser implements
     }
     const userUuid = userUuidOrError.getValue()
 
-    if (await this.isAlreadyMigrated(userUuid)) {
-      this.logger.info(`Revisions for user ${userUuid.value} are already migrated`)
-
-      return Result.ok()
-    }
-
     let newRevisionsInSecondaryCount = 0
     if (await this.hasAlreadyDataInSecondaryDatabase(userUuid)) {
       const newRevisions = await this.getNewRevisionsCreatedInSecondaryDatabase(userUuid)
@@ -241,18 +235,6 @@ export class TransitionRevisionsFromPrimaryToSecondaryDatabaseForUser implements
     return true
   }
 
-  private async isAlreadyMigrated(userUuid: Uuid): Promise<boolean> {
-    const totalRevisionsCountForUserInPrimary = await this.primaryRevisionsRepository.countByUserUuid(userUuid)
-
-    if (totalRevisionsCountForUserInPrimary > 0) {
-      this.logger.info(
-        `User ${userUuid.value} has ${totalRevisionsCountForUserInPrimary} revisions in primary database.`,
-      )
-    }
-
-    return totalRevisionsCountForUserInPrimary === 0
-  }
-
   private async checkIntegrityBetweenPrimaryAndSecondaryDatabase(
     userUuid: Uuid,
     newRevisionsInSecondaryCount: number,

+ 1 - 0
packages/syncing-server/src/Bootstrap/Container.ts

@@ -952,6 +952,7 @@ export class ContainerConfigLoader {
       .bind<TransitionStatusUpdatedEventHandler>(TYPES.Sync_TransitionStatusUpdatedEventHandler)
       .toConstantValue(
         new TransitionStatusUpdatedEventHandler(
+          container.get<ItemRepositoryInterface>(TYPES.Sync_SQLItemRepository),
           container.get<TransitionItemsFromPrimaryToSecondaryDatabaseForUser>(
             TYPES.Sync_TransitionItemsFromPrimaryToSecondaryDatabaseForUser,
           ),

+ 26 - 0
packages/syncing-server/src/Domain/Handler/TransitionStatusUpdatedEventHandler.ts

@@ -6,9 +6,11 @@ import {
 import { Logger } from 'winston'
 import { TransitionItemsFromPrimaryToSecondaryDatabaseForUser } from '../UseCase/Transition/TransitionItemsFromPrimaryToSecondaryDatabaseForUser/TransitionItemsFromPrimaryToSecondaryDatabaseForUser'
 import { DomainEventFactoryInterface } from '../Event/DomainEventFactoryInterface'
+import { ItemRepositoryInterface } from '../Item/ItemRepositoryInterface'
 
 export class TransitionStatusUpdatedEventHandler implements DomainEventHandlerInterface {
   constructor(
+    private primaryItemRepository: ItemRepositoryInterface,
     private transitionItemsFromPrimaryToSecondaryDatabaseForUser: TransitionItemsFromPrimaryToSecondaryDatabaseForUser,
     private domainEventPublisher: DomainEventPublisherInterface,
     private domainEventFactory: DomainEventFactoryInterface,
@@ -17,6 +19,20 @@ export class TransitionStatusUpdatedEventHandler implements DomainEventHandlerIn
 
   async handle(event: TransitionStatusUpdatedEvent): Promise<void> {
     if (event.payload.status === 'STARTED' && event.payload.transitionType === 'items') {
+      if (await this.isAlreadyMigrated(event.payload.userUuid)) {
+        this.logger.info(`Items for user ${event.payload.userUuid} are already migrated`)
+
+        await this.domainEventPublisher.publish(
+          this.domainEventFactory.createTransitionStatusUpdatedEvent({
+            userUuid: event.payload.userUuid,
+            status: 'FINISHED',
+            transitionType: 'items',
+          }),
+        )
+
+        return
+      }
+
       await this.domainEventPublisher.publish(
         this.domainEventFactory.createTransitionStatusUpdatedEvent({
           userUuid: event.payload.userUuid,
@@ -52,4 +68,14 @@ export class TransitionStatusUpdatedEventHandler implements DomainEventHandlerIn
       )
     }
   }
+
+  private async isAlreadyMigrated(userUuid: string): Promise<boolean> {
+    const totalItemsCountForUser = await this.primaryItemRepository.countAll({ userUuid })
+
+    if (totalItemsCountForUser > 0) {
+      this.logger.info(`User ${userUuid} has ${totalItemsCountForUser} items in primary database.`)
+    }
+
+    return totalItemsCountForUser === 0
+  }
 }

+ 0 - 16
packages/syncing-server/src/Domain/UseCase/Transition/TransitionItemsFromPrimaryToSecondaryDatabaseForUser/TransitionItemsFromPrimaryToSecondaryDatabaseForUser.ts

@@ -30,12 +30,6 @@ export class TransitionItemsFromPrimaryToSecondaryDatabaseForUser implements Use
     }
     const userUuid = userUuidOrError.getValue()
 
-    if (await this.isAlreadyMigrated(userUuid)) {
-      this.logger.info(`Items for user ${userUuid.value} are already migrated`)
-
-      return Result.ok()
-    }
-
     let newItemsInSecondaryCount = 0
     if (await this.hasAlreadyDataInSecondaryDatabase(userUuid)) {
       const newItems = await this.getNewItemsCreatedInSecondaryDatabase(userUuid)
@@ -122,16 +116,6 @@ export class TransitionItemsFromPrimaryToSecondaryDatabaseForUser implements Use
     return hasAlreadyDataInSecondaryDatabase
   }
 
-  private async isAlreadyMigrated(userUuid: Uuid): Promise<boolean> {
-    const totalItemsCountForUser = await this.primaryItemRepository.countAll({ userUuid: userUuid.value })
-
-    if (totalItemsCountForUser > 0) {
-      this.logger.info(`User ${userUuid.value} has ${totalItemsCountForUser} items in primary database.`)
-    }
-
-    return totalItemsCountForUser === 0
-  }
-
   private async allowForSecondaryDatabaseToCatchUp(): Promise<void> {
     const twoSecondsInMilliseconds = 2_000
     await this.timer.sleep(twoSecondsInMilliseconds)