59 lines
1.8 KiB
TypeScript
59 lines
1.8 KiB
TypeScript
import { Injectable } from '@nestjs/common';
|
|
import { PostHog } from 'posthog-node';
|
|
import { Cron, CronExpression, SchedulerRegistry } from '@nestjs/schedule';
|
|
import { ConfigService } from '@nestjs/config';
|
|
import { PrismaService } from 'src/prisma/prisma.service';
|
|
import { CronJob } from 'cron';
|
|
import { POSTHOG_CLIENT_NOT_INITIALIZED } from 'src/errors';
|
|
import { throwErr } from 'src/utils';
|
|
@Injectable()
|
|
export class PosthogService {
|
|
private postHogClient: PostHog;
|
|
private POSTHOG_API_KEY = 'phc_9CipPajQC22mSkk2wxe2TXsUA0Ysyupe8dt5KQQELqx';
|
|
|
|
constructor(
|
|
private readonly configService: ConfigService,
|
|
private readonly prismaService: PrismaService,
|
|
private schedulerRegistry: SchedulerRegistry,
|
|
) {}
|
|
|
|
async onModuleInit() {
|
|
if (this.configService.get('INFRA.ALLOW_ANALYTICS_COLLECTION') === 'true') {
|
|
console.log('Initializing PostHog');
|
|
this.postHogClient = new PostHog(this.POSTHOG_API_KEY, {
|
|
host: 'https://eu.posthog.com',
|
|
});
|
|
|
|
// Schedule the cron job only if analytics collection is allowed
|
|
this.scheduleCronJob();
|
|
}
|
|
}
|
|
|
|
private scheduleCronJob() {
|
|
const job = new CronJob(CronExpression.EVERY_WEEK, async () => {
|
|
await this.capture();
|
|
});
|
|
|
|
this.schedulerRegistry.addCronJob('captureAnalytics', job);
|
|
job.start();
|
|
}
|
|
|
|
async capture() {
|
|
if (!this.postHogClient) {
|
|
throwErr(POSTHOG_CLIENT_NOT_INITIALIZED);
|
|
}
|
|
|
|
this.postHogClient.capture({
|
|
distinctId: this.configService.get('INFRA.ANALYTICS_USER_ID'),
|
|
event: 'sh_instance',
|
|
properties: {
|
|
type: 'COMMUNITY',
|
|
total_user_count: await this.prismaService.user.count(),
|
|
total_workspace_count: await this.prismaService.team.count(),
|
|
version: this.configService.get('npm_package_version'),
|
|
},
|
|
});
|
|
console.log('Sent event to PostHog');
|
|
}
|
|
}
|