瀏覽代碼

fix: remember paging progress on transitioning

Karol Sójko 1 年之前
父節點
當前提交
1d73e4f072

+ 1 - 0
packages/domain-events/src/Domain/Event/TransitionStatusUpdatedEventPayload.ts

@@ -3,4 +3,5 @@ export interface TransitionStatusUpdatedEventPayload {
   transitionType: 'items' | 'revisions'
   transitionTimestamp: number
   status: string
+  page?: number
 }

+ 12 - 1
packages/revisions/src/Domain/UseCase/Transition/TransitionRevisionsFromPrimaryToSecondaryDatabaseForUser/TransitionRevisionsFromPrimaryToSecondaryDatabaseForUser.ts

@@ -7,6 +7,8 @@ import { TransitionRevisionsFromPrimaryToSecondaryDatabaseForUserDTO } from './T
 import { RevisionRepositoryInterface } from '../../../Revision/RevisionRepositoryInterface'
 
 export class TransitionRevisionsFromPrimaryToSecondaryDatabaseForUser implements UseCaseInterface<void> {
+  private readonly pagingProgress: Map<string, number> = new Map()
+
   constructor(
     private primaryRevisionsRepository: RevisionRepositoryInterface,
     private secondRevisionsRepository: RevisionRepositoryInterface | null,
@@ -71,10 +73,19 @@ export class TransitionRevisionsFromPrimaryToSecondaryDatabaseForUser implements
 
   private async migrateRevisionsForUser(userUuid: Uuid): Promise<Result<string[]>> {
     try {
+      if (!this.pagingProgress.has(userUuid.value)) {
+        this.pagingProgress.set(userUuid.value, 1)
+      }
+      const initialPage = this.pagingProgress.get(userUuid.value) as number
+
+      this.logger.info(`[${userUuid.value}] Migrating from page ${initialPage}`)
+
       const totalRevisionsCountForUser = await this.primaryRevisionsRepository.countByUserUuid(userUuid)
       const totalPages = Math.ceil(totalRevisionsCountForUser / this.pageSize)
       const revisionsToSkipInIntegrityCheck = []
-      for (let currentPage = 1; currentPage <= totalPages; currentPage++) {
+      for (let currentPage = initialPage; currentPage <= totalPages; currentPage++) {
+        this.pagingProgress.set(userUuid.value, currentPage)
+
         const query = {
           userUuid: userUuid,
           offset: (currentPage - 1) * this.pageSize,

+ 10 - 1
packages/syncing-server/src/Domain/UseCase/Transition/TransitionItemsFromPrimaryToSecondaryDatabaseForUser/TransitionItemsFromPrimaryToSecondaryDatabaseForUser.ts

@@ -8,6 +8,8 @@ import { ItemRepositoryInterface } from '../../../Item/ItemRepositoryInterface'
 import { ItemQuery } from '../../../Item/ItemQuery'
 
 export class TransitionItemsFromPrimaryToSecondaryDatabaseForUser implements UseCaseInterface<void> {
+  private readonly pagingProgress: Map<string, number> = new Map()
+
   constructor(
     private primaryItemRepository: ItemRepositoryInterface,
     private secondaryItemRepository: ItemRepositoryInterface | null,
@@ -77,10 +79,17 @@ export class TransitionItemsFromPrimaryToSecondaryDatabaseForUser implements Use
 
   private async migrateItemsForUser(userUuid: Uuid): Promise<Result<string[]>> {
     try {
+      if (!this.pagingProgress.has(userUuid.value)) {
+        this.pagingProgress.set(userUuid.value, 1)
+      }
+      const initialPage = this.pagingProgress.get(userUuid.value) as number
+
       const totalItemsCountForUser = await this.primaryItemRepository.countAll({ userUuid: userUuid.value })
       const totalPages = Math.ceil(totalItemsCountForUser / this.pageSize)
       const itemsToSkipInIntegrityCheck = []
-      for (let currentPage = 1; currentPage <= totalPages; currentPage++) {
+      for (let currentPage = initialPage; currentPage <= totalPages; currentPage++) {
+        this.pagingProgress.set(userUuid.value, currentPage)
+
         const query: ItemQuery = {
           userUuid: userUuid.value,
           offset: (currentPage - 1) * this.pageSize,