|
|
@ -1,9 +1,11 @@ |
|
|
|
import { RedisCacheService } from '@ghostfolio/api/app/redis-cache/redis-cache.service'; |
|
|
|
import { ConfigurationService } from '@ghostfolio/api/services/configuration.service'; |
|
|
|
import { DataGatheringService } from '@ghostfolio/api/services/data-gathering.service'; |
|
|
|
import { DataProviderService } from '@ghostfolio/api/services/data-provider/data-provider.service'; |
|
|
|
import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data.service'; |
|
|
|
import { PrismaService } from '@ghostfolio/api/services/prisma.service'; |
|
|
|
import { InfoItem } from '@ghostfolio/common/interfaces'; |
|
|
|
import { Statistics } from '@ghostfolio/common/interfaces/statistics.interface'; |
|
|
|
import { Subscription } from '@ghostfolio/common/interfaces/subscription.interface'; |
|
|
|
import { permissions } from '@ghostfolio/common/permissions'; |
|
|
|
import { Injectable, Logger } from '@nestjs/common'; |
|
|
@ -14,6 +16,7 @@ import { subDays } from 'date-fns'; |
|
|
|
@Injectable() |
|
|
|
export class InfoService { |
|
|
|
private static DEMO_USER_ID = '9b112b4d-3b7d-4bad-9bdd-3b0f7b4dac2f'; |
|
|
|
private static CACHE_KEY_STATISTICS = 'STATISTICS'; |
|
|
|
|
|
|
|
public constructor( |
|
|
|
private readonly configurationService: ConfigurationService, |
|
|
@ -21,7 +24,8 @@ export class InfoService { |
|
|
|
private readonly exchangeRateDataService: ExchangeRateDataService, |
|
|
|
private readonly dataGatheringService: DataGatheringService, |
|
|
|
private readonly jwtService: JwtService, |
|
|
|
private readonly prismaService: PrismaService |
|
|
|
private readonly prismaService: PrismaService, |
|
|
|
private readonly redisCacheService: RedisCacheService |
|
|
|
) {} |
|
|
|
|
|
|
|
public async get(): Promise<InfoItem> { |
|
|
@ -176,6 +180,18 @@ export class InfoService { |
|
|
|
return undefined; |
|
|
|
} |
|
|
|
|
|
|
|
let statistics: Statistics; |
|
|
|
|
|
|
|
try { |
|
|
|
statistics = JSON.parse( |
|
|
|
await this.redisCacheService.get(InfoService.CACHE_KEY_STATISTICS) |
|
|
|
); |
|
|
|
|
|
|
|
if (statistics) { |
|
|
|
return statistics; |
|
|
|
} |
|
|
|
} catch {} |
|
|
|
|
|
|
|
const activeUsers1d = await this.countActiveUsers(1); |
|
|
|
const activeUsers7d = await this.countActiveUsers(7); |
|
|
|
const activeUsers30d = await this.countActiveUsers(30); |
|
|
@ -183,7 +199,7 @@ export class InfoService { |
|
|
|
const gitHubContributors = await this.countGitHubContributors(); |
|
|
|
const gitHubStargazers = await this.countGitHubStargazers(); |
|
|
|
|
|
|
|
return { |
|
|
|
statistics = { |
|
|
|
activeUsers1d, |
|
|
|
activeUsers7d, |
|
|
|
activeUsers30d, |
|
|
@ -191,6 +207,13 @@ export class InfoService { |
|
|
|
gitHubStargazers, |
|
|
|
newUsers30d |
|
|
|
}; |
|
|
|
|
|
|
|
await this.redisCacheService.set( |
|
|
|
InfoService.CACHE_KEY_STATISTICS, |
|
|
|
JSON.stringify(statistics) |
|
|
|
); |
|
|
|
|
|
|
|
return statistics; |
|
|
|
} |
|
|
|
|
|
|
|
private async getSubscriptions(): Promise<Subscription[]> { |
|
|
|