diff --git a/src/modules/project-center/gitea.service.ts b/src/modules/project-center/gitea.service.ts index 8e67ce2..290ebbb 100644 --- a/src/modules/project-center/gitea.service.ts +++ b/src/modules/project-center/gitea.service.ts @@ -20,18 +20,30 @@ export class GiteaService { } } + private extractData(response: any): T | null { + if (!response) return null; + // Gitea API wraps responses in {ok: true, data: ...} + if (response.ok && Array.isArray(response.data)) return response.data as T; + // Direct array response (standard REST API) + if (Array.isArray(response)) return response as T; + return null; + } + async getRepos() { - // Try search with wildcard first, fall back to user repos - let repos = await this.giteaGet('/repos/search?q=&limit=50'); + let repos: any[] | null = null; + + const searchResult = await this.giteaGet('/repos/search?q=&limit=50'); + repos = this.extractData(searchResult); + if (!repos || repos.length === 0) { - repos = await this.giteaGet('/user/repos?limit=50'); + const userResult = await this.giteaGet('/user/repos?limit=50'); + repos = this.extractData(userResult); } if (!repos) return []; const enriched: any[] = []; for (const r of repos) { const fullName = r.full_name; - // Just use open_issues_count from the search result; skip extra API calls enriched.push({ id: r.id, name: r.name, fullName, description: r.description, owner: r.owner?.login, stars: r.stars_count ?? 0, forks: r.forks_count ?? 0, @@ -43,20 +55,24 @@ export class GiteaService { } async getMilestones(owner: string, repo: string) { - return this.giteaGet(`/repos/${owner}/${repo}/milestones?state=all`) ?? []; + const result = await this.giteaGet(`/repos/${owner}/${repo}/milestones?state=all`); + return this.extractData(result) ?? []; } async getIssues(owner: string, repo: string, milestone?: string, state = 'open') { let path = `/repos/${owner}/${repo}/issues?state=${state}&limit=50`; if (milestone) path += `&milestone=${milestone}`; - return this.giteaGet(path) ?? []; + const result = await this.giteaGet(path); + return this.extractData(result) ?? []; } async getRunners() { - return this.giteaGet('/admin/runners') ?? []; + const result = await this.giteaGet('/admin/runners'); + return this.extractData(result) ?? []; } async getReleases(owner: string, repo: string) { - return this.giteaGet(`/repos/${owner}/${repo}/releases?limit=20`) ?? []; + const result = await this.giteaGet(`/repos/${owner}/${repo}/releases?limit=20`); + return this.extractData(result) ?? []; } }