import { Body, Controller, Inject, Param, Post, Req } from '@nestjs/common'; import { init } from 'mixpanel'; import { Authenticated } from 'src/decorators/authentication.decorator'; import { ApiInternalOnlyController } from 'src/decorators/swagger.decorator'; import { RequestUser, User } from 'src/decorators/user.decorator'; @ApiInternalOnlyController() @Authenticated() @Controller('trackEvent') export class MixpanelController { constructor( @Inject('MIXPANEL_TOKEN') private readonly mixpanelToken: string, ) {} @Post(':id') async trackEvent( @Param('id') id, @Body() body, @User() user: RequestUser, @Req() request ) { delete body.info; const mixpanel = init(this.mixpanelToken); 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 }); await mixpanel.track(id, { 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 { id, body, user: user.username }; } capitalize(sentence: string): string { if (!sentence) { return ''; } return sentence[0].toUpperCase() + sentence.substring(1); } getFullName(firstName: string, lastName: string) { return `${firstName}${lastName ? ' ' + lastName : ''}`; } }