Browse Source

fix(auth): add debug logs for canceling shared subscription invitations

Karol Sójko 2 năm trước cách đây
mục cha
commit
dd13e2eaf7

+ 6 - 0
packages/auth/src/Domain/UseCase/CancelSharedSubscriptionInvitation/CancelSharedSubscriptionInvitation.spec.ts

@@ -16,6 +16,7 @@ import { DomainEventPublisherInterface, SharedSubscriptionInvitationCanceledEven
 import { DomainEventFactoryInterface } from '../../Event/DomainEventFactoryInterface'
 import { DomainEventFactoryInterface } from '../../Event/DomainEventFactoryInterface'
 import { InviterIdentifierType } from '../../SharedSubscription/InviterIdentifierType'
 import { InviterIdentifierType } from '../../SharedSubscription/InviterIdentifierType'
 import { InviteeIdentifierType } from '../../SharedSubscription/InviteeIdentifierType'
 import { InviteeIdentifierType } from '../../SharedSubscription/InviteeIdentifierType'
+import { Logger } from 'winston'
 
 
 describe('CancelSharedSubscriptionInvitation', () => {
 describe('CancelSharedSubscriptionInvitation', () => {
   let sharedSubscriptionInvitationRepository: SharedSubscriptionInvitationRepositoryInterface
   let sharedSubscriptionInvitationRepository: SharedSubscriptionInvitationRepositoryInterface
@@ -28,6 +29,7 @@ describe('CancelSharedSubscriptionInvitation', () => {
   let invitation: SharedSubscriptionInvitation
   let invitation: SharedSubscriptionInvitation
   let domainEventPublisher: DomainEventPublisherInterface
   let domainEventPublisher: DomainEventPublisherInterface
   let domainEventFactory: DomainEventFactoryInterface
   let domainEventFactory: DomainEventFactoryInterface
+  let logger: Logger
 
 
   const createUseCase = () =>
   const createUseCase = () =>
     new CancelSharedSubscriptionInvitation(
     new CancelSharedSubscriptionInvitation(
@@ -38,6 +40,7 @@ describe('CancelSharedSubscriptionInvitation', () => {
       domainEventPublisher,
       domainEventPublisher,
       domainEventFactory,
       domainEventFactory,
       timer,
       timer,
+      logger,
     )
     )
 
 
   beforeEach(() => {
   beforeEach(() => {
@@ -60,6 +63,9 @@ describe('CancelSharedSubscriptionInvitation', () => {
       inviteeIdentifierType: InviteeIdentifierType.Email,
       inviteeIdentifierType: InviteeIdentifierType.Email,
     } as jest.Mocked<SharedSubscriptionInvitation>
     } as jest.Mocked<SharedSubscriptionInvitation>
 
 
+    logger = {} as jest.Mocked<Logger>
+    logger.debug = jest.fn()
+
     sharedSubscriptionInvitationRepository = {} as jest.Mocked<SharedSubscriptionInvitationRepositoryInterface>
     sharedSubscriptionInvitationRepository = {} as jest.Mocked<SharedSubscriptionInvitationRepositoryInterface>
     sharedSubscriptionInvitationRepository.findOneByUuid = jest.fn().mockReturnValue(invitation)
     sharedSubscriptionInvitationRepository.findOneByUuid = jest.fn().mockReturnValue(invitation)
     sharedSubscriptionInvitationRepository.save = jest.fn()
     sharedSubscriptionInvitationRepository.save = jest.fn()

+ 13 - 1
packages/auth/src/Domain/UseCase/CancelSharedSubscriptionInvitation/CancelSharedSubscriptionInvitation.ts

@@ -2,6 +2,7 @@ import { SubscriptionName } from '@standardnotes/common'
 import { DomainEventPublisherInterface } from '@standardnotes/domain-events'
 import { DomainEventPublisherInterface } from '@standardnotes/domain-events'
 import { TimerInterface } from '@standardnotes/time'
 import { TimerInterface } from '@standardnotes/time'
 import { inject, injectable } from 'inversify'
 import { inject, injectable } from 'inversify'
+import { Logger } from 'winston'
 
 
 import TYPES from '../../../Bootstrap/Types'
 import TYPES from '../../../Bootstrap/Types'
 import { DomainEventFactoryInterface } from '../../Event/DomainEventFactoryInterface'
 import { DomainEventFactoryInterface } from '../../Event/DomainEventFactoryInterface'
@@ -29,6 +30,7 @@ export class CancelSharedSubscriptionInvitation implements UseCaseInterface {
     @inject(TYPES.DomainEventPublisher) private domainEventPublisher: DomainEventPublisherInterface,
     @inject(TYPES.DomainEventPublisher) private domainEventPublisher: DomainEventPublisherInterface,
     @inject(TYPES.DomainEventFactory) private domainEventFactory: DomainEventFactoryInterface,
     @inject(TYPES.DomainEventFactory) private domainEventFactory: DomainEventFactoryInterface,
     @inject(TYPES.Timer) private timer: TimerInterface,
     @inject(TYPES.Timer) private timer: TimerInterface,
+    @inject(TYPES.Logger) private logger: Logger,
   ) {}
   ) {}
 
 
   async execute(dto: CancelSharedSubscriptionInvitationDTO): Promise<CancelSharedSubscriptionInvitationResponse> {
   async execute(dto: CancelSharedSubscriptionInvitationDTO): Promise<CancelSharedSubscriptionInvitationResponse> {
@@ -36,12 +38,20 @@ export class CancelSharedSubscriptionInvitation implements UseCaseInterface {
       dto.sharedSubscriptionInvitationUuid,
       dto.sharedSubscriptionInvitationUuid,
     )
     )
     if (sharedSubscriptionInvitation === null) {
     if (sharedSubscriptionInvitation === null) {
+      this.logger.debug(
+        `Could not find a shared subscription invitation with uuid ${dto.sharedSubscriptionInvitationUuid}`,
+      )
+
       return {
       return {
         success: false,
         success: false,
       }
       }
     }
     }
 
 
     if (dto.inviterEmail !== sharedSubscriptionInvitation.inviterIdentifier) {
     if (dto.inviterEmail !== sharedSubscriptionInvitation.inviterIdentifier) {
+      this.logger.debug(
+        `Subscription belongs to a different inviter (${sharedSubscriptionInvitation.inviterIdentifier}). Modifier: ${dto.inviterEmail}`,
+      )
+
       return {
       return {
         success: false,
         success: false,
       }
       }
@@ -53,7 +63,9 @@ export class CancelSharedSubscriptionInvitation implements UseCaseInterface {
       sharedSubscriptionInvitation.subscriptionId,
       sharedSubscriptionInvitation.subscriptionId,
       UserSubscriptionType.Regular,
       UserSubscriptionType.Regular,
     )
     )
-    if (inviterUserSubscriptions.length !== 1) {
+    if (inviterUserSubscriptions.length === 0) {
+      this.logger.debug(`Could not find a regular subscription with id ${sharedSubscriptionInvitation.subscriptionId}`)
+
       return {
       return {
         success: false,
         success: false,
       }
       }

+ 2 - 0
packages/auth/src/Infra/MySQL/MySQLUserSubscriptionRepository.spec.ts

@@ -189,6 +189,7 @@ describe('MySQLUserSubscriptionRepository', () => {
     ormRepository.createQueryBuilder = jest.fn().mockImplementation(() => selectQueryBuilder)
     ormRepository.createQueryBuilder = jest.fn().mockImplementation(() => selectQueryBuilder)
 
 
     selectQueryBuilder.where = jest.fn().mockReturnThis()
     selectQueryBuilder.where = jest.fn().mockReturnThis()
+    selectQueryBuilder.orderBy = jest.fn().mockReturnThis()
     selectQueryBuilder.getMany = jest.fn().mockReturnValue([subscription])
     selectQueryBuilder.getMany = jest.fn().mockReturnValue([subscription])
 
 
     const result = await createRepository().findBySubscriptionIdAndType(123, UserSubscriptionType.Regular)
     const result = await createRepository().findBySubscriptionIdAndType(123, UserSubscriptionType.Regular)
@@ -200,6 +201,7 @@ describe('MySQLUserSubscriptionRepository', () => {
         type: 'regular',
         type: 'regular',
       },
       },
     )
     )
+    expect(selectQueryBuilder.orderBy).toHaveBeenCalledWith('created_at', 'DESC')
     expect(selectQueryBuilder.getMany).toHaveBeenCalled()
     expect(selectQueryBuilder.getMany).toHaveBeenCalled()
     expect(result).toEqual([subscription])
     expect(result).toEqual([subscription])
   })
   })

+ 1 - 0
packages/auth/src/Infra/MySQL/MySQLUserSubscriptionRepository.ts

@@ -44,6 +44,7 @@ export class MySQLUserSubscriptionRepository implements UserSubscriptionReposito
         subscriptionId,
         subscriptionId,
         type,
         type,
       })
       })
+      .orderBy('created_at', 'DESC')
       .getMany()
       .getMany()
   }
   }