Skip to content

Commit c0e3d00

Browse files
authored
feat: crisp origin report (#691)
1 parent 07c8cfb commit c0e3d00

File tree

4 files changed

+62
-1
lines changed

4 files changed

+62
-1
lines changed

src/crisp/crisp.controller.ts

+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import { Controller, Get, UseGuards } from '@nestjs/common';
2+
import { ApiTags } from '@nestjs/swagger';
3+
import { SuperAdminAuthGuard } from 'src/partner-admin/super-admin-auth.guard';
4+
import { CrispService } from './crisp.service';
5+
6+
@ApiTags('Crisp')
7+
@Controller('crisp')
8+
export class CrispController {
9+
constructor(private readonly crispService: CrispService) {}
10+
11+
@Get('/analytics-message-origin')
12+
@UseGuards(SuperAdminAuthGuard)
13+
async getCrispMessageOriginAnalytics() {
14+
return this.crispService.getCrispMessageOriginAnalytics();
15+
}
16+
}

src/crisp/crisp.module.ts

+2
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,12 @@ import { TypeOrmModule } from '@nestjs/typeorm';
33
import { EventLogEntity } from 'src/entities/event-log.entity';
44
import { UserEntity } from 'src/entities/user.entity';
55
import { EventLoggerService } from 'src/event-logger/event-logger.service';
6+
import { CrispController } from './crisp.controller';
67
import { CrispService } from './crisp.service';
78

89
@Module({
910
imports: [TypeOrmModule.forFeature([EventLogEntity, UserEntity])],
1011
providers: [CrispService, EventLoggerService],
12+
controllers: [CrispController],
1113
})
1214
export class CrispModule {}

src/crisp/crisp.service.ts

+36
Original file line numberDiff line numberDiff line change
@@ -139,4 +139,40 @@ export class CrispService {
139139
throw new Error(`Delete cypress crisp profiles API call failed: ${error}`);
140140
}
141141
}
142+
143+
async getCrispMessageOriginAnalytics() {
144+
const messageSentEvents = await this.eventLoggerService.getMessageSentEventLogs();
145+
const userEmails = [...new Set(messageSentEvents.flatMap((event) => event.user.email))];
146+
147+
let totalEmailOrigin = 0;
148+
let totalChatOrigin = 0;
149+
150+
for (const userEmail of userEmails) {
151+
const conversations = await CrispClient.website.listPeopleConversations(
152+
crispWebsiteId,
153+
userEmail,
154+
);
155+
156+
for (const conversation of conversations) {
157+
const messages = await CrispClient.website.getMessagesInConversation(
158+
crispWebsiteId,
159+
conversation,
160+
);
161+
162+
for (const message of messages) {
163+
if (message.from === 'user') {
164+
if (message.origin === 'chat') totalChatOrigin++;
165+
if (message.origin === 'email') totalEmailOrigin++;
166+
}
167+
}
168+
}
169+
}
170+
const totalMessages = totalEmailOrigin + totalChatOrigin;
171+
const chatPercentage =
172+
totalMessages === 0 ? 0 : Math.round((totalChatOrigin / totalMessages) * 100);
173+
const emailPercentage =
174+
totalMessages === 0 ? 0 : Math.round((totalEmailOrigin / totalMessages) * 100);
175+
176+
return `Crisp message origin report: ${totalChatOrigin} (${chatPercentage}%) chat origin, ${totalEmailOrigin} (${emailPercentage}%) email origin`;
177+
}
142178
}

src/event-logger/event-logger.service.ts

+8-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { InjectRepository } from '@nestjs/typeorm';
33
import { EventLogEntity } from 'src/entities/event-log.entity';
44
import { UserEntity } from 'src/entities/user.entity';
55
import { Repository } from 'typeorm';
6-
import { ICreateEventLog } from './event-logger.interface';
6+
import { EVENT_NAME, ICreateEventLog } from './event-logger.interface';
77

88
const logger = new Logger('EventLogger');
99

@@ -20,6 +20,13 @@ export class EventLoggerService {
2020
return await this.eventLoggerRepository.findOneBy({ id });
2121
}
2222

23+
async getMessageSentEventLogs(): Promise<EventLogEntity[]> {
24+
return await this.eventLoggerRepository.find({
25+
where: { event: EVENT_NAME.CHAT_MESSAGE_SENT },
26+
relations: { user: true },
27+
});
28+
}
29+
2330
async createEventLog({ email, userId, event, date }: ICreateEventLog) {
2431
try {
2532
if (!userId && !email) {

0 commit comments

Comments
 (0)