Files
KanbanGit/app/Actions/Repositories/ResolveRepositorySelectionAttributes.php
T
Twyco 8b25421e7c
linter / quality (pull_request) Successful in 1m18s
tests / ci (8.4) (pull_request) Successful in 1m28s
Add application API and OpenAPI docs
2026-04-20 13:22:56 +02:00

71 lines
2.4 KiB
PHP

<?php
namespace App\Actions\Repositories;
use App\Actions\Git\Data\GitRepository;
use App\Actions\Git\GitProviderManager;
use App\Models\User;
use App\Models\UserGitConnection;
use Illuminate\Validation\ValidationException;
class ResolveRepositorySelectionAttributes
{
public function __construct(
private readonly GitProviderManager $gitProviderManager,
) {}
/**
* @return array{
* base_url: string,
* owner_name: string,
* provider: mixed,
* provider_repository_id: string,
* repository_full_name: string,
* repository_name: string,
* repository_url: string
* }
*/
public function handle(User $user, int $userGitConnectionId, string $providerRepositoryId): array
{
$userGitConnection = $this->ownedUserGitConnection($user, $userGitConnectionId);
$repository = $this->repositoryFromConnection($userGitConnection, $providerRepositoryId);
if ($repository === null) {
throw ValidationException::withMessages([
'provider_repository_id' => 'The selected repository is not available through this Git connection.',
]);
}
return [
'base_url' => $userGitConnection->base_url,
'owner_name' => $repository->owner,
'provider' => $userGitConnection->provider,
'provider_repository_id' => $repository->providerRepositoryId,
'repository_full_name' => $repository->fullName,
'repository_name' => $repository->name,
'repository_url' => $repository->htmlUrl,
];
}
private function ownedUserGitConnection(User $user, int $userGitConnectionId): UserGitConnection
{
$userGitConnection = UserGitConnection::query()->findOrFail($userGitConnectionId);
abort_unless($userGitConnection->user_id === $user->id, 403);
return $userGitConnection;
}
private function repositoryFromConnection(
UserGitConnection $userGitConnection,
string $providerRepositoryId,
): ?GitRepository {
return collect(
$this->gitProviderManager
->client($userGitConnection->provider)
->listRepositories($userGitConnection->base_url, $userGitConnection->api_token),
)
->first(fn (GitRepository $repository): bool => $repository->providerRepositoryId === $providerRepositoryId);
}
}