mirror of
https://github.com/Dokploy/dokploy
synced 2025-06-26 18:27:59 +00:00
Refactor Gitea repository fetching to handle pagination
- Updated the `testGiteaConnection` and `getGiteaRepositories` functions to implement pagination when fetching repositories from the Gitea API, ensuring all repositories are retrieved. - Enhanced error handling for API responses and improved the structure of the returned repository data. - Removed deprecated code related to direct repository fetching, streamlining the overall logic.
This commit is contained in:
parent
7e365e1947
commit
44af0ec975
@ -362,27 +362,48 @@ export const testGiteaConnection = async (input: { giteaId: string }) => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const baseUrl = provider.giteaUrl.replace(/\/+$/, "");
|
const baseUrl = provider.giteaUrl.replace(/\/+$/, "");
|
||||||
const url = `${baseUrl}/api/v1/user/repos`;
|
const limit = 30;
|
||||||
|
let allRepos = 0;
|
||||||
|
let nextUrl = `${baseUrl}/api/v1/repos/search?limit=${limit}`;
|
||||||
|
|
||||||
const response = await fetch(url, {
|
while (nextUrl) {
|
||||||
headers: {
|
const response = await fetch(nextUrl, {
|
||||||
Accept: "application/json",
|
headers: {
|
||||||
Authorization: `token ${provider.accessToken}`,
|
Accept: "application/json",
|
||||||
},
|
Authorization: `token ${provider.accessToken}`,
|
||||||
});
|
},
|
||||||
|
});
|
||||||
|
|
||||||
if (!response.ok) {
|
if (!response.ok) {
|
||||||
throw new Error(
|
throw new Error(
|
||||||
`Failed to connect to Gitea API: ${response.status} ${response.statusText}`,
|
`Failed to connect to Gitea API: ${response.status} ${response.statusText}`,
|
||||||
);
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
const repos = await response.json();
|
||||||
|
allRepos += repos.data.length;
|
||||||
|
|
||||||
|
const linkHeader = response.headers.get("link");
|
||||||
|
nextUrl = "";
|
||||||
|
|
||||||
|
if (linkHeader) {
|
||||||
|
const nextLink = linkHeader
|
||||||
|
.split(",")
|
||||||
|
.find((link) => link.includes('rel="next"'));
|
||||||
|
if (nextLink) {
|
||||||
|
const matches = nextLink.match(/<([^>]+)>/);
|
||||||
|
if (matches?.[1]) {
|
||||||
|
nextUrl = matches[1];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const repos = await response.json();
|
|
||||||
await updateGitea(giteaId, {
|
await updateGitea(giteaId, {
|
||||||
lastAuthenticatedAt: Math.floor(Date.now() / 1000),
|
lastAuthenticatedAt: Math.floor(Date.now() / 1000),
|
||||||
});
|
});
|
||||||
|
|
||||||
return repos.length;
|
return allRepos;
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
throw error;
|
throw error;
|
||||||
}
|
}
|
||||||
@ -394,38 +415,57 @@ export const getGiteaRepositories = async (giteaId?: string) => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
await refreshGiteaToken(giteaId);
|
await refreshGiteaToken(giteaId);
|
||||||
|
|
||||||
const giteaProvider = await findGiteaById(giteaId);
|
const giteaProvider = await findGiteaById(giteaId);
|
||||||
|
|
||||||
const baseUrl = giteaProvider.giteaUrl.replace(/\/+$/, "");
|
const baseUrl = giteaProvider.giteaUrl.replace(/\/+$/, "");
|
||||||
const url = `${baseUrl}/api/v1/user/repos`;
|
const limit = 30;
|
||||||
|
let allRepositories: any[] = [];
|
||||||
|
let nextUrl = `${baseUrl}/api/v1/repos/search?limit=${limit}`;
|
||||||
|
|
||||||
const response = await fetch(url, {
|
while (nextUrl) {
|
||||||
headers: {
|
const response = await fetch(nextUrl, {
|
||||||
Accept: "application/json",
|
headers: {
|
||||||
Authorization: `token ${giteaProvider.accessToken}`,
|
Accept: "application/json",
|
||||||
},
|
Authorization: `token ${giteaProvider.accessToken}`,
|
||||||
});
|
},
|
||||||
|
|
||||||
if (!response.ok) {
|
|
||||||
throw new TRPCError({
|
|
||||||
code: "BAD_REQUEST",
|
|
||||||
message: `Failed to fetch repositories: ${response.statusText}`,
|
|
||||||
});
|
});
|
||||||
|
|
||||||
|
if (!response.ok) {
|
||||||
|
throw new TRPCError({
|
||||||
|
code: "BAD_REQUEST",
|
||||||
|
message: `Failed to fetch repositories: ${response.statusText}`,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
const result = await response.json();
|
||||||
|
allRepositories = [...allRepositories, ...result.data];
|
||||||
|
|
||||||
|
const linkHeader = response.headers.get("link");
|
||||||
|
nextUrl = "";
|
||||||
|
|
||||||
|
if (linkHeader) {
|
||||||
|
const nextLink = linkHeader
|
||||||
|
.split(",")
|
||||||
|
.find((link) => link.includes('rel="next"'));
|
||||||
|
if (nextLink) {
|
||||||
|
const matches = nextLink.match(/<([^>]+)>/);
|
||||||
|
if (matches?.[1]) {
|
||||||
|
nextUrl = matches[1];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const repositories = await response.json();
|
return (
|
||||||
|
allRepositories?.map((repo: any) => ({
|
||||||
const mappedRepositories = repositories.map((repo: any) => ({
|
id: repo.id,
|
||||||
id: repo.id,
|
name: repo.name,
|
||||||
name: repo.name,
|
url: repo.full_name,
|
||||||
url: repo.full_name,
|
owner: {
|
||||||
owner: {
|
username: repo.owner.login,
|
||||||
username: repo.owner.login,
|
},
|
||||||
},
|
})) || []
|
||||||
}));
|
);
|
||||||
|
|
||||||
return mappedRepositories;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
export const getGiteaBranches = async (input: {
|
export const getGiteaBranches = async (input: {
|
||||||
@ -457,7 +497,10 @@ export const getGiteaBranches = async (input: {
|
|||||||
|
|
||||||
const branches = await response.json();
|
const branches = await response.json();
|
||||||
|
|
||||||
return branches.map((branch: any) => ({
|
if (!branches) {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
return branches?.map((branch: any) => ({
|
||||||
id: branch.name,
|
id: branch.name,
|
||||||
name: branch.name,
|
name: branch.name,
|
||||||
commit: {
|
commit: {
|
||||||
|
Loading…
Reference in New Issue
Block a user