Explorar o código

fix: skip already updated items and revisions in integrity check (#825)

Karol Sójko hai 1 ano
pai
achega
03a4a3f2ab

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

@@ -87,6 +87,7 @@ export class TransitionRevisionsFromPrimaryToSecondaryDatabaseForUser implements
     const integrityCheckResult = await this.checkIntegrityBetweenPrimaryAndSecondaryDatabase(
       userUuid,
       newRevisionsInSecondaryCount,
+      updatedRevisionsInSecondary,
     )
     if (integrityCheckResult.isFailed()) {
       if (newRevisionsInSecondaryCount === 0 && updatedRevisionsInSecondaryCount === 0) {
@@ -144,6 +145,10 @@ export class TransitionRevisionsFromPrimaryToSecondaryDatabaseForUser implements
                 (updatedRevision) => updatedRevision.id.toString() === revision.id.toString(),
               )
             ) {
+              this.logger.info(
+                `Skipping saving revision ${revision.id.toString()} as it was updated in secondary database`,
+              )
+
               continue
             }
 
@@ -285,6 +290,7 @@ export class TransitionRevisionsFromPrimaryToSecondaryDatabaseForUser implements
   private async checkIntegrityBetweenPrimaryAndSecondaryDatabase(
     userUuid: Uuid,
     newRevisionsInSecondaryCount: number,
+    updatedRevisionsInSecondary: Revision[],
   ): Promise<Result<boolean>> {
     try {
       const totalRevisionsCountForUserInPrimary = await this.primaryRevisionsRepository.countByUserUuid(userUuid)
@@ -314,6 +320,17 @@ export class TransitionRevisionsFromPrimaryToSecondaryDatabaseForUser implements
             return Result.fail(`Revision ${revision.id.toString()} not found in secondary database`)
           }
 
+          if (
+            updatedRevisionsInSecondary.find(
+              (updatedRevision) => updatedRevision.id.toString() === revision.id.toString(),
+            )
+          ) {
+            this.logger.info(
+              `Skipping integrity check for revision ${revision.id.toString()} as it was updated in secondary database`,
+            )
+            continue
+          }
+
           if (!revision.isIdenticalTo(revisionInSecondary)) {
             return Result.fail(
               `Revision ${revision.id.toString()} is not identical in primary and secondary database. Revision in primary database: ${JSON.stringify(

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

@@ -82,6 +82,7 @@ export class TransitionItemsFromPrimaryToSecondaryDatabaseForUser implements Use
     const integrityCheckResult = await this.checkIntegrityBetweenPrimaryAndSecondaryDatabase(
       userUuid,
       newItemsInSecondaryCount,
+      updatedItemsInSecondary,
     )
     if (integrityCheckResult.isFailed()) {
       if (newItemsInSecondaryCount === 0 && updatedItemsInSecondaryCount === 0) {
@@ -209,6 +210,8 @@ export class TransitionItemsFromPrimaryToSecondaryDatabaseForUser implements Use
 
         for (const item of items) {
           if (updatedItemsInSecondary.find((updatedItem) => updatedItem.uuid.equals(item.uuid))) {
+            this.logger.info(`Skipping saving item ${item.uuid.value} as it was updated in secondary database`)
+
             continue
           }
           await (this.secondaryItemRepository as ItemRepositoryInterface).save(item)
@@ -234,6 +237,7 @@ export class TransitionItemsFromPrimaryToSecondaryDatabaseForUser implements Use
   private async checkIntegrityBetweenPrimaryAndSecondaryDatabase(
     userUuid: Uuid,
     newItemsInSecondaryCount: number,
+    updatedItemsInSecondary: Item[],
   ): Promise<Result<boolean>> {
     try {
       const totalItemsCountForUserInPrimary = await this.primaryItemRepository.countAll({ userUuid: userUuid.value })
@@ -265,6 +269,13 @@ export class TransitionItemsFromPrimaryToSecondaryDatabaseForUser implements Use
             return Result.fail(`Item ${item.uuid.value} not found in secondary database`)
           }
 
+          if (updatedItemsInSecondary.find((updatedItem) => updatedItem.uuid.equals(item.uuid))) {
+            this.logger.info(
+              `Skipping integrity check for item ${item.uuid.value} as it was updated in secondary database`,
+            )
+            continue
+          }
+
           if (!item.isIdenticalTo(itemInSecondary)) {
             return Result.fail(
               `Item ${