Quellcode durchsuchen

fix: display transition progress in logs

Karol Sójko vor 1 Jahr
Ursprung
Commit
38685c1861

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

@@ -943,6 +943,7 @@ export class ContainerConfigLoader {
         new UpdateTransitionStatus(
           container.get<TransitionStatusRepositoryInterface>(TYPES.Auth_TransitionStatusRepository),
           container.get<RoleServiceInterface>(TYPES.Auth_RoleService),
+          container.get<winston.Logger>(TYPES.Auth_Logger),
         ),
       )
     container

+ 4 - 1
packages/auth/src/Domain/Event/DomainEventFactory.ts

@@ -44,7 +44,10 @@ export class DomainEventFactory implements DomainEventFactoryInterface {
         },
         origin: DomainEventService.Auth,
       },
-      payload: dto,
+      payload: {
+        timestamp: this.timer.getTimestampInMicroseconds(),
+        ...dto,
+      },
     }
   }
 

+ 1 - 0
packages/auth/src/Domain/Handler/TransitionStatusUpdatedEventHandler.ts

@@ -13,6 +13,7 @@ export class TransitionStatusUpdatedEventHandler implements DomainEventHandlerIn
       status: event.payload.status,
       userUuid: event.payload.userUuid,
       transitionType: event.payload.transitionType,
+      transitionTimestamp: event.payload.transitionTimestamp,
     })
 
     if (result.isFailed()) {

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

@@ -3,17 +3,36 @@ import { RoleName, Uuid } from '@standardnotes/domain-core'
 import { RoleServiceInterface } from '../../Role/RoleServiceInterface'
 import { TransitionStatusRepositoryInterface } from '../../Transition/TransitionStatusRepositoryInterface'
 import { UpdateTransitionStatus } from './UpdateTransitionStatus'
+import { Logger } from 'winston'
 
 describe('UpdateTransitionStatus', () => {
   let transitionStatusRepository: TransitionStatusRepositoryInterface
   let roleService: RoleServiceInterface
+  let logger: Logger
 
-  const createUseCase = () => new UpdateTransitionStatus(transitionStatusRepository, roleService)
+  const createUseCase = () => new UpdateTransitionStatus(transitionStatusRepository, roleService, logger)
 
   beforeEach(() => {
+    logger = {} as jest.Mocked<Logger>
+    logger.info = jest.fn()
+
     transitionStatusRepository = {} as jest.Mocked<TransitionStatusRepositoryInterface>
     transitionStatusRepository.removeStatus = jest.fn()
     transitionStatusRepository.updateStatus = jest.fn()
+    transitionStatusRepository.getStatuses = jest.fn().mockResolvedValue([
+      {
+        userUuid: '00000000-0000-0000-0000-000000000000',
+        status: 'STARTED',
+      },
+      {
+        userUuid: '00000000-0000-0000-0000-000000000001',
+        status: 'IN_PROGRESS',
+      },
+      {
+        userUuid: '00000000-0000-0000-0000-000000000002',
+        status: 'FAILED',
+      },
+    ])
 
     roleService = {} as jest.Mocked<RoleServiceInterface>
     roleService.addRoleToUser = jest.fn()
@@ -26,6 +45,7 @@ describe('UpdateTransitionStatus', () => {
       userUuid: '00000000-0000-0000-0000-000000000000',
       status: 'FINISHED',
       transitionType: 'items',
+      transitionTimestamp: 123,
     })
 
     expect(result.isFailed()).toBeFalsy()
@@ -46,6 +66,7 @@ describe('UpdateTransitionStatus', () => {
       userUuid: '00000000-0000-0000-0000-000000000000',
       status: 'FINISHED',
       transitionType: 'revisions',
+      transitionTimestamp: 123,
     })
 
     expect(result.isFailed()).toBeFalsy()
@@ -63,6 +84,7 @@ describe('UpdateTransitionStatus', () => {
       userUuid: '00000000-0000-0000-0000-000000000000',
       status: 'STARTED',
       transitionType: 'items',
+      transitionTimestamp: 123,
     })
 
     expect(result.isFailed()).toBeFalsy()
@@ -80,6 +102,7 @@ describe('UpdateTransitionStatus', () => {
       userUuid: 'invalid',
       status: 'STARTED',
       transitionType: 'items',
+      transitionTimestamp: 123,
     })
 
     expect(result.isFailed()).toBeTruthy()

+ 27 - 7
packages/auth/src/Domain/UseCase/UpdateTransitionStatus/UpdateTransitionStatus.ts

@@ -2,11 +2,13 @@ import { Result, RoleName, UseCaseInterface, Uuid } from '@standardnotes/domain-
 import { TransitionStatusRepositoryInterface } from '../../Transition/TransitionStatusRepositoryInterface'
 import { UpdateTransitionStatusDTO } from './UpdateTransitionStatusDTO'
 import { RoleServiceInterface } from '../../Role/RoleServiceInterface'
+import { Logger } from 'winston'
 
 export class UpdateTransitionStatus implements UseCaseInterface<void> {
   constructor(
     private transitionStatusRepository: TransitionStatusRepositoryInterface,
     private roleService: RoleServiceInterface,
+    private logger: Logger,
   ) {}
 
   async execute(dto: UpdateTransitionStatusDTO): Promise<Result<void>> {
@@ -16,17 +18,35 @@ export class UpdateTransitionStatus implements UseCaseInterface<void> {
     }
     const userUuid = userUuidOrError.getValue()
 
-    if (dto.status === 'FINISHED') {
-      await this.transitionStatusRepository.removeStatus(dto.userUuid, dto.transitionType)
-
-      if (dto.transitionType === 'items') {
-        await this.roleService.addRoleToUser(userUuid, RoleName.create(RoleName.NAMES.TransitionUser).getValue())
-      }
+    if (dto.status !== 'FINISHED') {
+      await this.transitionStatusRepository.updateStatus(dto.userUuid, dto.transitionType, dto.status)
 
       return Result.ok()
     }
 
-    await this.transitionStatusRepository.updateStatus(dto.userUuid, dto.transitionType, dto.status)
+    await this.transitionStatusRepository.removeStatus(dto.userUuid, dto.transitionType)
+
+    if (dto.transitionType === 'items') {
+      await this.roleService.addRoleToUser(userUuid, RoleName.create(RoleName.NAMES.TransitionUser).getValue())
+    }
+
+    const itemStatuses = await this.transitionStatusRepository.getStatuses('items')
+    const itemsStartedStatusesCount = itemStatuses.filter((status) => status.status === 'STARTED').length
+    const itemsInProgressStatusesCount = itemStatuses.filter((status) => status.status === 'IN_PROGRESS').length
+    const itemsFailedStatusesCount = itemStatuses.filter((status) => status.status === 'FAILED').length
+
+    this.logger.info(
+      `[TRANSITION ${dto.transitionTimestamp}] Items transition statuses: ${itemsStartedStatusesCount} started, ${itemsInProgressStatusesCount} in progress, ${itemsFailedStatusesCount} failed`,
+    )
+
+    const revisionStatuses = await this.transitionStatusRepository.getStatuses('revisions')
+    const revisionsStartedStatusesCount = revisionStatuses.filter((status) => status.status === 'STARTED').length
+    const revisionsInProgressStatusesCount = revisionStatuses.filter((status) => status.status === 'IN_PROGRESS').length
+    const revisionsFailedStatusesCount = revisionStatuses.filter((status) => status.status === 'FAILED').length
+
+    this.logger.info(
+      `[TRANSITION ${dto.transitionTimestamp}] Revisions transition statuses: ${revisionsStartedStatusesCount} started, ${revisionsInProgressStatusesCount} in progress, ${revisionsFailedStatusesCount} failed`,
+    )
 
     return Result.ok()
   }

+ 1 - 0
packages/auth/src/Domain/UseCase/UpdateTransitionStatus/UpdateTransitionStatusDTO.ts

@@ -1,5 +1,6 @@
 export interface UpdateTransitionStatusDTO {
   userUuid: string
   transitionType: 'items' | 'revisions'
+  transitionTimestamp: number
   status: 'STARTED' | 'IN_PROGRESS' | 'FINISHED' | 'FAILED'
 }

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

@@ -1,4 +1,5 @@
 export interface TransitionRequestedEventPayload {
   userUuid: string
   type: 'items' | 'revisions'
+  timestamp: number
 }

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

@@ -1,5 +1,6 @@
 export interface TransitionStatusUpdatedEventPayload {
   userUuid: string
   transitionType: 'items' | 'revisions'
+  transitionTimestamp: number
   status: 'STARTED' | 'IN_PROGRESS' | 'FINISHED' | 'FAILED'
 }

+ 4 - 1
packages/revisions/src/Domain/Event/DomainEventFactory.ts

@@ -21,7 +21,10 @@ export class DomainEventFactory implements DomainEventFactoryInterface {
         },
         origin: DomainEventService.SyncingServer,
       },
-      payload: dto,
+      payload: {
+        transitionTimestamp: this.timer.getTimestampInMicroseconds(),
+        ...dto,
+      },
     }
   }
 }

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

@@ -49,8 +49,6 @@ export class TransitionStatusUpdatedEventHandler implements DomainEventHandlerIn
       }
 
       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,

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

@@ -184,7 +184,10 @@ export class DomainEventFactory implements DomainEventFactoryInterface {
         },
         origin: DomainEventService.SyncingServer,
       },
-      payload: dto,
+      payload: {
+        transitionTimestamp: this.timer.getTimestampInMicroseconds(),
+        ...dto,
+      },
     }
   }
 

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

@@ -20,8 +20,6 @@ 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,