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