Skip to content

Commit aa29c8c

Browse files
authored
Ninom5/delete events on interview slot cancel (#289)
* delete events on interview cancel * delete console log * remove un used import
1 parent 367edd7 commit aa29c8c

File tree

3 files changed

+70
-1
lines changed

3 files changed

+70
-1
lines changed

apps/api/src/intern/intern.module.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,16 @@ import { PrismaService } from 'src/prisma.service';
55

66
import { InternController } from './intern.controller';
77
import { InternService } from './intern.service';
8+
import { MicrosoftGraphService } from 'src/interview-slot/graph.service';
89

910
@Module({
1011
controllers: [InternController],
11-
providers: [InternService, LoggerService, EmailService, PrismaService],
12+
providers: [
13+
InternService,
14+
LoggerService,
15+
EmailService,
16+
MicrosoftGraphService,
17+
PrismaService,
18+
],
1219
})
1320
export class InternModule {}

apps/api/src/intern/intern.service.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import { PrismaService } from 'src/prisma.service';
2424

2525
import * as disposableEmailBlocklist from './disposable-email-blocklist.json';
2626
import { CreateInternDto } from './dto/createIntern.dto';
27+
import { MicrosoftGraphService } from 'src/interview-slot/graph.service';
2728

2829
type SendEmailPayload = {
2930
From: string;
@@ -38,6 +39,7 @@ export class InternService {
3839
constructor(
3940
private readonly prisma: PrismaService,
4041
private readonly emailService: EmailService,
42+
private readonly microsoftGraphService: MicrosoftGraphService,
4143
) {}
4244

4345
private readonly logger = new Logger(InternService.name);
@@ -558,6 +560,20 @@ export class InternService {
558560
},
559561
});
560562

563+
const interns = await this.prisma.intern.findMany({
564+
where: internFilter,
565+
select: { firstName: true, lastName: true },
566+
});
567+
568+
await Promise.allSettled(
569+
interns.map((intern) =>
570+
this.microsoftGraphService.deleteEvent({
571+
firstName: intern.firstName,
572+
lastName: intern.lastName,
573+
}),
574+
),
575+
);
576+
561577
return await this.prisma.intern.updateMany({
562578
where: internFilter,
563579
data: {

apps/api/src/interview-slot/graph.service.ts

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,27 @@ export class MicrosoftGraphService {
3434
}
3535
}
3636

37+
async getAllEvents() {
38+
try {
39+
const token = await this.getAppAccessToken();
40+
const res = await axios.get(
41+
`${GRAPH_USERS_PATH}/event-scheduler@dump.hr/events`,
42+
{
43+
headers: { Authorization: `Bearer ${token}` },
44+
},
45+
);
46+
47+
return res.data.value;
48+
} catch (err: any) {
49+
console.error(
50+
'Failed to get outlook events:',
51+
err.response?.data || err.message,
52+
);
53+
54+
throw err;
55+
}
56+
}
57+
3758
async createEvent(eventData: any) {
3859
try {
3960
const token = await this.getAppAccessToken();
@@ -66,4 +87,29 @@ export class MicrosoftGraphService {
6687
throw err;
6788
}
6889
}
90+
91+
async deleteEvent(intern: { firstName: string; lastName: string }) {
92+
try {
93+
const token = await this.getAppAccessToken();
94+
const events = await this.getAllEvents();
95+
96+
const eventId = events.find(
97+
(event) =>
98+
event.subject === `Intervju s ${intern.firstName} ${intern.lastName}`,
99+
).id;
100+
101+
await axios.delete(
102+
`${GRAPH_USERS_PATH}/event-scheduler@dump.hr/events/${eventId}`,
103+
{
104+
headers: { Authorization: `Bearer ${token}` },
105+
},
106+
);
107+
} catch (err: any) {
108+
console.error(
109+
'Failed to delete outlook event:',
110+
err.response?.data || err.message,
111+
);
112+
throw err;
113+
}
114+
}
69115
}

0 commit comments

Comments
 (0)