Skip to content

Commit 95e7f4d

Browse files
committed
fix: implement retry get repos if fail
1 parent b37e66f commit 95e7f4d

File tree

3 files changed

+57
-32
lines changed

3 files changed

+57
-32
lines changed

.changeset/bumpy-memes-run.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"commitflow": patch
3+
---
4+
5+
implement retry get repos if fail

backend/src/ai-agent/github.service.ts

Lines changed: 50 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -54,42 +54,62 @@ export async function getContributors(repo: string, retries = 3) {
5454
}
5555
}
5656

57+
// =================== FETCH REPOS WITH RETRY ===================
58+
export async function getRepos(retries = 3) {
59+
const owner = process.env.GITHUB_OWNER;
60+
console.log("getRepos", owner);
5761

58-
// =================== FETCH REPOS ===================
59-
export async function getRepos() {
60-
try {
61-
const owner = process.env.GITHUB_OWNER;
62-
console.log("getRepos", owner);
62+
const allRepos: any[] = [];
63+
let page = 1;
64+
const perPage = 100;
6365

66+
while (true) {
67+
const url = `https://api.github.com/orgs/${owner}/repos?per_page=${perPage}&page=${page}`;
6468

65-
// Fetch semua repos dengan pagination
66-
const allRepos: any[] = [];
67-
let page = 1;
68-
const perPage = 100; // maksimum 100 per page
69+
let success = false;
70+
for (let attempt = 1; attempt <= retries; attempt++) {
71+
try {
72+
const res = await axios.get(url, { headers });
73+
74+
if (Array.isArray(res.data) && res.data.length > 0) {
75+
allRepos.push(...res.data);
76+
success = true;
77+
break; // keluar dari retry loop
78+
} else if (res.data.length === 0) {
79+
success = true; // tidak ada repo lagi
80+
break;
81+
}
82+
} catch (err) {
83+
console.log(`Error fetching page ${page}, attempt ${attempt}/${retries}:`, err.message);
84+
if (attempt < retries) {
85+
await new Promise((r) => setTimeout(r, 3000)); // tunggu 3 detik sebelum retry
86+
}
87+
}
88+
}
6989

70-
while (true) {
71-
const url = `https://api.github.com/orgs/${owner}/repos?per_page=${perPage}&page=${page}`;
72-
const res = await axios.get(url, { headers });
90+
if (!success) {
91+
console.log(`Failed to fetch page ${page} after ${retries} retries. Stopping.`);
92+
break;
93+
}
7394

74-
if (res.data.length === 0) break; // tidak ada repo lagi
75-
allRepos.push(...res.data);
76-
page++;
95+
if (allRepos.length < page * perPage) {
96+
break; // tidak ada repos lagi
7797
}
7898

79-
const repos = allRepos.map((r: any) => ({
80-
owner: owner,
81-
name: r.name,
82-
fullName: r.full_name,
83-
description: r.description,
84-
stars: r.stargazers_count,
85-
forks: r.forks_count,
86-
updatedAt: r.updated_at,
87-
}));
88-
89-
console.log(`Fetched ${repos.length} repos from GitHub`);
90-
return repos;
91-
} catch (error) {
92-
logger.error("error fetching repo", error)
93-
return [];
99+
page++;
94100
}
101+
102+
const repos = allRepos.map((r: any) => ({
103+
owner: owner,
104+
name: r.name,
105+
fullName: r.full_name,
106+
description: r.description,
107+
stars: r.stargazers_count,
108+
forks: r.forks_count,
109+
updatedAt: r.updated_at,
110+
}));
111+
112+
console.log(`Fetched ${repos.length} repos from GitHub`);
113+
return repos;
95114
}
115+

package-lock.json

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)