Skip to content

Commit e426263

Browse files
jobenjadaDhruwang
andauthored
fix: caching (#113)
* remove caching from getAllOssGgIssuesOfRepos * add cache with 60s duration --------- Co-authored-by: Dhruwang <dhruwangjariwala18@gmail.com>
1 parent 9ad24bb commit e426263

File tree

1 file changed

+103
-109
lines changed

1 file changed

+103
-109
lines changed

lib/github/service.ts

Lines changed: 103 additions & 109 deletions
Original file line numberDiff line numberDiff line change
@@ -5,133 +5,127 @@ import { TPullRequest, ZPullRequest } from "@/types/pullRequest";
55
import { Octokit } from "@octokit/rest";
66
import { unstable_cache } from "next/cache";
77

8-
import { GITHUB_APP_ACCESS_TOKEN, GITHUB_CACHE_REVALIDATION_INTERVAL, OSS_GG_LABEL } from "../constants";
9-
import { githubCache } from "./cache";
8+
import { GITHUB_APP_ACCESS_TOKEN, OSS_GG_LABEL } from "../constants";
109
import { extractPointsFromLabels } from "./utils";
1110

1211
type PullRequestStatus = "open" | "merged" | "closed" | undefined;
1312

1413
const octokit = new Octokit({ auth: GITHUB_APP_ACCESS_TOKEN });
1514

16-
export const getPullRequestsByGithubLogin = (
15+
const fetchPullRequestsByGithubLogin = async (
1716
playerRepositoryIds: string[],
1817
githubLogin: string,
1918
status?: PullRequestStatus
20-
) =>
21-
unstable_cache(
22-
async (): Promise<TPullRequest[]> => {
23-
if (!playerRepositoryIds || playerRepositoryIds.length === 0) {
24-
console.warn("No repository IDs provided. Returning empty array.");
25-
return [];
19+
): Promise<TPullRequest[]> => {
20+
if (!playerRepositoryIds || playerRepositoryIds.length === 0) {
21+
console.warn("No repository IDs provided. Returning empty array.");
22+
return [];
23+
}
24+
25+
const pullRequests: TPullRequest[] = [];
26+
27+
let statusQuery = "is:pr";
28+
if (status === "open") statusQuery += " is:open";
29+
else if (status === "merged") statusQuery += " is:merged";
30+
else if (status === "closed") statusQuery += " is:closed -is:merged";
31+
32+
const repoQuery = playerRepositoryIds.map((id) => `repo:${id}`).join(" ");
33+
const query = `${repoQuery} ${statusQuery} author:${githubLogin}`;
34+
35+
try {
36+
const { data } = await octokit.search.issuesAndPullRequests({
37+
q: query,
38+
per_page: 99,
39+
sort: "created",
40+
order: "desc",
41+
});
42+
43+
for (const pr of data.items) {
44+
let prStatus: "open" | "merged" | "closed";
45+
if (pr.state === "open") {
46+
prStatus = "open";
47+
} else if (pr.pull_request?.merged_at) {
48+
prStatus = "merged";
49+
} else {
50+
prStatus = "closed";
2651
}
2752

28-
const pullRequests: TPullRequest[] = [];
29-
30-
let statusQuery = "is:pr";
31-
if (status === "open") statusQuery += " is:open";
32-
else if (status === "merged") statusQuery += " is:merged";
33-
else if (status === "closed") statusQuery += " is:closed -is:merged";
34-
35-
const repoQuery = playerRepositoryIds.map((id) => `repo:${id}`).join(" ");
36-
const query = `${repoQuery} ${statusQuery} author:${githubLogin}`;
53+
const prLabels = pr.labels.filter((label) => label.name !== undefined) as { name: string }[];
3754

3855
try {
39-
const { data } = await octokit.search.issuesAndPullRequests({
40-
q: query,
41-
per_page: 99,
42-
sort: "created",
43-
order: "desc",
56+
const pullRequest: TPullRequest = ZPullRequest.parse({
57+
title: pr.title,
58+
href: pr.html_url,
59+
author: pr.user?.login || "",
60+
repositoryFullName: pr.repository_url.split("/").slice(-2).join("/"),
61+
dateOpened: pr.created_at,
62+
dateMerged: pr.pull_request?.merged_at || null,
63+
dateClosed: pr.closed_at,
64+
status: prStatus,
65+
points: prLabels ? extractPointsFromLabels(prLabels) : null,
4466
});
4567

46-
for (const pr of data.items) {
47-
let prStatus: "open" | "merged" | "closed";
48-
if (pr.state === "open") {
49-
prStatus = "open";
50-
} else if (pr.pull_request?.merged_at) {
51-
prStatus = "merged";
52-
} else {
53-
prStatus = "closed";
54-
}
55-
56-
const prLabels = pr.labels.filter((label) => label.name !== undefined) as { name: string }[];
57-
58-
try {
59-
const pullRequest: TPullRequest = ZPullRequest.parse({
60-
title: pr.title,
61-
href: pr.html_url,
62-
author: pr.user?.login || "",
63-
repositoryFullName: pr.repository_url.split("/").slice(-2).join("/"),
64-
dateOpened: pr.created_at,
65-
dateMerged: pr.pull_request?.merged_at || null,
66-
dateClosed: pr.closed_at,
67-
status: prStatus,
68-
points: prLabels ? extractPointsFromLabels(prLabels) : null,
69-
});
70-
71-
pullRequests.push(pullRequest);
72-
} catch (error) {
73-
console.error(`Error parsing pull request: ${pr.title}`, error);
74-
}
75-
}
68+
pullRequests.push(pullRequest);
7669
} catch (error) {
77-
console.error(`Error fetching or processing pull requests:`, error);
70+
console.error(`Error parsing pull request: ${pr.title}`, error);
7871
}
79-
80-
// Sort pullRequests by dateOpened in descending order
81-
pullRequests.sort((a, b) => new Date(b.dateOpened).getTime() - new Date(a.dateOpened).getTime());
82-
83-
return pullRequests;
84-
},
85-
[`getPullRequests-${githubLogin}-${status}-${playerRepositoryIds.join(",")}`],
86-
{
87-
tags: [githubCache.tag.byGithubLogin(githubLogin)],
88-
revalidate: GITHUB_CACHE_REVALIDATION_INTERVAL,
8972
}
90-
)();
91-
92-
export const getAllOssGgIssuesOfRepos = (repoGithubIds: number[]) =>
93-
unstable_cache(
94-
async (): Promise<TPullRequest[]> => {
95-
const githubHeaders = {
96-
Authorization: `Bearer ${GITHUB_APP_ACCESS_TOKEN}`,
97-
Accept: "application/vnd.github.v3+json",
98-
};
99-
100-
const allIssues = await Promise.all(
101-
repoGithubIds.map(async (repoGithubId) => {
102-
const repoResponse = await fetch(`https://api.github.com/repositories/${repoGithubId}`, {
103-
headers: githubHeaders,
104-
});
105-
const repoData = await repoResponse.json();
106-
107-
const issuesResponse = await fetch(
108-
`https://api.github.com/search/issues?q=repo:${repoData.full_name}+is:issue+is:open+label:"${OSS_GG_LABEL}"&sort=created&order=desc`,
109-
{ headers: githubHeaders }
110-
);
111-
const issuesData = await issuesResponse.json();
112-
const validatedData = ZGithubApiResponseSchema.parse(issuesData);
113-
114-
// Map the GitHub API response to TPullRequest format
115-
return validatedData.items.map((issue) =>
116-
ZPullRequest.parse({
117-
title: issue.title,
118-
href: issue.html_url,
119-
author: issue.user.login,
120-
repositoryFullName: repoData.full_name,
121-
dateOpened: issue.created_at,
122-
dateMerged: null,
123-
dateClosed: issue.closed_at,
124-
status: "open",
125-
points: extractPointsFromLabels(issue.labels),
126-
})
127-
);
73+
} catch (error) {
74+
console.error(`Error fetching or processing pull requests:`, error);
75+
}
76+
77+
pullRequests.sort((a, b) => new Date(b.dateOpened).getTime() - new Date(a.dateOpened).getTime());
78+
79+
return pullRequests;
80+
};
81+
82+
export const getPullRequestsByGithubLogin = unstable_cache(
83+
fetchPullRequestsByGithubLogin,
84+
["fetchPullRequestsByGithubLogin"],
85+
{ revalidate: 60 }
86+
);
87+
88+
const fetchAllOssGgIssuesOfRepos = async (repoGithubIds: number[]): Promise<TPullRequest[]> => {
89+
const githubHeaders = {
90+
Authorization: `Bearer ${GITHUB_APP_ACCESS_TOKEN}`,
91+
Accept: "application/vnd.github.v3+json",
92+
};
93+
94+
const allIssues = await Promise.all(
95+
repoGithubIds.map(async (repoGithubId) => {
96+
const repoResponse = await fetch(`https://api.github.com/repositories/${repoGithubId}`, {
97+
headers: githubHeaders,
98+
});
99+
const repoData = await repoResponse.json();
100+
101+
const issuesResponse = await fetch(
102+
`https://api.github.com/search/issues?q=repo:${repoData.full_name}+is:issue+is:open+label:"${OSS_GG_LABEL}"&sort=created&order=desc`,
103+
{ headers: githubHeaders }
104+
);
105+
const issuesData = await issuesResponse.json();
106+
const validatedData = ZGithubApiResponseSchema.parse(issuesData);
107+
108+
return validatedData.items.map((issue) =>
109+
ZPullRequest.parse({
110+
title: issue.title,
111+
href: issue.html_url,
112+
author: issue.user.login,
113+
repositoryFullName: repoData.full_name,
114+
dateOpened: issue.created_at,
115+
dateMerged: null,
116+
dateClosed: issue.closed_at,
117+
status: "open",
118+
points: extractPointsFromLabels(issue.labels),
128119
})
129120
);
121+
})
122+
);
130123

131-
return allIssues.flat();
132-
},
133-
[`getAllOssGgIssuesOfRepos-${repoGithubIds.join("-")}`],
134-
{
135-
revalidate: GITHUB_CACHE_REVALIDATION_INTERVAL,
136-
}
137-
)();
124+
return allIssues.flat();
125+
};
126+
127+
export const getAllOssGgIssuesOfRepos = unstable_cache(
128+
fetchAllOssGgIssuesOfRepos,
129+
["fetchAllOssGgIssuesOfRepos"],
130+
{ revalidate: 60 }
131+
);

0 commit comments

Comments
 (0)