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