Bläddra i källkod

fix: transition adjustments

Karol Sójko 1 år sedan
förälder
incheckning
f20a947f8a
14 ändrade filer med 61 tillägg och 16 borttagningar
  1. 14 0
      packages/auth/bin/transition.ts
  2. 4 1
      packages/auth/src/Domain/Transition/TransitionStatusRepositoryInterface.ts
  3. 1 1
      packages/auth/src/Domain/UseCase/CreateCrossServiceToken/CreateCrossServiceToken.spec.ts
  4. 1 1
      packages/auth/src/Domain/UseCase/CreateCrossServiceToken/CreateCrossServiceToken.ts
  5. 6 2
      packages/auth/src/Domain/UseCase/GetTransitionStatus/GetTransitionStatus.ts
  6. 5 1
      packages/auth/src/Infra/Redis/RedisTransitionStatusRepository.ts
  7. 1 1
      packages/revisions/src/Domain/Event/DomainEventFactoryInterface.ts
  8. 8 0
      packages/revisions/src/Domain/Handler/TransitionStatusUpdatedEventHandler.ts
  9. 0 3
      packages/revisions/src/Domain/UseCase/Transition/TransitionRevisionsFromPrimaryToSecondaryDatabaseForUser/TransitionRevisionsFromPrimaryToSecondaryDatabaseForUser.spec.ts
  10. 5 1
      packages/revisions/src/Domain/UseCase/Transition/TransitionRevisionsFromPrimaryToSecondaryDatabaseForUser/TransitionRevisionsFromPrimaryToSecondaryDatabaseForUser.ts
  11. 1 1
      packages/syncing-server/src/Domain/Event/DomainEventFactoryInterface.ts
  12. 8 0
      packages/syncing-server/src/Domain/Handler/TransitionStatusUpdatedEventHandler.ts
  13. 0 3
      packages/syncing-server/src/Domain/UseCase/Transition/TransitionItemsFromPrimaryToSecondaryDatabaseForUser/TransitionItemsFromPrimaryToSecondaryDatabaseForUser.spec.ts
  14. 7 1
      packages/syncing-server/src/Domain/UseCase/Transition/TransitionItemsFromPrimaryToSecondaryDatabaseForUser/TransitionItemsFromPrimaryToSecondaryDatabaseForUser.ts

+ 14 - 0
packages/auth/bin/transition.ts

@@ -10,6 +10,7 @@ import { Env } from '../src/Bootstrap/Env'
 import { DomainEventPublisherInterface } from '@standardnotes/domain-events'
 import { DomainEventFactoryInterface } from '../src/Domain/Event/DomainEventFactoryInterface'
 import { UserRepositoryInterface } from '../src/Domain/User/UserRepositoryInterface'
+import { RoleName } from '@standardnotes/domain-core'
 
 const inputArgs = process.argv.slice(2)
 const startDateString = inputArgs[0]
@@ -28,11 +29,24 @@ const requestTransition = async (
 
   logger.info(`Found ${users.length} users created between ${startDateString} and ${endDateString}`)
 
+  let usersTriggered = 0
   for (const user of users) {
+    const roles = await user.roles
+    const userHasTransitionUserRole = roles.some((role) => role.name === RoleName.NAMES.TransitionUser) === true
+    if (userHasTransitionUserRole === true) {
+      continue
+    }
+
     const transitionRequestedEvent = domainEventFactory.createTransitionRequestedEvent({ userUuid: user.uuid })
 
+    usersTriggered += 1
+
     await domainEventPublisher.publish(transitionRequestedEvent)
   }
+
+  logger.info(
+    `Triggered transition for ${usersTriggered} users created between ${startDateString} and ${endDateString}`,
+  )
 }
 
 const container = new ContainerConfigLoader('worker')

+ 4 - 1
packages/auth/src/Domain/Transition/TransitionStatusRepositoryInterface.ts

@@ -1,5 +1,8 @@
 export interface TransitionStatusRepositoryInterface {
   updateStatus(userUuid: string, transitionType: 'items' | 'revisions', status: 'STARTED' | 'FAILED'): Promise<void>
   removeStatus(userUuid: string, transitionType: 'items' | 'revisions'): Promise<void>
-  getStatus(userUuid: string, transitionType: 'items' | 'revisions'): Promise<'STARTED' | 'FAILED' | null>
+  getStatus(
+    userUuid: string,
+    transitionType: 'items' | 'revisions',
+  ): Promise<'STARTED' | 'IN_PROGRESS' | 'FAILED' | null>
 }

+ 1 - 1
packages/auth/src/Domain/UseCase/CreateCrossServiceToken/CreateCrossServiceToken.spec.ts

@@ -119,7 +119,7 @@ describe('CreateCrossServiceToken', () => {
   })
 
   it('should create a cross service token for user that has an ongoing transaction', async () => {
-    transitionStatusRepository.getStatus = jest.fn().mockReturnValue('STARTED')
+    transitionStatusRepository.getStatus = jest.fn().mockReturnValue('IN_PROGRESS')
 
     await createUseCase().execute({
       user,

+ 1 - 1
packages/auth/src/Domain/UseCase/CreateCrossServiceToken/CreateCrossServiceToken.ts

@@ -59,7 +59,7 @@ export class CreateCrossServiceToken implements UseCaseInterface<string> {
       user: this.projectUser(user),
       roles: this.projectRoles(roles),
       shared_vault_owner_context: undefined,
-      ongoing_transition: transitionStatus === 'STARTED',
+      ongoing_transition: transitionStatus === 'IN_PROGRESS',
       belongs_to_shared_vaults: sharedVaultAssociations.map((association) => ({
         shared_vault_uuid: association.props.sharedVaultUuid.value,
         permission: association.props.permission.value,

+ 6 - 2
packages/auth/src/Domain/UseCase/GetTransitionStatus/GetTransitionStatus.ts

@@ -4,13 +4,17 @@ import { GetTransitionStatusDTO } from './GetTransitionStatusDTO'
 import { UserRepositoryInterface } from '../../User/UserRepositoryInterface'
 import { TransitionStatusRepositoryInterface } from '../../Transition/TransitionStatusRepositoryInterface'
 
-export class GetTransitionStatus implements UseCaseInterface<'TO-DO' | 'STARTED' | 'FINISHED' | 'FAILED'> {
+export class GetTransitionStatus
+  implements UseCaseInterface<'TO-DO' | 'STARTED' | 'IN_PROGRESS' | 'FINISHED' | 'FAILED'>
+{
   constructor(
     private transitionStatusRepository: TransitionStatusRepositoryInterface,
     private userRepository: UserRepositoryInterface,
   ) {}
 
-  async execute(dto: GetTransitionStatusDTO): Promise<Result<'TO-DO' | 'STARTED' | 'FINISHED' | 'FAILED'>> {
+  async execute(
+    dto: GetTransitionStatusDTO,
+  ): Promise<Result<'TO-DO' | 'STARTED' | 'IN_PROGRESS' | 'FINISHED' | 'FAILED'>> {
     const userUuidOrError = Uuid.create(dto.userUuid)
     if (userUuidOrError.isFailed()) {
       return Result.fail(userUuidOrError.getError())

+ 5 - 1
packages/auth/src/Infra/Redis/RedisTransitionStatusRepository.ts

@@ -19,9 +19,13 @@ export class RedisTransitionStatusRepository implements TransitionStatusReposito
     await this.redisClient.del(`${this.PREFIX}:${transitionType}:${userUuid}`)
   }
 
-  async getStatus(userUuid: string, transitionType: 'items' | 'revisions'): Promise<'STARTED' | 'FAILED' | null> {
+  async getStatus(
+    userUuid: string,
+    transitionType: 'items' | 'revisions',
+  ): Promise<'STARTED' | 'IN_PROGRESS' | 'FAILED' | null> {
     const status = (await this.redisClient.get(`${this.PREFIX}:${transitionType}:${userUuid}`)) as
       | 'STARTED'
+      | 'IN_PROGRESS'
       | 'FAILED'
       | null
 

+ 1 - 1
packages/revisions/src/Domain/Event/DomainEventFactoryInterface.ts

@@ -4,6 +4,6 @@ export interface DomainEventFactoryInterface {
   createTransitionStatusUpdatedEvent(dto: {
     userUuid: string
     transitionType: 'items' | 'revisions'
-    status: 'STARTED' | 'FAILED' | 'FINISHED'
+    status: 'STARTED' | 'IN_PROGRESS' | 'FAILED' | 'FINISHED'
   }): TransitionStatusUpdatedEvent
 }

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

@@ -29,6 +29,14 @@ export class TransitionStatusUpdatedEventHandler implements DomainEventHandlerIn
     }
 
     if (event.payload.status === 'STARTED' && event.payload.transitionType === 'revisions') {
+      await this.domainEventPublisher.publish(
+        this.domainEventFactory.createTransitionStatusUpdatedEvent({
+          userUuid: event.payload.userUuid,
+          status: 'IN_PROGRESS',
+          transitionType: 'revisions',
+        }),
+      )
+
       const result = await this.transitionRevisionsFromPrimaryToSecondaryDatabaseForUser.execute({
         userUuid: event.payload.userUuid,
       })

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

@@ -201,9 +201,6 @@ describe('TransitionRevisionsFromPrimaryToSecondaryDatabaseForUser', () => {
       })
 
       expect(result.isFailed()).toBeTruthy()
-      expect(result.getError()).toEqual(
-        'Revision 00000000-0000-0000-0000-000000000001 is not identical in primary and secondary database',
-      )
 
       expect((secondaryRevisionRepository as RevisionRepositoryInterface).removeByUserUuid).toHaveBeenCalledTimes(1)
       expect(primaryRevisionRepository.removeByUserUuid).not.toHaveBeenCalled()

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

@@ -179,7 +179,11 @@ export class TransitionRevisionsFromPrimaryToSecondaryDatabaseForUser implements
           }
 
           if (!revision.isIdenticalTo(revisionInSecondary)) {
-            return Result.fail(`Revision ${revision.id.toString()} is not identical in primary and secondary database`)
+            return Result.fail(
+              `Revision ${revision.id.toString()} is not identical in primary and secondary database. Revision in primary database: ${JSON.stringify(
+                revision,
+              )}, revision in secondary database: ${JSON.stringify(revisionInSecondary)}`,
+            )
           }
         }
       }

+ 1 - 1
packages/syncing-server/src/Domain/Event/DomainEventFactoryInterface.ts

@@ -52,7 +52,7 @@ export interface DomainEventFactoryInterface {
   createTransitionStatusUpdatedEvent(dto: {
     userUuid: string
     transitionType: 'items' | 'revisions'
-    status: 'STARTED' | 'FAILED' | 'FINISHED'
+    status: 'STARTED' | 'IN_PROGRESS' | 'FAILED' | 'FINISHED'
   }): TransitionStatusUpdatedEvent
   createEmailRequestedEvent(dto: {
     userEmail: string

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

@@ -17,6 +17,14 @@ export class TransitionStatusUpdatedEventHandler implements DomainEventHandlerIn
 
   async handle(event: TransitionStatusUpdatedEvent): Promise<void> {
     if (event.payload.status === 'STARTED' && event.payload.transitionType === 'items') {
+      await this.domainEventPublisher.publish(
+        this.domainEventFactory.createTransitionStatusUpdatedEvent({
+          userUuid: event.payload.userUuid,
+          status: 'IN_PROGRESS',
+          transitionType: 'items',
+        }),
+      )
+
       const result = await this.transitionItemsFromPrimaryToSecondaryDatabaseForUser.execute({
         userUuid: event.payload.userUuid,
       })

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

@@ -206,9 +206,6 @@ describe('TransitionItemsFromPrimaryToSecondaryDatabaseForUser', () => {
       })
 
       expect(result.isFailed()).toBeTruthy()
-      expect(result.getError()).toEqual(
-        'Item 00000000-0000-0000-0000-000000000001 is not identical in primary and secondary database',
-      )
 
       expect((secondaryItemRepository as ItemRepositoryInterface).deleteByUserUuid).toHaveBeenCalledTimes(1)
       expect(primaryItemRepository.deleteByUserUuid).not.toHaveBeenCalled()

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

@@ -156,7 +156,13 @@ export class TransitionItemsFromPrimaryToSecondaryDatabaseForUser implements Use
           }
 
           if (!item.isIdenticalTo(itemInSecondary)) {
-            return Result.fail(`Item ${item.uuid.value} is not identical in primary and secondary database`)
+            return Result.fail(
+              `Item ${
+                item.uuid.value
+              } is not identical in primary and secondary database. Item in primary database: ${JSON.stringify(
+                item,
+              )}, item in secondary database: ${JSON.stringify(itemInSecondary)}`,
+            )
           }
         }
       }