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