diff --git a/src/ApiResource/GiteaPullRequest.php b/src/ApiResource/GiteaPullRequest.php new file mode 100644 index 0000000..b8a607d --- /dev/null +++ b/src/ApiResource/GiteaPullRequest.php @@ -0,0 +1,49 @@ + ['gitea_pr:read']], + provider: GiteaPullRequestProvider::class, + ), + ], +)] +final class GiteaPullRequest +{ + #[Groups(['gitea_pr:read'])] + public int $number = 0; + + #[Groups(['gitea_pr:read'])] + public string $title = ''; + + #[Groups(['gitea_pr:read'])] + public string $state = ''; + + #[Groups(['gitea_pr:read'])] + public bool $merged = false; + + #[Groups(['gitea_pr:read'])] + public string $headBranch = ''; + + #[Groups(['gitea_pr:read'])] + public string $author = ''; + + #[Groups(['gitea_pr:read'])] + public string $url = ''; + + /** + * @var array + */ + #[Groups(['gitea_pr:read'])] + public array $ciStatuses = []; +} diff --git a/src/State/GiteaPullRequestProvider.php b/src/State/GiteaPullRequestProvider.php new file mode 100644 index 0000000..675a504 --- /dev/null +++ b/src/State/GiteaPullRequestProvider.php @@ -0,0 +1,60 @@ +em->getRepository(Task::class)->find($uriVariables['taskId'] ?? 0); + if (null === $task || null === $task->getProject()) { + return []; + } + + $project = $task->getProject(); + if (!$project->hasGiteaRepo()) { + return []; + } + + $taskCode = $project->getCode().'-'.$task->getNumber(); + + try { + $prs = $this->giteaApiService->listPullRequests($project, $taskCode); + } catch (GiteaApiException) { + return []; + } + + return array_map(static function (array $pr): GiteaPullRequest { + $dto = new GiteaPullRequest(); + $dto->number = $pr['number'] ?? 0; + $dto->title = $pr['title'] ?? ''; + $dto->state = $pr['state'] ?? ''; + $dto->merged = $pr['merged'] ?? false; + $dto->headBranch = $pr['head']['ref'] ?? ''; + $dto->author = $pr['user']['login'] ?? ''; + $dto->url = $pr['html_url'] ?? ''; + $dto->ciStatuses = array_map(static fn (array $s): array => [ + 'context' => $s['context'] ?? '', + 'status' => $s['status'] ?? '', + 'target_url' => $s['target_url'] ?? '', + ], $pr['ci_statuses'] ?? []); + + return $dto; + }, $prs); + } +}