Skip to content

Commit

Permalink
Makes calendly api calls concurrent (#107)
Browse files Browse the repository at this point in the history
  • Loading branch information
YOSSHUA authored Nov 8, 2024
1 parent 72487bd commit 0c254be
Show file tree
Hide file tree
Showing 3 changed files with 57 additions and 18 deletions.
1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@
"next": "^13.5.6",
"next-auth": "^4.24.5",
"nodemailer": "^6.9.7",
"p-limit": "^6.1.0",
"postcss": "^8.4.32",
"react": "18.2.0",
"react-calendar": "^5.0.0",
Expand Down
59 changes: 41 additions & 18 deletions src/lib/volunteer/mentor.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,32 @@ import { prisma } from "@/lib/prisma";
import { getAvailabilities } from "@/lib/calendly";
import { getAccessToken } from "@/lib/oauth";
import { UserAvailability } from "@/types/mentor.schema";
import pLimit from "p-limit";
import { ParticipationWithUserOauth } from "@/types/participation.schema";

async function getAvailiabity(
participation: ParticipationWithUserOauth,
startTime: Date,
endTime: Date,
): Promise<UserAvailability | null> {
const userOauth = participation.user.UserAuth.UserOauth[0];
const userAuthId = participation.user.UserAuth.id;
const availabilities = await getAvailabilities({
token: await getAccessToken(userAuthId, userOauth.provider, userOauth),
startTime,
endTime,
});

if (!availabilities) return null;

return {
volunteerAuthId: userAuthId,
volunteerParticipationId: participation.volunteerParticipationId!,
firstName: participation.user.firstName,
lastName: participation.user.lastName,
...availabilities,
};
}

export async function getAllAvailabilities({
ofmiEdition,
Expand Down Expand Up @@ -33,26 +59,23 @@ export async function getAllAvailabilities({
},
});

// Limit concurrent active promises to 5
const limit = pLimit(5);
const mentors: Array<UserAvailability> = [];
for (const participation of mentorsDb) {
const userOauth = participation.user.UserAuth.UserOauth[0];
const userAuthId = participation.user.UserAuth.id;
const availabilities = await getAvailabilities({
token: await getAccessToken(userAuthId, userOauth.provider, userOauth),
startTime,
endTime,
});
if (!availabilities) {
continue;

const result = await Promise.allSettled(
mentorsDb.map((participation) =>
limit(() => getAvailiabity(participation, startTime, endTime)),
),
);

result.map((res) => {
if (res.status === "fulfilled") {
if (res.value !== null) {
mentors.push(res.value);
}
}
mentors.push({
volunteerAuthId: userAuthId,
volunteerParticipationId: participation.volunteerParticipationId!,
firstName: participation.user.firstName,
lastName: participation.user.lastName,
...availabilities,
});
}
});

return mentors;
}
15 changes: 15 additions & 0 deletions src/types/participation.schema.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import { Type, Static } from "@sinclair/typebox";
import {
Participation,
ParticipationRole,
Prisma,
SchoolStage,
ShirtSize,
} from "@prisma/client";
Expand Down Expand Up @@ -128,6 +129,20 @@ export const UpsertParticipationRequestSchema = Type.Omit(
["registeredAt"],
);

export type ParticipationWithUserOauth = Prisma.ParticipationGetPayload<{
include: {
user: {
include: {
UserAuth: {
include: {
UserOauth: true;
};
};
};
};
};
}>;

export interface UpsertParticipationResponse {
participation: Participation;
}

0 comments on commit 0c254be

Please sign in to comment.