diff --git a/packages/auth/bin/transition.ts b/packages/auth/bin/transition.ts index 5ba570f7d..f71335075 100644 --- a/packages/auth/bin/transition.ts +++ b/packages/auth/bin/transition.ts @@ -17,6 +17,7 @@ import { RoleName, TransitionStatus } from '@standardnotes/domain-core' const inputArgs = process.argv.slice(2) const startDateString = inputArgs[0] const endDateString = inputArgs[1] +const forceRunParam = inputArgs[2] const requestTransition = async ( transitionStatusRepository: TransitionStatusRepositoryInterface, @@ -38,6 +39,7 @@ const requestTransition = async ( ) let usersTriggered = 0 + const forceRun = forceRunParam === 'true' for (const user of users) { const itemsTransitionStatus = await transitionStatusRepository.getStatus(user.uuid, 'items') const revisionsTransitionStatus = await transitionStatusRepository.getStatus(user.uuid, 'revisions') @@ -55,7 +57,11 @@ const requestTransition = async ( let wasTransitionRequested = false - if (itemsTransitionStatus === null || itemsTransitionStatus.value === TransitionStatus.STATUSES.Failed) { + if ( + itemsTransitionStatus === null || + itemsTransitionStatus.value === TransitionStatus.STATUSES.Failed || + (itemsTransitionStatus.value === TransitionStatus.STATUSES.InProgress && forceRun) + ) { wasTransitionRequested = true await transitionStatusRepository.remove(user.uuid, 'items') @@ -68,7 +74,11 @@ const requestTransition = async ( ) } - if (revisionsTransitionStatus === null || revisionsTransitionStatus.value === TransitionStatus.STATUSES.Failed) { + if ( + revisionsTransitionStatus === null || + revisionsTransitionStatus.value === TransitionStatus.STATUSES.Failed || + (revisionsTransitionStatus.value === TransitionStatus.STATUSES.InProgress && forceRun) + ) { wasTransitionRequested = true await transitionStatusRepository.remove(user.uuid, 'revisions') diff --git a/packages/revisions/src/Domain/UseCase/Transition/TransitionRevisionsFromPrimaryToSecondaryDatabaseForUser/TransitionRevisionsFromPrimaryToSecondaryDatabaseForUser.ts b/packages/revisions/src/Domain/UseCase/Transition/TransitionRevisionsFromPrimaryToSecondaryDatabaseForUser/TransitionRevisionsFromPrimaryToSecondaryDatabaseForUser.ts index 8e7881644..cdb4a829e 100644 --- a/packages/revisions/src/Domain/UseCase/Transition/TransitionRevisionsFromPrimaryToSecondaryDatabaseForUser/TransitionRevisionsFromPrimaryToSecondaryDatabaseForUser.ts +++ b/packages/revisions/src/Domain/UseCase/Transition/TransitionRevisionsFromPrimaryToSecondaryDatabaseForUser/TransitionRevisionsFromPrimaryToSecondaryDatabaseForUser.ts @@ -112,7 +112,11 @@ export class TransitionRevisionsFromPrimaryToSecondaryDatabaseForUser implements const totalRevisionsCountForUser = await ( this.secondRevisionsRepository as RevisionRepositoryInterface ).countByUserUuid(userUuid) + this.logger.info(`[${userUuid.value}] Total revisions count for user: ${totalRevisionsCountForUser}`) const totalPages = Math.ceil(totalRevisionsCountForUser / this.pageSize) + this.logger.info(`[${userUuid.value}] Total pages: ${totalPages}`) + let insertedRevisionsCount = 0 + let skippedRevisionsCount = 0 for (let currentPage = initialPage; currentPage <= totalPages; currentPage++) { const isPageInEvery10Percent = currentPage % Math.ceil(totalPages / 10) === 0 if (isPageInEvery10Percent) { @@ -121,6 +125,9 @@ export class TransitionRevisionsFromPrimaryToSecondaryDatabaseForUser implements (currentPage / totalPages) * 100, )}% completed`, ) + this.logger.info( + `[${userUuid.value}] Inserted ${insertedRevisionsCount} revisions so far. Skipped ${skippedRevisionsCount} revisions so far.`, + ) await this.updateTransitionStatus(userUuid, TransitionStatus.STATUSES.InProgress, timestamp) } @@ -151,10 +158,13 @@ export class TransitionRevisionsFromPrimaryToSecondaryDatabaseForUser implements userUuid.value }] Revision ${revision.id.toString()} is older in secondary than revision in primary database`, ) + skippedRevisionsCount++ continue } if (revisionInPrimary.isIdenticalTo(revision)) { + skippedRevisionsCount++ + continue } @@ -174,6 +184,8 @@ export class TransitionRevisionsFromPrimaryToSecondaryDatabaseForUser implements const didSave = await this.primaryRevisionsRepository.insert(revision) if (!didSave) { this.logger.error(`Failed to save revision ${revision.id.toString()} to primary database`) + } else { + insertedRevisionsCount++ } } catch (error) { this.logger.error( @@ -183,6 +195,10 @@ export class TransitionRevisionsFromPrimaryToSecondaryDatabaseForUser implements } } + this.logger.info( + `[${userUuid.value}] Inserted ${insertedRevisionsCount} revisions. Skipped ${skippedRevisionsCount} revisions.`, + ) + return Result.ok() } catch (error) { return Result.fail(`Errored when migrating revisions for user ${userUuid.value}: ${(error as Error).message}`) diff --git a/packages/syncing-server/src/Domain/UseCase/Transition/TransitionItemsFromPrimaryToSecondaryDatabaseForUser/TransitionItemsFromPrimaryToSecondaryDatabaseForUser.ts b/packages/syncing-server/src/Domain/UseCase/Transition/TransitionItemsFromPrimaryToSecondaryDatabaseForUser/TransitionItemsFromPrimaryToSecondaryDatabaseForUser.ts index 22acacaff..d049c66ea 100644 --- a/packages/syncing-server/src/Domain/UseCase/Transition/TransitionItemsFromPrimaryToSecondaryDatabaseForUser/TransitionItemsFromPrimaryToSecondaryDatabaseForUser.ts +++ b/packages/syncing-server/src/Domain/UseCase/Transition/TransitionItemsFromPrimaryToSecondaryDatabaseForUser/TransitionItemsFromPrimaryToSecondaryDatabaseForUser.ts @@ -114,13 +114,20 @@ export class TransitionItemsFromPrimaryToSecondaryDatabaseForUser implements Use const totalItemsCountForUser = await (this.secondaryItemRepository as ItemRepositoryInterface).countAll({ userUuid: userUuid.value, }) + this.logger.info(`[${userUuid.value}] Total items count for user: ${totalItemsCountForUser}`) const totalPages = Math.ceil(totalItemsCountForUser / this.pageSize) + this.logger.info(`[${userUuid.value}] Total pages: ${totalPages}`) + let insertedItemsCount = 0 + let skippedItemsCount = 0 for (let currentPage = initialPage; currentPage <= totalPages; currentPage++) { const isPageInEvery10Percent = currentPage % Math.ceil(totalPages / 10) === 0 if (isPageInEvery10Percent) { this.logger.info( `[${userUuid.value}] Migrating items for user: ${Math.round((currentPage / totalPages) * 100)}% completed`, ) + this.logger.info( + `[${userUuid.value}] Inserted items count: ${insertedItemsCount}. Skipped items count: ${skippedItemsCount}`, + ) await this.updateTransitionStatus(userUuid, TransitionStatus.STATUSES.InProgress, timestamp) } @@ -148,10 +155,13 @@ export class TransitionItemsFromPrimaryToSecondaryDatabaseForUser implements Use this.logger.info( `[${userUuid.value}] Item ${item.uuid.value} is older in secondary than item in primary database`, ) + skippedItemsCount++ continue } if (itemInPrimary.isIdenticalTo(item)) { + skippedItemsCount++ + continue } @@ -165,6 +175,8 @@ export class TransitionItemsFromPrimaryToSecondaryDatabaseForUser implements Use } await this.primaryItemRepository.save(item) + + insertedItemsCount++ } catch (error) { this.logger.error( `Errored when saving item ${item.uuid.value} to primary database: ${(error as Error).message}`, @@ -173,6 +185,10 @@ export class TransitionItemsFromPrimaryToSecondaryDatabaseForUser implements Use } } + this.logger.info( + `[${userUuid.value}] Inserted items count: ${insertedItemsCount}. Skipped items count: ${skippedItemsCount}`, + ) + return Result.ok() } catch (error) { return Result.fail((error as Error).message)