projectRepositoryConnection($project, $repositoryConnectionId); $userGitConnection = $this->matchingUserGitConnection($user->id, $repositoryConnection); if ($userGitConnection === null) { throw ValidationException::withMessages([ 'repository_connection_id' => 'Connect a matching Git connection in your user settings first.', ]); } $syntaxMessage = $this->validateGitBranchName->message($branchName); if ($syntaxMessage !== null) { throw ValidationException::withMessages([ 'branch_name' => $syntaxMessage, ]); } $validation = $this->validateProjectTicketBranch->handle($project, $ticket, $user, $validated); if (! $validation['is_valid']) { throw ValidationException::withMessages([ 'branch_name' => $validation['message'], ]); } $gitProvider = $this->gitProviderManager->client($userGitConnection->provider); try { $repository = $gitProvider->getRepository( $userGitConnection->base_url, $userGitConnection->api_token, $repositoryConnection->owner_name, $repositoryConnection->repository_name, ); $gitProvider->createBranch( $userGitConnection->base_url, $userGitConnection->api_token, $repositoryConnection->owner_name, $repositoryConnection->repository_name, $branchName, $repository->defaultBranch, ); } catch (Throwable) { throw ValidationException::withMessages([ 'branch_name' => sprintf('%s could not create this branch right now.', config('app.name')), ]); } return [ 'branch_name' => $branchName, 'repository_full_name' => $repositoryConnection->repository_full_name, ]; } private function projectRepositoryConnection(Project $project, int $repositoryConnectionId): RepositoryConnection { return $project->repositoryConnections() ->findOrFail($repositoryConnectionId); } private function matchingUserGitConnection( int $userId, RepositoryConnection $repositoryConnection, ): ?UserGitConnection { return UserGitConnection::query() ->where('user_id', $userId) ->where('provider', $repositoryConnection->provider) ->where('base_url', $repositoryConnection->base_url) ->first(); } }