mirror of
https://github.com/dadosfera/maestro.git
synced 2026-11-01 12:39:08 +00:00
119 lines
3.2 KiB
TypeScript
119 lines
3.2 KiB
TypeScript
import DadosferaLogger from '@dadosfera/dadosfera-logs';
|
|
import { Inject } from '@nestjs/common';
|
|
import { Request } from 'express';
|
|
import mixpanel, { init } from 'mixpanel';
|
|
import { RequestUser } from 'src/decorators/user.decorator';
|
|
|
|
export class MixpanelService {
|
|
logger: DadosferaLogger;
|
|
|
|
constructor(
|
|
@Inject('MIXPANEL_TOKEN')
|
|
private readonly mixpanelToken: string,
|
|
@Inject(DadosferaLogger)
|
|
dadosferaLogger: DadosferaLogger,
|
|
) {
|
|
this.logger = dadosferaLogger.logger;
|
|
}
|
|
|
|
async track(eventName: string, user: RequestUser, request: Request, body: any) {
|
|
this.logger.info("track: " + JSON.stringify({
|
|
eventName,
|
|
...body
|
|
}))
|
|
const mixpanel = init(this.mixpanelToken);
|
|
await this.setPeople(user, mixpanel);
|
|
|
|
await mixpanel.track(eventName, {
|
|
distinct_id: user.username,
|
|
customer: user.customer_name,
|
|
env: process.env.ENV,
|
|
$ip: request.ip,
|
|
$os: request.headers['sec-ch-ua-platform'] || '',
|
|
$browser: request.headers['user-agent'],
|
|
...body,
|
|
});
|
|
return;
|
|
}
|
|
|
|
async trackShare(request: Request, body: any) {
|
|
this.logger.info("trackShare: " + JSON.stringify(body))
|
|
const mixpanel = init(this.mixpanelToken);
|
|
|
|
await mixpanel.track("share_page", {
|
|
env: process.env.ENV,
|
|
$ip: request.ip,
|
|
$os: request.headers['sec-ch-ua-platform'] || '',
|
|
$browser: request.headers['user-agent'],
|
|
...body,
|
|
});
|
|
return;
|
|
}
|
|
|
|
private async setPeople(user: RequestUser, mixpanel: mixpanel.Mixpanel) {
|
|
const separator = user.username.includes('-') ? '-' : '.';
|
|
const removeValues = [
|
|
'.dadosferatech.dadosfera',
|
|
'.demo.dadosfera',
|
|
'.dadosferademo',
|
|
'.dadosferarh.dadosfera',
|
|
'.dadosferatech.dadosfera2',
|
|
'.dadosferatech.dadosfera',
|
|
'.dadosfera.fin',
|
|
'.dadosferafin.dadosfera',
|
|
'.praxio.dadosfera',
|
|
'.dadosfera.tech',
|
|
'.treinamentos@dadosfera.ai',
|
|
'.dadosfera2',
|
|
'.treinamentosfera',
|
|
'.dadosfera',
|
|
];
|
|
|
|
let username = user.username;
|
|
|
|
removeValues.forEach((value) => {
|
|
username = username.replace(value, '');
|
|
});
|
|
|
|
username = username.split('@')?.[0];
|
|
username = username.split('+')?.[0];
|
|
|
|
let firstName = username
|
|
.substring(0, username.indexOf(separator))
|
|
.replace('dadosfera', '');
|
|
let lastName = username
|
|
.substring(username.lastIndexOf(separator) + 1)
|
|
.replace('dadosfera', '');
|
|
|
|
if (!firstName) {
|
|
firstName = lastName;
|
|
lastName = '';
|
|
}
|
|
|
|
firstName = this.capitalize(firstName);
|
|
lastName = this.capitalize(lastName);
|
|
|
|
await mixpanel.people.set(user.username, {
|
|
$first_name: firstName,
|
|
$last_name: lastName,
|
|
$name: this.getFullName(firstName, lastName),
|
|
$email: user.username.includes('@')
|
|
? user.username
|
|
: user.username + '@dadosfera.ai',
|
|
customer_name: user.customer_name,
|
|
});
|
|
}
|
|
|
|
private capitalize(sentence: string): string {
|
|
if (!sentence) {
|
|
return '';
|
|
}
|
|
|
|
return sentence[0].toUpperCase() + sentence.substring(1);
|
|
}
|
|
|
|
private getFullName(firstName: string, lastName: string) {
|
|
return `${firstName}${lastName ? ' ' + lastName : ''}`;
|
|
}
|
|
}
|