mirror of
https://github.com/standardnotes/server
synced 2026-10-14 03:13:45 -04:00
fix(auth): add persisting statistics for all subscription plans
This commit is contained in:
@@ -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')
|
||||
|
||||
Reference in New Issue
Block a user