Selaa lähdekoodia

fix: adjust transition timestamps to be universal

Karol Sójko 1 vuosi sitten
vanhempi
commit
c7807d0f9e
27 muutettua tiedostoa jossa 32 lisäystä ja 146 poistoa
  1. 0 9
      packages/api-gateway/src/Controller/v1/UsersController.ts
  2. 0 3
      packages/api-gateway/src/Service/Resolver/EndpointResolver.ts
  3. 0 1
      packages/auth/src/Bootstrap/Container.ts
  4. 0 6
      packages/auth/src/Infra/InversifyExpressUtils/AnnotatedUsersController.spec.ts
  5. 0 8
      packages/auth/src/Infra/InversifyExpressUtils/AnnotatedUsersController.ts
  6. 0 27
      packages/auth/src/Infra/InversifyExpressUtils/Base/BaseUsersController.ts
  7. 0 3
      packages/revisions/src/Bootstrap/Container.ts
  8. 2 4
      packages/revisions/src/Domain/Event/DomainEventFactory.ts
  9. 1 0
      packages/revisions/src/Domain/Event/DomainEventFactoryInterface.ts
  10. 1 0
      packages/revisions/src/Domain/Handler/TransitionRequestedEventHandler.ts
  11. 6 0
      packages/revisions/src/Domain/Handler/TransitionStatusUpdatedEventHandler.ts
  12. 1 0
      packages/revisions/src/Domain/UseCase/Transition/TriggerTransitionFromPrimaryToSecondaryDatabaseForUser/TriggerTransitionFromPrimaryToSecondaryDatabaseForUser.spec.ts
  13. 1 0
      packages/revisions/src/Domain/UseCase/Transition/TriggerTransitionFromPrimaryToSecondaryDatabaseForUser/TriggerTransitionFromPrimaryToSecondaryDatabaseForUser.ts
  14. 1 0
      packages/revisions/src/Domain/UseCase/Transition/TriggerTransitionFromPrimaryToSecondaryDatabaseForUser/TriggerTransitionFromPrimaryToSecondaryDatabaseForUserDTO.ts
  15. 2 17
      packages/revisions/src/Infra/InversifyExpress/AnnotatedRevisionsController.ts
  16. 0 22
      packages/revisions/src/Infra/InversifyExpress/Base/BaseRevisionsController.ts
  17. 5 1
      packages/syncing-server/bin/transition.ts
  18. 0 3
      packages/syncing-server/src/Bootstrap/Container.ts
  19. 2 4
      packages/syncing-server/src/Domain/Event/DomainEventFactory.ts
  20. 1 0
      packages/syncing-server/src/Domain/Event/DomainEventFactoryInterface.ts
  21. 1 0
      packages/syncing-server/src/Domain/Handler/TransitionRequestedEventHandler.ts
  22. 4 0
      packages/syncing-server/src/Domain/Handler/TransitionStatusUpdatedEventHandler.ts
  23. 1 0
      packages/syncing-server/src/Domain/UseCase/Transition/TriggerTransitionFromPrimaryToSecondaryDatabaseForUser/TriggerTransitionFromPrimaryToSecondaryDatabaseForUser.spec.ts
  24. 1 0
      packages/syncing-server/src/Domain/UseCase/Transition/TriggerTransitionFromPrimaryToSecondaryDatabaseForUser/TriggerTransitionFromPrimaryToSecondaryDatabaseForUser.ts
  25. 1 0
      packages/syncing-server/src/Domain/UseCase/Transition/TriggerTransitionFromPrimaryToSecondaryDatabaseForUser/TriggerTransitionFromPrimaryToSecondaryDatabaseForUserDTO.ts
  26. 1 16
      packages/syncing-server/src/Infra/InversifyExpressUtils/AnnotatedItemsController.ts
  27. 0 22
      packages/syncing-server/src/Infra/InversifyExpressUtils/Base/BaseItemsController.ts

+ 0 - 9
packages/api-gateway/src/Controller/v1/UsersController.ts

@@ -80,15 +80,6 @@ export class UsersController extends BaseHttpController {
     )
   }
 
-  @httpGet('/transition-status', TYPES.ApiGateway_RequiredCrossServiceTokenMiddleware)
-  async getTransitionStatus(request: Request, response: Response): Promise<void> {
-    await this.httpService.callAuthServer(
-      request,
-      response,
-      this.endpointResolver.resolveEndpointOrMethodIdentifier('GET', 'users/transition-status'),
-    )
-  }
-
   @httpGet('/:userId/params', TYPES.ApiGateway_RequiredCrossServiceTokenMiddleware)
   async getKeyParams(request: Request, response: Response): Promise<void> {
     await this.httpService.callAuthServer(

+ 0 - 3
packages/api-gateway/src/Service/Resolver/EndpointResolver.ts

@@ -43,7 +43,6 @@ export class EndpointResolver implements EndpointResolverInterface {
     ['[PATCH]:users/:userId', 'auth.users.update'],
     ['[PUT]:users/:userUuid/attributes/credentials', 'auth.users.updateCredentials'],
     ['[GET]:users/params', 'auth.users.getKeyParams'],
-    ['[GET]:users/transition-status', 'auth.users.transition-status'],
     ['[DELETE]:users/:userUuid', 'auth.users.delete'],
     ['[POST]:listed', 'auth.users.createListedAccount'],
     ['[POST]:auth', 'auth.users.register'],
@@ -59,13 +58,11 @@ export class EndpointResolver implements EndpointResolverInterface {
     // Syncing Server
     ['[POST]:items/sync', 'sync.items.sync'],
     ['[POST]:items/check-integrity', 'sync.items.check_integrity'],
-    ['[POST]:items/transition', 'sync.items.transition'],
     ['[GET]:items/:uuid', 'sync.items.get_item'],
     // Revisions Controller V2
     ['[GET]:items/:itemUuid/revisions', 'revisions.revisions.getRevisions'],
     ['[GET]:items/:itemUuid/revisions/:id', 'revisions.revisions.getRevision'],
     ['[DELETE]:items/:itemUuid/revisions/:id', 'revisions.revisions.deleteRevision'],
-    ['[POST]:revisions/transition', 'revisions.revisions.transition'],
     // Messages Controller
     ['[GET]:messages/', 'sync.messages.get-received'],
     ['[GET]:messages/outbound', 'sync.messages.get-sent'],

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

@@ -1276,7 +1276,6 @@ export class ContainerConfigLoader {
             container.get<ClearLoginAttempts>(TYPES.Auth_ClearLoginAttempts),
             container.get<IncreaseLoginAttempts>(TYPES.Auth_IncreaseLoginAttempts),
             container.get<ChangeCredentials>(TYPES.Auth_ChangeCredentials),
-            container.get<GetTransitionStatus>(TYPES.Auth_GetTransitionStatus),
             container.get<ControllerContainerInterface>(TYPES.Auth_ControllerContainer),
           ),
         )

+ 0 - 6
packages/auth/src/Infra/InversifyExpressUtils/AnnotatedUsersController.spec.ts

@@ -14,7 +14,6 @@ import { IncreaseLoginAttempts } from '../../Domain/UseCase/IncreaseLoginAttempt
 import { InviteToSharedSubscription } from '../../Domain/UseCase/InviteToSharedSubscription/InviteToSharedSubscription'
 import { UpdateUser } from '../../Domain/UseCase/UpdateUser'
 import { User } from '../../Domain/User/User'
-import { GetTransitionStatus } from '../../Domain/UseCase/GetTransitionStatus/GetTransitionStatus'
 
 describe('AnnotatedUsersController', () => {
   let updateUser: UpdateUser
@@ -25,7 +24,6 @@ describe('AnnotatedUsersController', () => {
   let increaseLoginAttempts: IncreaseLoginAttempts
   let changeCredentials: ChangeCredentials
   let inviteToSharedSubscription: InviteToSharedSubscription
-  let getTransitionStatus: GetTransitionStatus
 
   let request: express.Request
   let response: express.Response
@@ -40,7 +38,6 @@ describe('AnnotatedUsersController', () => {
       clearLoginAttempts,
       increaseLoginAttempts,
       changeCredentials,
-      getTransitionStatus,
     )
 
   beforeEach(() => {
@@ -72,9 +69,6 @@ describe('AnnotatedUsersController', () => {
     inviteToSharedSubscription = {} as jest.Mocked<InviteToSharedSubscription>
     inviteToSharedSubscription.execute = jest.fn()
 
-    getTransitionStatus = {} as jest.Mocked<GetTransitionStatus>
-    getTransitionStatus.execute = jest.fn()
-
     request = {
       headers: {},
       body: {},

+ 0 - 8
packages/auth/src/Infra/InversifyExpressUtils/AnnotatedUsersController.ts

@@ -18,7 +18,6 @@ import { ClearLoginAttempts } from '../../Domain/UseCase/ClearLoginAttempts'
 import { IncreaseLoginAttempts } from '../../Domain/UseCase/IncreaseLoginAttempts'
 import { ChangeCredentials } from '../../Domain/UseCase/ChangeCredentials/ChangeCredentials'
 import { BaseUsersController } from './Base/BaseUsersController'
-import { GetTransitionStatus } from '../../Domain/UseCase/GetTransitionStatus/GetTransitionStatus'
 
 @controller('/users')
 export class AnnotatedUsersController extends BaseUsersController {
@@ -30,7 +29,6 @@ export class AnnotatedUsersController extends BaseUsersController {
     @inject(TYPES.Auth_ClearLoginAttempts) override clearLoginAttempts: ClearLoginAttempts,
     @inject(TYPES.Auth_IncreaseLoginAttempts) override increaseLoginAttempts: IncreaseLoginAttempts,
     @inject(TYPES.Auth_ChangeCredentials) override changeCredentialsUseCase: ChangeCredentials,
-    @inject(TYPES.Auth_GetTransitionStatus) override getTransitionStatusUseCase: GetTransitionStatus,
   ) {
     super(
       updateUser,
@@ -40,7 +38,6 @@ export class AnnotatedUsersController extends BaseUsersController {
       clearLoginAttempts,
       increaseLoginAttempts,
       changeCredentialsUseCase,
-      getTransitionStatusUseCase,
     )
   }
 
@@ -54,11 +51,6 @@ export class AnnotatedUsersController extends BaseUsersController {
     return super.keyParams(request)
   }
 
-  @httpGet('/transition-status', TYPES.Auth_RequiredCrossServiceTokenMiddleware)
-  override async transitionStatus(request: Request, response: Response): Promise<results.JsonResult> {
-    return super.transitionStatus(request, response)
-  }
-
   @httpDelete('/:userUuid', TYPES.Auth_RequiredCrossServiceTokenMiddleware)
   override async deleteAccount(request: Request, response: Response): Promise<results.JsonResult> {
     return super.deleteAccount(request, response)

+ 0 - 27
packages/auth/src/Infra/InversifyExpressUtils/Base/BaseUsersController.ts

@@ -10,7 +10,6 @@ import { GetUserSubscription } from '../../../Domain/UseCase/GetUserSubscription
 import { IncreaseLoginAttempts } from '../../../Domain/UseCase/IncreaseLoginAttempts'
 import { UpdateUser } from '../../../Domain/UseCase/UpdateUser'
 import { ErrorTag } from '@standardnotes/responses'
-import { GetTransitionStatus } from '../../../Domain/UseCase/GetTransitionStatus/GetTransitionStatus'
 
 export class BaseUsersController extends BaseHttpController {
   constructor(
@@ -21,7 +20,6 @@ export class BaseUsersController extends BaseHttpController {
     protected clearLoginAttempts: ClearLoginAttempts,
     protected increaseLoginAttempts: IncreaseLoginAttempts,
     protected changeCredentialsUseCase: ChangeCredentials,
-    protected getTransitionStatusUseCase: GetTransitionStatus,
     private controllerContainer?: ControllerContainerInterface,
   ) {
     super()
@@ -32,7 +30,6 @@ export class BaseUsersController extends BaseHttpController {
       this.controllerContainer.register('auth.users.getSubscription', this.getSubscription.bind(this))
       this.controllerContainer.register('auth.users.updateCredentials', this.changeCredentials.bind(this))
       this.controllerContainer.register('auth.users.delete', this.deleteAccount.bind(this))
-      this.controllerContainer.register('auth.users.transition-status', this.transitionStatus.bind(this))
     }
   }
 
@@ -106,30 +103,6 @@ export class BaseUsersController extends BaseHttpController {
     return this.json(result.keyParams)
   }
 
-  async transitionStatus(_request: Request, response: Response): Promise<results.JsonResult> {
-    const result = await this.getTransitionStatusUseCase.execute({
-      userUuid: response.locals.user.uuid,
-      transitionType: 'items',
-    })
-
-    if (result.isFailed()) {
-      return this.json(
-        {
-          error: {
-            message: result.getError(),
-          },
-        },
-        400,
-      )
-    }
-
-    response.setHeader('x-invalidate-cache', response.locals.user.uuid)
-
-    return this.json({
-      status: result.getValue(),
-    })
-  }
-
   async deleteAccount(request: Request, response: Response): Promise<results.JsonResult> {
     if (request.params.userUuid !== response.locals.user.uuid) {
       return this.json(

+ 0 - 3
packages/revisions/src/Bootstrap/Container.ts

@@ -520,9 +520,6 @@ export class ContainerConfigLoader {
             container.get<DeleteRevision>(TYPES.Revisions_DeleteRevision),
             container.get<RevisionHttpMapper>(TYPES.Revisions_RevisionHttpMapper),
             container.get<RevisionMetadataHttpMapper>(TYPES.Revisions_RevisionMetadataHttpMapper),
-            container.get<TriggerTransitionFromPrimaryToSecondaryDatabaseForUser>(
-              TYPES.Revisions_TriggerTransitionFromPrimaryToSecondaryDatabaseForUser,
-            ),
             container.get<ControllerContainerInterface>(TYPES.Revisions_ControllerContainer),
           ),
         )

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

@@ -9,6 +9,7 @@ export class DomainEventFactory implements DomainEventFactoryInterface {
   createTransitionStatusUpdatedEvent(dto: {
     userUuid: string
     transitionType: 'items' | 'revisions'
+    transitionTimestamp: number
     status: 'STARTED' | 'FAILED' | 'FINISHED'
   }): TransitionStatusUpdatedEvent {
     return {
@@ -21,10 +22,7 @@ export class DomainEventFactory implements DomainEventFactoryInterface {
         },
         origin: DomainEventService.SyncingServer,
       },
-      payload: {
-        transitionTimestamp: this.timer.getTimestampInMicroseconds(),
-        ...dto,
-      },
+      payload: dto,
     }
   }
 }

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

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

+ 1 - 0
packages/revisions/src/Domain/Handler/TransitionRequestedEventHandler.ts

@@ -18,6 +18,7 @@ export class TransitionRequestedEventHandler implements DomainEventHandlerInterf
 
     const result = await this.triggerTransitionFromPrimaryToSecondaryDatabaseForUser.execute({
       userUuid: event.payload.userUuid,
+      transitionTimestamp: event.payload.timestamp,
     })
 
     if (result.isFailed()) {

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

@@ -25,6 +25,7 @@ export class TransitionStatusUpdatedEventHandler implements DomainEventHandlerIn
           userUuid: event.payload.userUuid,
           status: 'STARTED',
           transitionType: 'revisions',
+          transitionTimestamp: event.payload.transitionTimestamp,
         }),
       )
 
@@ -42,6 +43,7 @@ export class TransitionStatusUpdatedEventHandler implements DomainEventHandlerIn
             userUuid: event.payload.userUuid,
             status: 'FAILED',
             transitionType: 'revisions',
+            transitionTimestamp: event.payload.transitionTimestamp,
           }),
         )
 
@@ -54,6 +56,7 @@ export class TransitionStatusUpdatedEventHandler implements DomainEventHandlerIn
             userUuid: event.payload.userUuid,
             status: 'FINISHED',
             transitionType: 'revisions',
+            transitionTimestamp: event.payload.transitionTimestamp,
           }),
         )
 
@@ -65,6 +68,7 @@ export class TransitionStatusUpdatedEventHandler implements DomainEventHandlerIn
           userUuid: event.payload.userUuid,
           status: 'IN_PROGRESS',
           transitionType: 'revisions',
+          transitionTimestamp: event.payload.transitionTimestamp,
         }),
       )
 
@@ -80,6 +84,7 @@ export class TransitionStatusUpdatedEventHandler implements DomainEventHandlerIn
             userUuid: event.payload.userUuid,
             status: 'FAILED',
             transitionType: 'revisions',
+            transitionTimestamp: event.payload.transitionTimestamp,
           }),
         )
 
@@ -91,6 +96,7 @@ export class TransitionStatusUpdatedEventHandler implements DomainEventHandlerIn
           userUuid: event.payload.userUuid,
           status: 'FINISHED',
           transitionType: 'revisions',
+          transitionTimestamp: event.payload.transitionTimestamp,
         }),
       )
 

+ 1 - 0
packages/revisions/src/Domain/UseCase/Transition/TriggerTransitionFromPrimaryToSecondaryDatabaseForUser/TriggerTransitionFromPrimaryToSecondaryDatabaseForUser.spec.ts

@@ -23,6 +23,7 @@ describe('TriggerTransitionFromPrimaryToSecondaryDatabaseForUser', () => {
 
     await useCase.execute({
       userUuid: '00000000-0000-0000-0000-000000000000',
+      transitionTimestamp: 123,
     })
 
     expect(domainEventPubliser.publish).toHaveBeenCalled()

+ 1 - 0
packages/revisions/src/Domain/UseCase/Transition/TriggerTransitionFromPrimaryToSecondaryDatabaseForUser/TriggerTransitionFromPrimaryToSecondaryDatabaseForUser.ts

@@ -15,6 +15,7 @@ export class TriggerTransitionFromPrimaryToSecondaryDatabaseForUser implements U
       userUuid: dto.userUuid,
       status: 'STARTED',
       transitionType: 'revisions',
+      transitionTimestamp: dto.transitionTimestamp,
     })
 
     await this.domainEventPubliser.publish(event)

+ 1 - 0
packages/revisions/src/Domain/UseCase/Transition/TriggerTransitionFromPrimaryToSecondaryDatabaseForUser/TriggerTransitionFromPrimaryToSecondaryDatabaseForUserDTO.ts

@@ -1,3 +1,4 @@
 export interface TriggerTransitionFromPrimaryToSecondaryDatabaseForUserDTO {
   userUuid: string
+  transitionTimestamp: number
 }

+ 2 - 17
packages/revisions/src/Infra/InversifyExpress/AnnotatedRevisionsController.ts

@@ -1,5 +1,5 @@
 import { Request, Response } from 'express'
-import { controller, httpDelete, httpGet, httpPost, results } from 'inversify-express-utils'
+import { controller, httpDelete, httpGet, results } from 'inversify-express-utils'
 import { inject } from 'inversify'
 
 import TYPES from '../../Bootstrap/Types'
@@ -12,7 +12,6 @@ import { Revision } from '../../Domain/Revision/Revision'
 import { RevisionMetadata } from '../../Domain/Revision/RevisionMetadata'
 import { RevisionHttpRepresentation } from '../../Mapping/Http/RevisionHttpRepresentation'
 import { RevisionMetadataHttpRepresentation } from '../../Mapping/Http/RevisionMetadataHttpRepresentation'
-import { TriggerTransitionFromPrimaryToSecondaryDatabaseForUser } from '../../Domain/UseCase/Transition/TriggerTransitionFromPrimaryToSecondaryDatabaseForUser/TriggerTransitionFromPrimaryToSecondaryDatabaseForUser'
 
 @controller('', TYPES.Revisions_ApiGatewayAuthMiddleware)
 export class AnnotatedRevisionsController extends BaseRevisionsController {
@@ -24,17 +23,8 @@ export class AnnotatedRevisionsController extends BaseRevisionsController {
     override revisionHttpMapper: MapperInterface<Revision, RevisionHttpRepresentation>,
     @inject(TYPES.Revisions_RevisionMetadataHttpMapper)
     override revisionMetadataHttpMapper: MapperInterface<RevisionMetadata, RevisionMetadataHttpRepresentation>,
-    @inject(TYPES.Revisions_TriggerTransitionFromPrimaryToSecondaryDatabaseForUser)
-    override triggerTransitionFromPrimaryToSecondaryDatabaseForUser: TriggerTransitionFromPrimaryToSecondaryDatabaseForUser,
   ) {
-    super(
-      getRevisionsMetadata,
-      doGetRevision,
-      doDeleteRevision,
-      revisionHttpMapper,
-      revisionMetadataHttpMapper,
-      triggerTransitionFromPrimaryToSecondaryDatabaseForUser,
-    )
+    super(getRevisionsMetadata, doGetRevision, doDeleteRevision, revisionHttpMapper, revisionMetadataHttpMapper)
   }
 
   @httpGet('/items/:itemUuid/revisions')
@@ -51,9 +41,4 @@ export class AnnotatedRevisionsController extends BaseRevisionsController {
   override async deleteRevision(request: Request, response: Response): Promise<results.JsonResult> {
     return super.deleteRevision(request, response)
   }
-
-  @httpPost('/revisions/transition')
-  override async transition(request: Request, response: Response): Promise<results.JsonResult> {
-    return super.transition(request, response)
-  }
 }

+ 0 - 22
packages/revisions/src/Infra/InversifyExpress/Base/BaseRevisionsController.ts

@@ -11,7 +11,6 @@ import { GetRevision } from '../../../Domain/UseCase/GetRevision/GetRevision'
 import { GetRevisionsMetada } from '../../../Domain/UseCase/GetRevisionsMetada/GetRevisionsMetada'
 import { RevisionHttpRepresentation } from '../../../Mapping/Http/RevisionHttpRepresentation'
 import { RevisionMetadataHttpRepresentation } from '../../../Mapping/Http/RevisionMetadataHttpRepresentation'
-import { TriggerTransitionFromPrimaryToSecondaryDatabaseForUser } from '../../../Domain/UseCase/Transition/TriggerTransitionFromPrimaryToSecondaryDatabaseForUser/TriggerTransitionFromPrimaryToSecondaryDatabaseForUser'
 
 export class BaseRevisionsController extends BaseHttpController {
   constructor(
@@ -20,7 +19,6 @@ export class BaseRevisionsController extends BaseHttpController {
     protected doDeleteRevision: DeleteRevision,
     protected revisionHttpMapper: MapperInterface<Revision, RevisionHttpRepresentation>,
     protected revisionMetadataHttpMapper: MapperInterface<RevisionMetadata, RevisionMetadataHttpRepresentation>,
-    protected triggerTransitionFromPrimaryToSecondaryDatabaseForUser: TriggerTransitionFromPrimaryToSecondaryDatabaseForUser,
     private controllerContainer?: ControllerContainerInterface,
   ) {
     super()
@@ -29,7 +27,6 @@ export class BaseRevisionsController extends BaseHttpController {
       this.controllerContainer.register('revisions.revisions.getRevisions', this.getRevisions.bind(this))
       this.controllerContainer.register('revisions.revisions.getRevision', this.getRevision.bind(this))
       this.controllerContainer.register('revisions.revisions.deleteRevision', this.deleteRevision.bind(this))
-      this.controllerContainer.register('revisions.revisions.transition', this.transition.bind(this))
     }
   }
 
@@ -108,23 +105,4 @@ export class BaseRevisionsController extends BaseHttpController {
       message: revisionOrError.getValue(),
     })
   }
-
-  async transition(_request: Request, response: Response): Promise<results.JsonResult> {
-    const result = await this.triggerTransitionFromPrimaryToSecondaryDatabaseForUser.execute({
-      userUuid: response.locals.user.uuid,
-    })
-
-    if (result.isFailed()) {
-      return this.json(
-        {
-          error: { message: result.getError() },
-        },
-        400,
-      )
-    }
-
-    response.setHeader('x-invalidate-cache', response.locals.user.uuid)
-
-    return this.json({ success: true })
-  }
 }

+ 5 - 1
packages/syncing-server/bin/transition.ts

@@ -6,16 +6,19 @@ import { ContainerConfigLoader } from '../src/Bootstrap/Container'
 import TYPES from '../src/Bootstrap/Types'
 import { Env } from '../src/Bootstrap/Env'
 import { TriggerTransitionFromPrimaryToSecondaryDatabaseForUser } from '../src/Domain/UseCase/Transition/TriggerTransitionFromPrimaryToSecondaryDatabaseForUser/TriggerTransitionFromPrimaryToSecondaryDatabaseForUser'
+import { TimerInterface } from '@standardnotes/time'
 
 const inputArgs = process.argv.slice(2)
 const userUuid = inputArgs[0]
 
 const requestTransition = async (
   triggerTransitionFromPrimaryToSecondaryDatabaseForUser: TriggerTransitionFromPrimaryToSecondaryDatabaseForUser,
+  timer: TimerInterface,
   logger: Logger,
 ): Promise<void> => {
   const result = await triggerTransitionFromPrimaryToSecondaryDatabaseForUser.execute({
     userUuid,
+    transitionTimestamp: timer.getTimestampInMicroseconds(),
   })
   if (result.isFailed()) {
     logger.error(`Could not trigger transition for user ${userUuid}: ${result.getError()}`)
@@ -35,8 +38,9 @@ void container.load().then((container) => {
 
   const triggerTransitionFromPrimaryToSecondaryDatabaseForUser: TriggerTransitionFromPrimaryToSecondaryDatabaseForUser =
     container.get(TYPES.Sync_TriggerTransitionFromPrimaryToSecondaryDatabaseForUser)
+  const timer = container.get<TimerInterface>(TYPES.Sync_Timer)
 
-  Promise.resolve(requestTransition(triggerTransitionFromPrimaryToSecondaryDatabaseForUser, logger))
+  Promise.resolve(requestTransition(triggerTransitionFromPrimaryToSecondaryDatabaseForUser, timer, logger))
     .then(() => {
       logger.info(`Transition triggered for user ${userUuid}`)
 

+ 0 - 3
packages/syncing-server/src/Bootstrap/Container.ts

@@ -1090,9 +1090,6 @@ export class ContainerConfigLoader {
             container.get<SyncItems>(TYPES.Sync_SyncItems),
             container.get<CheckIntegrity>(TYPES.Sync_CheckIntegrity),
             container.get<GetItem>(TYPES.Sync_GetItem),
-            container.get<TriggerTransitionFromPrimaryToSecondaryDatabaseForUser>(
-              TYPES.Sync_TriggerTransitionFromPrimaryToSecondaryDatabaseForUser,
-            ),
             container.get<MapperInterface<Item, ItemHttpRepresentation>>(TYPES.Sync_ItemHttpMapper),
             container.get<SyncResponseFactoryResolverInterface>(TYPES.Sync_SyncResponseFactoryResolver),
             container.get<ControllerContainerInterface>(TYPES.Sync_ControllerContainer),

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

@@ -172,6 +172,7 @@ export class DomainEventFactory implements DomainEventFactoryInterface {
   createTransitionStatusUpdatedEvent(dto: {
     userUuid: string
     transitionType: 'items' | 'revisions'
+    transitionTimestamp: number
     status: 'STARTED' | 'FAILED' | 'FINISHED'
   }): TransitionStatusUpdatedEvent {
     return {
@@ -184,10 +185,7 @@ export class DomainEventFactory implements DomainEventFactoryInterface {
         },
         origin: DomainEventService.SyncingServer,
       },
-      payload: {
-        transitionTimestamp: this.timer.getTimestampInMicroseconds(),
-        ...dto,
-      },
+      payload: dto,
     }
   }
 

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

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

+ 1 - 0
packages/syncing-server/src/Domain/Handler/TransitionRequestedEventHandler.ts

@@ -18,6 +18,7 @@ export class TransitionRequestedEventHandler implements DomainEventHandlerInterf
 
     const result = await this.triggerTransitionFromPrimaryToSecondaryDatabaseForUser.execute({
       userUuid: event.payload.userUuid,
+      transitionTimestamp: event.payload.timestamp,
     })
 
     if (result.isFailed()) {

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

@@ -25,6 +25,7 @@ export class TransitionStatusUpdatedEventHandler implements DomainEventHandlerIn
             userUuid: event.payload.userUuid,
             status: 'FINISHED',
             transitionType: 'items',
+            transitionTimestamp: event.payload.transitionTimestamp,
           }),
         )
 
@@ -36,6 +37,7 @@ export class TransitionStatusUpdatedEventHandler implements DomainEventHandlerIn
           userUuid: event.payload.userUuid,
           status: 'IN_PROGRESS',
           transitionType: 'items',
+          transitionTimestamp: event.payload.transitionTimestamp,
         }),
       )
 
@@ -51,6 +53,7 @@ export class TransitionStatusUpdatedEventHandler implements DomainEventHandlerIn
             userUuid: event.payload.userUuid,
             status: 'FAILED',
             transitionType: 'items',
+            transitionTimestamp: event.payload.transitionTimestamp,
           }),
         )
 
@@ -62,6 +65,7 @@ export class TransitionStatusUpdatedEventHandler implements DomainEventHandlerIn
           userUuid: event.payload.userUuid,
           status: 'FINISHED',
           transitionType: 'items',
+          transitionTimestamp: event.payload.transitionTimestamp,
         }),
       )
     }

+ 1 - 0
packages/syncing-server/src/Domain/UseCase/Transition/TriggerTransitionFromPrimaryToSecondaryDatabaseForUser/TriggerTransitionFromPrimaryToSecondaryDatabaseForUser.spec.ts

@@ -23,6 +23,7 @@ describe('TriggerTransitionFromPrimaryToSecondaryDatabaseForUser', () => {
 
     await useCase.execute({
       userUuid: '00000000-0000-0000-0000-000000000000',
+      transitionTimestamp: 123,
     })
 
     expect(domainEventPubliser.publish).toHaveBeenCalled()

+ 1 - 0
packages/syncing-server/src/Domain/UseCase/Transition/TriggerTransitionFromPrimaryToSecondaryDatabaseForUser/TriggerTransitionFromPrimaryToSecondaryDatabaseForUser.ts

@@ -15,6 +15,7 @@ export class TriggerTransitionFromPrimaryToSecondaryDatabaseForUser implements U
       userUuid: dto.userUuid,
       status: 'STARTED',
       transitionType: 'items',
+      transitionTimestamp: dto.transitionTimestamp,
     })
 
     await this.domainEventPubliser.publish(event)

+ 1 - 0
packages/syncing-server/src/Domain/UseCase/Transition/TriggerTransitionFromPrimaryToSecondaryDatabaseForUser/TriggerTransitionFromPrimaryToSecondaryDatabaseForUserDTO.ts

@@ -1,3 +1,4 @@
 export interface TriggerTransitionFromPrimaryToSecondaryDatabaseForUserDTO {
   userUuid: string
+  transitionTimestamp: number
 }

+ 1 - 16
packages/syncing-server/src/Infra/InversifyExpressUtils/AnnotatedItemsController.ts

@@ -11,7 +11,6 @@ import { SyncItems } from '../../Domain/UseCase/Syncing/SyncItems/SyncItems'
 import { BaseItemsController } from './Base/BaseItemsController'
 import { MapperInterface } from '@standardnotes/domain-core'
 import { ItemHttpRepresentation } from '../../Mapping/Http/ItemHttpRepresentation'
-import { TriggerTransitionFromPrimaryToSecondaryDatabaseForUser } from '../../Domain/UseCase/Transition/TriggerTransitionFromPrimaryToSecondaryDatabaseForUser/TriggerTransitionFromPrimaryToSecondaryDatabaseForUser'
 
 @controller('/items', TYPES.Sync_AuthMiddleware)
 export class AnnotatedItemsController extends BaseItemsController {
@@ -19,20 +18,11 @@ export class AnnotatedItemsController extends BaseItemsController {
     @inject(TYPES.Sync_SyncItems) override syncItems: SyncItems,
     @inject(TYPES.Sync_CheckIntegrity) override checkIntegrity: CheckIntegrity,
     @inject(TYPES.Sync_GetItem) override getItem: GetItem,
-    @inject(TYPES.Sync_TriggerTransitionFromPrimaryToSecondaryDatabaseForUser)
-    override triggerTransitionFromPrimaryToSecondaryDatabaseForUser: TriggerTransitionFromPrimaryToSecondaryDatabaseForUser,
     @inject(TYPES.Sync_ItemHttpMapper) override itemHttpMapper: MapperInterface<Item, ItemHttpRepresentation>,
     @inject(TYPES.Sync_SyncResponseFactoryResolver)
     override syncResponseFactoryResolver: SyncResponseFactoryResolverInterface,
   ) {
-    super(
-      syncItems,
-      checkIntegrity,
-      getItem,
-      triggerTransitionFromPrimaryToSecondaryDatabaseForUser,
-      itemHttpMapper,
-      syncResponseFactoryResolver,
-    )
+    super(syncItems, checkIntegrity, getItem, itemHttpMapper, syncResponseFactoryResolver)
   }
 
   @httpPost('/sync')
@@ -45,11 +35,6 @@ export class AnnotatedItemsController extends BaseItemsController {
     return super.checkItemsIntegrity(request, response)
   }
 
-  @httpPost('/transition')
-  override async transition(request: Request, response: Response): Promise<results.JsonResult> {
-    return super.transition(request, response)
-  }
-
   @httpGet('/:uuid')
   override async getSingleItem(request: Request, response: Response): Promise<results.JsonResult> {
     return super.getSingleItem(request, response)

+ 0 - 22
packages/syncing-server/src/Infra/InversifyExpressUtils/Base/BaseItemsController.ts

@@ -12,14 +12,12 @@ import { ApiVersion } from '../../../Domain/Api/ApiVersion'
 import { SyncItems } from '../../../Domain/UseCase/Syncing/SyncItems/SyncItems'
 import { ItemHttpRepresentation } from '../../../Mapping/Http/ItemHttpRepresentation'
 import { ItemHash } from '../../../Domain/Item/ItemHash'
-import { TriggerTransitionFromPrimaryToSecondaryDatabaseForUser } from '../../../Domain/UseCase/Transition/TriggerTransitionFromPrimaryToSecondaryDatabaseForUser/TriggerTransitionFromPrimaryToSecondaryDatabaseForUser'
 
 export class BaseItemsController extends BaseHttpController {
   constructor(
     protected syncItems: SyncItems,
     protected checkIntegrity: CheckIntegrity,
     protected getItem: GetItem,
-    protected triggerTransitionFromPrimaryToSecondaryDatabaseForUser: TriggerTransitionFromPrimaryToSecondaryDatabaseForUser,
     protected itemHttpMapper: MapperInterface<Item, ItemHttpRepresentation>,
     protected syncResponseFactoryResolver: SyncResponseFactoryResolverInterface,
     private controllerContainer?: ControllerContainerInterface,
@@ -30,7 +28,6 @@ export class BaseItemsController extends BaseHttpController {
       this.controllerContainer.register('sync.items.sync', this.sync.bind(this))
       this.controllerContainer.register('sync.items.check_integrity', this.checkItemsIntegrity.bind(this))
       this.controllerContainer.register('sync.items.get_item', this.getSingleItem.bind(this))
-      this.controllerContainer.register('sync.items.transition', this.transition.bind(this))
     }
   }
 
@@ -113,25 +110,6 @@ export class BaseItemsController extends BaseHttpController {
     })
   }
 
-  async transition(_request: Request, response: Response): Promise<results.JsonResult> {
-    const result = await this.triggerTransitionFromPrimaryToSecondaryDatabaseForUser.execute({
-      userUuid: response.locals.user.uuid,
-    })
-
-    if (result.isFailed()) {
-      return this.json(
-        {
-          error: { message: result.getError() },
-        },
-        400,
-      )
-    }
-
-    response.setHeader('x-invalidate-cache', response.locals.user.uuid)
-
-    return this.json({ success: true })
-  }
-
   async getSingleItem(request: Request, response: Response): Promise<results.JsonResult> {
     const result = await this.getItem.execute({
       userUuid: response.locals.user.uuid,