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-installation-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 { CallOptions, PromiseClient } from "@connectrpc/connect";
8
import { PartialMessage } from "@bufbuild/protobuf";
9
import { InstallationService } from "@gitpod/public-api/lib/gitpod/v1/installation_connect";
10
import {
11
ListBlockedRepositoriesRequest,
12
ListBlockedRepositoriesResponse,
13
CreateBlockedRepositoryRequest,
14
CreateBlockedRepositoryResponse,
15
DeleteBlockedRepositoryRequest,
16
DeleteBlockedRepositoryResponse,
17
ListBlockedEmailDomainsRequest,
18
ListBlockedEmailDomainsResponse,
19
CreateBlockedEmailDomainRequest,
20
CreateBlockedEmailDomainResponse,
21
GetInstallationWorkspaceDefaultImageRequest,
22
GetInstallationWorkspaceDefaultImageResponse,
23
GetOnboardingStateRequest,
24
GetOnboardingStateResponse,
25
GetInstallationConfigurationRequest,
26
GetInstallationConfigurationResponse,
27
} from "@gitpod/public-api/lib/gitpod/v1/installation_pb";
28
import { ApplicationError, ErrorCodes } from "@gitpod/gitpod-protocol/lib/messaging/error";
29
import { getGitpodService } from "./service";
30
import { converter } from "./public-api";
31
import { PaginationResponse } from "@gitpod/public-api/lib/gitpod/v1/pagination_pb";
32
33
export class JsonRpcInstallationClient implements PromiseClient<typeof InstallationService> {
34
async getInstallationWorkspaceDefaultImage(
35
_request: PartialMessage<GetInstallationWorkspaceDefaultImageRequest>,
36
_options?: CallOptions,
37
): Promise<GetInstallationWorkspaceDefaultImageResponse> {
38
const result = await getGitpodService().server.getDefaultWorkspaceImage({});
39
if (result.source !== "installation") {
40
throw new ApplicationError(ErrorCodes.INTERNAL_SERVER_ERROR, "unexpected image source");
41
}
42
return new GetInstallationWorkspaceDefaultImageResponse({ defaultWorkspaceImage: result.image });
43
}
44
45
async listBlockedRepositories(
46
request: PartialMessage<ListBlockedRepositoriesRequest>,
47
_options?: CallOptions | undefined,
48
): Promise<ListBlockedRepositoriesResponse> {
49
// dashboard params is constant, no need to implement
50
const info = await getGitpodService().server.adminGetBlockedRepositories({
51
limit: 100,
52
offset: 0,
53
orderBy: "urlRegexp",
54
orderDir: "asc",
55
searchTerm: request.searchTerm,
56
});
57
return new ListBlockedRepositoriesResponse({
58
blockedRepositories: info.rows.map((item) => converter.toBlockedRepository(item)),
59
pagination: new PaginationResponse(),
60
});
61
}
62
63
async createBlockedRepository(
64
request: PartialMessage<CreateBlockedRepositoryRequest>,
65
_options?: CallOptions | undefined,
66
): Promise<CreateBlockedRepositoryResponse> {
67
if (!request.urlRegexp) {
68
throw new ApplicationError(ErrorCodes.BAD_REQUEST, "urlRegexp is required");
69
}
70
if (request.blockUser === undefined) {
71
throw new ApplicationError(ErrorCodes.BAD_REQUEST, "blockUser is required");
72
}
73
if (request.blockFreeUsage === undefined) {
74
throw new ApplicationError(ErrorCodes.BAD_REQUEST, "blockFreeUsage is required");
75
}
76
const info = await getGitpodService().server.adminCreateBlockedRepository(
77
request.urlRegexp,
78
request.blockUser,
79
request.blockFreeUsage,
80
);
81
return new CreateBlockedRepositoryResponse({
82
blockedRepository: converter.toBlockedRepository(info),
83
});
84
}
85
86
async deleteBlockedRepository(
87
request: PartialMessage<DeleteBlockedRepositoryRequest>,
88
_options?: CallOptions | undefined,
89
): Promise<DeleteBlockedRepositoryResponse> {
90
if (!request.blockedRepositoryId) {
91
throw new ApplicationError(ErrorCodes.BAD_REQUEST, "blockedRepositoryId is required");
92
}
93
await getGitpodService().server.adminDeleteBlockedRepository(request.blockedRepositoryId);
94
return new DeleteBlockedRepositoryResponse();
95
}
96
97
async listBlockedEmailDomains(
98
request: PartialMessage<ListBlockedEmailDomainsRequest>,
99
_options?: CallOptions | undefined,
100
): Promise<ListBlockedEmailDomainsResponse> {
101
const info = await getGitpodService().server.adminGetBlockedEmailDomains();
102
return new ListBlockedEmailDomainsResponse({
103
blockedEmailDomains: info.map((item) => converter.toBlockedEmailDomain(item)),
104
pagination: new PaginationResponse(),
105
});
106
}
107
108
async createBlockedEmailDomain(
109
request: PartialMessage<CreateBlockedEmailDomainRequest>,
110
_options?: CallOptions | undefined,
111
): Promise<CreateBlockedEmailDomainResponse> {
112
if (!request.domain) {
113
throw new ApplicationError(ErrorCodes.BAD_REQUEST, "domain is required");
114
}
115
if (request.negative === undefined) {
116
throw new ApplicationError(ErrorCodes.BAD_REQUEST, "negative is required");
117
}
118
await getGitpodService().server.adminSaveBlockedEmailDomain({
119
domain: request.domain,
120
negative: request.negative,
121
});
122
// There's no way to get blockedEmailDomain, just ignore it since dashboard don't care about the response data
123
return new CreateBlockedEmailDomainResponse({});
124
}
125
126
async getOnboardingState(
127
request: PartialMessage<GetOnboardingStateRequest>,
128
_options?: CallOptions | undefined,
129
): Promise<GetOnboardingStateResponse> {
130
const info = await getGitpodService().server.getOnboardingState();
131
return new GetOnboardingStateResponse({
132
onboardingState: converter.toOnboardingState(info),
133
});
134
}
135
136
async getInstallationConfiguration(
137
request: Partial<GetInstallationConfigurationRequest>,
138
_options?: CallOptions | undefined,
139
): Promise<GetInstallationConfigurationResponse> {
140
const config = await getGitpodService().server.getConfiguration();
141
return new GetInstallationConfigurationResponse({
142
configuration: converter.toInstallationConfiguration(config),
143
});
144
}
145
}
146
147