From 4c19b681565aa18f15908ac4a8f8dbce6228674d Mon Sep 17 00:00:00 2001 From: matthieu Date: Sun, 15 Mar 2026 18:58:55 +0100 Subject: [PATCH] fix(gitea) : propagate API errors instead of silently returning empty results Co-Authored-By: Claude Opus 4.6 (1M context) --- frontend/components/task/TaskGitSection.vue | 10 +++++----- src/Service/GiteaApiService.php | 21 +++++++++++++++++++++ src/State/GiteaBranchProvider.php | 6 ++++-- src/State/GiteaPullRequestProvider.php | 5 +++-- src/State/GiteaRepositoryProvider.php | 5 +++-- 5 files changed, 36 insertions(+), 11 deletions(-) diff --git a/frontend/components/task/TaskGitSection.vue b/frontend/components/task/TaskGitSection.vue index 2f70830..5a5f5aa 100644 --- a/frontend/components/task/TaskGitSection.vue +++ b/frontend/components/task/TaskGitSection.vue @@ -61,7 +61,7 @@
-

{{ $t('gitea.error') }}

+

{{ error }}

@@ -248,7 +248,7 @@ const pullRequests = ref([]) const isLoading = ref(true) const isLoadingPrs = ref(true) const isCreating = ref(false) -const error = ref(false) +const error = ref('') const showCreateForm = ref(false) const expandedBranches = ref(new Set()) @@ -338,7 +338,7 @@ async function loadData() { isLoading.value = true isLoadingPrs.value = true - error.value = false + error.value = '' try { branches.value = await listBranches(props.task.id) @@ -346,8 +346,8 @@ async function loadData() { if (branches.value.length === 1) { expandedBranches.value.add(branches.value[0].name) } - } catch { - error.value = true + } catch (e: any) { + error.value = e?.data?.detail || e?.data?.['hydra:description'] || t('gitea.error') } finally { isLoading.value = false } diff --git a/src/Service/GiteaApiService.php b/src/Service/GiteaApiService.php index d8bfb0f..46881eb 100644 --- a/src/Service/GiteaApiService.php +++ b/src/Service/GiteaApiService.php @@ -12,6 +12,7 @@ use App\Repository\GiteaConfigurationRepository; use Symfony\Component\String\Slugger\AsciiSlugger; use Symfony\Component\String\Slugger\SluggerInterface; use Symfony\Contracts\HttpClient\Exception\ExceptionInterface; +use Symfony\Contracts\HttpClient\Exception\HttpExceptionInterface; use Symfony\Contracts\HttpClient\HttpClientInterface; use Throwable; @@ -215,6 +216,22 @@ final readonly class GiteaApiService } } + private function extractGiteaError(HttpExceptionInterface $e): string + { + try { + $body = $e->getResponse()->getContent(false); + $data = json_decode($body, true); + + if (is_array($data)) { + return $data['message'] ?? $data['error'] ?? $body; + } + + return $body ?: 'Unknown Gitea error'; + } catch (ExceptionInterface) { + return 'Gitea API error (HTTP '.$e->getResponse()->getStatusCode().')'; + } + } + private function assertProjectHasRepo(Project $project): void { if (!$project->hasGiteaRepo()) { @@ -240,6 +257,10 @@ final readonly class GiteaApiService $response = $this->httpClient->request($method, rtrim($config->getUrl(), '/').$path, $options); return $response->toArray(); + } catch (HttpExceptionInterface $e) { + $message = $this->extractGiteaError($e); + + throw new GiteaApiException($message, $e->getResponse()->getStatusCode(), $e); } catch (ExceptionInterface $e) { throw new GiteaApiException('Gitea API error: '.$e->getMessage(), 0, $e); } diff --git a/src/State/GiteaBranchProvider.php b/src/State/GiteaBranchProvider.php index 5081dd0..8152110 100644 --- a/src/State/GiteaBranchProvider.php +++ b/src/State/GiteaBranchProvider.php @@ -12,6 +12,7 @@ use App\Entity\Task; use App\Exception\GiteaApiException; use App\Service\GiteaApiService; use Doctrine\ORM\EntityManagerInterface; +use Symfony\Component\HttpKernel\Exception\BadRequestHttpException; final readonly class GiteaBranchProvider implements ProviderInterface { @@ -40,8 +41,8 @@ final readonly class GiteaBranchProvider implements ProviderInterface try { $branches = $this->giteaApiService->listBranches($project, $taskCode); - } catch (GiteaApiException) { - return []; + } catch (GiteaApiException $e) { + throw new BadRequestHttpException($e->getMessage(), $e); } $result = []; @@ -58,6 +59,7 @@ final readonly class GiteaBranchProvider implements ProviderInterface 'date' => $c['commit']['author']['date'] ?? $c['created'] ?? '', ], $commits); } catch (GiteaApiException) { + // Commits fetch failure should not block branch listing $dto->commits = []; } diff --git a/src/State/GiteaPullRequestProvider.php b/src/State/GiteaPullRequestProvider.php index 675a504..69f2128 100644 --- a/src/State/GiteaPullRequestProvider.php +++ b/src/State/GiteaPullRequestProvider.php @@ -11,6 +11,7 @@ use App\Entity\Task; use App\Exception\GiteaApiException; use App\Service\GiteaApiService; use Doctrine\ORM\EntityManagerInterface; +use Symfony\Component\HttpKernel\Exception\BadRequestHttpException; final readonly class GiteaPullRequestProvider implements ProviderInterface { @@ -35,8 +36,8 @@ final readonly class GiteaPullRequestProvider implements ProviderInterface try { $prs = $this->giteaApiService->listPullRequests($project, $taskCode); - } catch (GiteaApiException) { - return []; + } catch (GiteaApiException $e) { + throw new BadRequestHttpException($e->getMessage(), $e); } return array_map(static function (array $pr): GiteaPullRequest { diff --git a/src/State/GiteaRepositoryProvider.php b/src/State/GiteaRepositoryProvider.php index 7808ddd..e483897 100644 --- a/src/State/GiteaRepositoryProvider.php +++ b/src/State/GiteaRepositoryProvider.php @@ -9,6 +9,7 @@ use ApiPlatform\State\ProviderInterface; use App\ApiResource\GiteaRepository; use App\Exception\GiteaApiException; use App\Service\GiteaApiService; +use Symfony\Component\HttpKernel\Exception\BadRequestHttpException; final readonly class GiteaRepositoryProvider implements ProviderInterface { @@ -20,8 +21,8 @@ final readonly class GiteaRepositoryProvider implements ProviderInterface { try { $repos = $this->giteaApiService->listRepositories(); - } catch (GiteaApiException) { - return []; + } catch (GiteaApiException $e) { + throw new BadRequestHttpException($e->getMessage(), $e); } return array_map(static function (array $repo): GiteaRepository {