github-leaderboard/server/jobs/fetch-repo-contributors.ts

47 lines
1.1 KiB
TypeScript

import db from "@server/db";
import github from "@server/lib/github";
import queue from "@server/lib/queue";
import { repositories, users } from "@server/models";
import { eq } from "drizzle-orm";
export type FetchRepoContributorsType = {
id: number;
uri: string;
};
export const fetchRepoContributors = async (
data: FetchRepoContributorsType
) => {
const [repo] = await db
.select({ id: repositories.id, userAccessToken: users.accessToken })
.from(repositories)
.innerJoin(users, eq(users.id, repositories.userId))
.where(eq(repositories.id, data.id));
if (!repo) {
throw new Error("Repository not found!");
}
if (!repo.userAccessToken) {
throw new Error("User access token not found!");
}
const contributors = await github.getRepoContributors(data.uri, {
headers: {
Authorization: `Bearer ${repo.userAccessToken}`,
},
});
const [result] = await db
.update(repositories)
.set({ contributors })
.where(eq(repositories.id, data.id))
.returning();
if (!result) {
throw new Error("Cannot update repository!");
}
await queue.add("calculateUserPoints", { userId: result.userId });
};