Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 8 additions & 1 deletion apps/api/src/intern/intern.module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,16 @@ import { PrismaService } from 'src/prisma.service';

import { InternController } from './intern.controller';
import { InternService } from './intern.service';
import { MicrosoftGraphService } from 'src/interview-slot/graph.service';

@Module({
controllers: [InternController],
providers: [InternService, LoggerService, EmailService, PrismaService],
providers: [
InternService,
LoggerService,
EmailService,
MicrosoftGraphService,
PrismaService,
],
})
export class InternModule {}
16 changes: 16 additions & 0 deletions apps/api/src/intern/intern.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ import { PrismaService } from 'src/prisma.service';

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

type SendEmailPayload = {
From: string;
Expand All @@ -38,6 +39,7 @@ export class InternService {
constructor(
private readonly prisma: PrismaService,
private readonly emailService: EmailService,
private readonly microsoftGraphService: MicrosoftGraphService,
) {}

private readonly logger = new Logger(InternService.name);
Expand Down Expand Up @@ -558,6 +560,20 @@ export class InternService {
},
});

const interns = await this.prisma.intern.findMany({
where: internFilter,
select: { firstName: true, lastName: true },
});

await Promise.allSettled(
interns.map((intern) =>
this.microsoftGraphService.deleteEvent({
firstName: intern.firstName,
lastName: intern.lastName,
}),
),
);

return await this.prisma.intern.updateMany({
where: internFilter,
data: {
Expand Down
46 changes: 46 additions & 0 deletions apps/api/src/interview-slot/graph.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,27 @@ export class MicrosoftGraphService {
}
}

async getAllEvents() {
try {
const token = await this.getAppAccessToken();
const res = await axios.get(
`${GRAPH_USERS_PATH}/event-scheduler@dump.hr/events`,
{
headers: { Authorization: `Bearer ${token}` },
},
);

return res.data.value;
} catch (err: any) {
console.error(
'Failed to get outlook events:',
err.response?.data || err.message,
);

throw err;
}
}

async createEvent(eventData: any) {
try {
const token = await this.getAppAccessToken();
Expand Down Expand Up @@ -66,4 +87,29 @@ export class MicrosoftGraphService {
throw err;
}
}

async deleteEvent(intern: { firstName: string; lastName: string }) {
try {
const token = await this.getAppAccessToken();
const events = await this.getAllEvents();

const eventId = events.find(
(event) =>
event.subject === `Intervju s ${intern.firstName} ${intern.lastName}`,
).id;

await axios.delete(
`${GRAPH_USERS_PATH}/event-scheduler@dump.hr/events/${eventId}`,
{
headers: { Authorization: `Bearer ${token}` },
},
);
} catch (err: any) {
console.error(
'Failed to delete outlook event:',
err.response?.data || err.message,
);
throw err;
}
}
}
2 changes: 1 addition & 1 deletion apps/api/src/interview-slot/interview-slot.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -133,7 +133,7 @@ export class InterviewSlotService {
where: {
internId: null,
start: {
gte: new Date(new Date().getTime() + 4 * 60 * 60 * 1000),
gte: new Date(new Date().getTime() + 8 * 60 * 60 * 1000),
},
AND: [
{
Expand Down