Path: blob/main/components/dashboard/src/service/json-rpc-scm-client.ts
2500 views
/**1* Copyright (c) 2023 Gitpod GmbH. All rights reserved.2* Licensed under the GNU Affero General Public License (AGPL).3* See License.AGPL.txt in the project root for license information.4*/56import { PartialMessage } from "@bufbuild/protobuf";7import { PromiseClient } from "@connectrpc/connect";8import { SCMService } from "@gitpod/public-api/lib/gitpod/v1/scm_connect";9import { converter } from "./public-api";10import { getGitpodService } from "./service";11import { ApplicationError, ErrorCodes } from "@gitpod/gitpod-protocol/lib/messaging/error";12import {13SearchSCMTokensRequest,14SearchSCMTokensResponse,15GuessTokenScopesRequest,16SearchRepositoriesRequest,17ListSuggestedRepositoriesRequest,18ListSuggestedRepositoriesResponse,19SearchRepositoriesResponse,20GuessTokenScopesResponse,21} from "@gitpod/public-api/lib/gitpod/v1/scm_pb";2223export class JsonRpcScmClient implements PromiseClient<typeof SCMService> {24async searchSCMTokens({ host }: PartialMessage<SearchSCMTokensRequest>): Promise<SearchSCMTokensResponse> {25if (!host) {26throw new ApplicationError(ErrorCodes.BAD_REQUEST, "host is required");27}28const response = new SearchSCMTokensResponse();29const token = await getGitpodService().server.getToken({ host });30if (token) {31response.tokens.push(converter.toSCMToken(token));32}33return response;34}3536async guessTokenScopes({37gitCommand,38host,39repoUrl,40}: PartialMessage<GuessTokenScopesRequest>): Promise<GuessTokenScopesResponse> {41if (!host) {42throw new ApplicationError(ErrorCodes.BAD_REQUEST, "host is required");43}44const response = await getGitpodService().server.guessGitTokenScopes({45gitCommand: gitCommand || "",46host,47repoUrl: repoUrl || "",48});49return new GuessTokenScopesResponse({50message: response.message,51scopes: response.scopes || [],52});53}5455async searchRepositories(request: PartialMessage<SearchRepositoriesRequest>): Promise<SearchRepositoriesResponse> {56const { limit, searchString } = request;57if (!searchString) {58throw new ApplicationError(ErrorCodes.BAD_REQUEST, "searchString is required");59}60const repos = await getGitpodService().server.searchRepositories({ searchString, limit });61return new SearchRepositoriesResponse({62repositories: repos.map((r) => converter.toSuggestedRepository(r)),63});64}6566async listSuggestedRepositories(67request: PartialMessage<ListSuggestedRepositoriesRequest>,68): Promise<ListSuggestedRepositoriesResponse> {69const { organizationId } = request;70if (!organizationId) {71throw new ApplicationError(ErrorCodes.BAD_REQUEST, "organizationId is required");72}73const repos = await getGitpodService().server.getSuggestedRepositories(organizationId);74return new SearchRepositoriesResponse({75repositories: repos.map((r) => converter.toSuggestedRepository(r)),76});77}78}798081