fix(auth): add persisting statistics for all subscription plans

This commit is contained in:
Karol Sójko
2022-12-20 08:45:43 +01:00
parent 2ea17b2dea
commit addedb3091
5 changed files with 56 additions and 5 deletions
@@ -27,6 +27,9 @@ export class StatisticMeasureName extends ValueObject<StatisticMeasureNameProps>
ProPlansMRR: 'pro-plans-mrr',
PlusPlansMRR: 'plus-plans-mrr',
ActiveUsers: 'active-users',
ActiveProUsers: 'active-pro-users',
ActivePlusUsers: 'active-plus-users',
ActiveFreeUsers: 'active-free-users',
}
get value(): string {
@@ -1,4 +1,4 @@
import { Uuid } from '@standardnotes/domain-core'
import { SubscriptionPlanName, Uuid } from '@standardnotes/domain-core'
import { SessionTrace } from './SessionTrace'
@@ -7,4 +7,5 @@ export interface SessionTraceRepositoryInterface {
removeExpiredBefore(date: Date): Promise<void>
findOneByUserUuidAndDate(userUuid: Uuid, date: Date): Promise<SessionTrace | null>
countByDate(date: Date): Promise<number>
countByDateAndSubscriptionPlanName(date: Date, subscriptionPlanName: SubscriptionPlanName): Promise<number>
}
@@ -14,6 +14,7 @@ describe('PersistStatistics', () => {
beforeEach(() => {
sessionTracesRepository = {} as jest.Mocked<SessionTraceRepositoryInterface>
sessionTracesRepository.countByDate = jest.fn().mockReturnValue(1)
sessionTracesRepository.countByDateAndSubscriptionPlanName = jest.fn().mockReturnValue(2)
domainEventFactory = {} as jest.Mocked<DomainEventFactoryInterface>
domainEventFactory.createStatisticPersistenceRequestedEvent = jest
@@ -27,6 +28,6 @@ describe('PersistStatistics', () => {
it('should request statistic persistence', async () => {
await createUseCase().execute({ sessionsInADay: new Date() })
expect(domainEventPublisher.publish).toHaveBeenCalled()
expect(domainEventPublisher.publish).toHaveBeenCalledTimes(4)
})
})
@@ -1,4 +1,4 @@
import { Result, UseCaseInterface } from '@standardnotes/domain-core'
import { Result, SubscriptionPlanName, UseCaseInterface } from '@standardnotes/domain-core'
import { DomainEventPublisherInterface } from '@standardnotes/domain-events'
import { DomainEventFactoryInterface } from '../../Event/DomainEventFactoryInterface'
import { SessionTraceRepositoryInterface } from '../../Session/SessionTraceRepositoryInterface'
@@ -13,7 +13,6 @@ export class PersistStatistics implements UseCaseInterface<string> {
async execute(dto: PersistStatisticsDTO): Promise<Result<string>> {
const countSessionsInADay = await this.sessionTracesRepository.countByDate(dto.sessionsInADay)
await this.domainEventPublisher.publish(
this.domainEventFactory.createStatisticPersistenceRequestedEvent({
statisticMeasureName: 'active-users',
@@ -22,6 +21,41 @@ export class PersistStatistics implements UseCaseInterface<string> {
}),
)
const proSubscriptionPlanName = SubscriptionPlanName.create(SubscriptionPlanName.NAMES.ProPlan).getValue()
const countProSessionsInADay = await this.sessionTracesRepository.countByDateAndSubscriptionPlanName(
dto.sessionsInADay,
proSubscriptionPlanName,
)
await this.domainEventPublisher.publish(
this.domainEventFactory.createStatisticPersistenceRequestedEvent({
statisticMeasureName: 'active-pro-users',
value: countProSessionsInADay,
date: dto.sessionsInADay,
}),
)
const plusSubscriptionPlanName = SubscriptionPlanName.create(SubscriptionPlanName.NAMES.PlusPlan).getValue()
const countPlusSessionsInADay = await this.sessionTracesRepository.countByDateAndSubscriptionPlanName(
dto.sessionsInADay,
plusSubscriptionPlanName,
)
await this.domainEventPublisher.publish(
this.domainEventFactory.createStatisticPersistenceRequestedEvent({
statisticMeasureName: 'active-plus-users',
value: countPlusSessionsInADay,
date: dto.sessionsInADay,
}),
)
const countFreeSessionsInADay = countSessionsInADay - countProSessionsInADay - countPlusSessionsInADay
await this.domainEventPublisher.publish(
this.domainEventFactory.createStatisticPersistenceRequestedEvent({
statisticMeasureName: 'active-free-users',
value: countFreeSessionsInADay,
date: dto.sessionsInADay,
}),
)
return Result.ok('Statistics persisted.')
}
}
@@ -1,4 +1,4 @@
import { MapperInterface, Uuid } from '@standardnotes/domain-core'
import { MapperInterface, SubscriptionPlanName, Uuid } from '@standardnotes/domain-core'
import { Repository } from 'typeorm'
import { SessionTrace } from '../../Domain/Session/SessionTrace'
import { SessionTraceRepositoryInterface } from '../../Domain/Session/SessionTraceRepositoryInterface'
@@ -10,6 +10,18 @@ export class MySQLSessionTraceRepository implements SessionTraceRepositoryInterf
private mapper: MapperInterface<SessionTrace, TypeORMSessionTrace>,
) {}
async countByDateAndSubscriptionPlanName(date: Date, subscriptionPlanName: SubscriptionPlanName): Promise<number> {
return this.ormRepository
.createQueryBuilder('trace')
.where('trace.creation_date = :creationDate', {
creationDate: new Date(date.getFullYear(), date.getMonth(), date.getDate()),
})
.andWhere('trace.subscription_plan_name = :subscriptionPlanName', {
subscriptionPlanName: subscriptionPlanName.value,
})
.getCount()
}
async countByDate(date: Date): Promise<number> {
return this.ormRepository
.createQueryBuilder('trace')