Skip to content

Commit ae50fbd

Browse files
committed
[dashboard] add client facade (JsonRpcAuthProviderClient)
1 parent b41d9c6 commit ae50fbd

File tree

2 files changed

+140
-0
lines changed

2 files changed

+140
-0
lines changed
Lines changed: 136 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,136 @@
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 { Code, ConnectError, PromiseClient } from "@connectrpc/connect";
9+
import { AuthProviderService } from "@gitpod/public-api/lib/gitpod/v1/authprovider_connect";
10+
import {
11+
CreateAuthProviderRequest,
12+
CreateAuthProviderResponse,
13+
DeleteAuthProviderRequest,
14+
DeleteAuthProviderResponse,
15+
GetAuthProviderRequest,
16+
GetAuthProviderResponse,
17+
ListAuthProviderDescriptionsRequest,
18+
ListAuthProviderDescriptionsResponse,
19+
ListAuthProvidersRequest,
20+
ListAuthProvidersResponse,
21+
UpdateAuthProviderRequest,
22+
UpdateAuthProviderResponse,
23+
} from "@gitpod/public-api/lib/gitpod/v1/authprovider_pb";
24+
import { converter } from "./public-api";
25+
import { getGitpodService } from "./service";
26+
27+
export class JsonRpcAuthProviderClient implements PromiseClient<typeof AuthProviderService> {
28+
async createAuthProvider(request: PartialMessage<CreateAuthProviderRequest>): Promise<CreateAuthProviderResponse> {
29+
const ownerId = request.owner?.case === "ownerId" ? request.owner.value : undefined;
30+
const organizationId = request.owner?.case === "organizationId" ? request.owner.value : undefined;
31+
32+
if (!organizationId && !ownerId) {
33+
throw new ConnectError("organizationId or ownerId is required", Code.InvalidArgument);
34+
}
35+
if (!request.type) {
36+
throw new ConnectError("type is required", Code.InvalidArgument);
37+
}
38+
if (!request.host) {
39+
throw new ConnectError("host is required", Code.InvalidArgument);
40+
}
41+
42+
if (organizationId) {
43+
const result = await getGitpodService().server.createOrgAuthProvider({
44+
entry: {
45+
organizationId,
46+
host: request.host,
47+
type: converter.fromAuthProviderType(request.type),
48+
clientId: request.oauth2Config?.clientId,
49+
clientSecret: request.oauth2Config?.clientSecret,
50+
},
51+
});
52+
return new CreateAuthProviderResponse({ authProvider: converter.toAuthProvider(result) });
53+
}
54+
if (ownerId) {
55+
const result = await getGitpodService().server.updateOwnAuthProvider({
56+
entry: {
57+
host: request.host,
58+
ownerId,
59+
type: converter.fromAuthProviderType(request.type),
60+
clientId: request.oauth2Config?.clientId,
61+
clientSecret: request.oauth2Config?.clientSecret,
62+
},
63+
});
64+
return new CreateAuthProviderResponse({ authProvider: converter.toAuthProvider(result) });
65+
}
66+
67+
throw new ConnectError("organizationId or ownerId is required", Code.InvalidArgument);
68+
}
69+
70+
async getAuthProvider(request: PartialMessage<GetAuthProviderRequest>): Promise<GetAuthProviderResponse> {
71+
if (!request.authProviderId) {
72+
throw new ConnectError("authProviderId is required", Code.InvalidArgument);
73+
}
74+
75+
const provider = await getGitpodService().server.getAuthProvider(request.authProviderId);
76+
return new GetAuthProviderResponse({
77+
authProvider: converter.toAuthProvider(provider),
78+
});
79+
}
80+
81+
async listAuthProviders(request: PartialMessage<ListAuthProvidersRequest>): Promise<ListAuthProvidersResponse> {
82+
if (!request.id?.case) {
83+
throw new ConnectError("id is required", Code.InvalidArgument);
84+
}
85+
const organizationId = request.id.case === "organizationId" ? request.id.value : undefined;
86+
const userId = request.id.case === "userId" ? request.id.value : undefined;
87+
88+
if (!organizationId && !userId) {
89+
throw new ConnectError("organizationId or userId is required", Code.InvalidArgument);
90+
}
91+
92+
const authProviders = !!organizationId
93+
? await getGitpodService().server.getOrgAuthProviders({
94+
organizationId,
95+
})
96+
: await getGitpodService().server.getOwnAuthProviders();
97+
const response = new ListAuthProvidersResponse({
98+
authProviders: authProviders.map(converter.toAuthProvider),
99+
});
100+
return response;
101+
}
102+
103+
async listAuthProviderDescriptions(
104+
request: PartialMessage<ListAuthProviderDescriptionsRequest>,
105+
): Promise<ListAuthProviderDescriptionsResponse> {
106+
const aps = await getGitpodService().server.getAuthProviders();
107+
return new ListAuthProviderDescriptionsResponse({
108+
descriptions: aps.map((ap) => converter.toAuthProviderDescription(ap)),
109+
});
110+
}
111+
112+
async updateAuthProvider(request: PartialMessage<UpdateAuthProviderRequest>): Promise<UpdateAuthProviderResponse> {
113+
if (!request.authProviderId) {
114+
throw new ConnectError("authProviderId is required", Code.InvalidArgument);
115+
}
116+
const clientId = request?.clientId;
117+
const clientSecret = request?.clientSecret;
118+
if (!clientId || !clientSecret) {
119+
throw new ConnectError("clientId or clientSecret are required", Code.InvalidArgument);
120+
}
121+
122+
await getGitpodService().server.updateAuthProvider(request.authProviderId, {
123+
clientId,
124+
clientSecret,
125+
});
126+
return new UpdateAuthProviderResponse();
127+
}
128+
129+
async deleteAuthProvider(request: PartialMessage<DeleteAuthProviderRequest>): Promise<DeleteAuthProviderResponse> {
130+
if (!request.authProviderId) {
131+
throw new ConnectError("authProviderId is required", Code.InvalidArgument);
132+
}
133+
await getGitpodService().server.deleteAuthProvider(request.authProviderId);
134+
return new DeleteAuthProviderResponse();
135+
}
136+
}

components/dashboard/src/service/public-api.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ import { getMetricsInterceptor } from "@gitpod/public-api/lib/metrics";
2323
import { getExperimentsClient } from "../experiments/client";
2424
import { JsonRpcOrganizationClient } from "./json-rpc-organization-client";
2525
import { JsonRpcWorkspaceClient } from "./json-rpc-workspace-client";
26+
import { JsonRpcAuthProviderClient } from "./json-rpc-authprovider-client";
27+
import { AuthProviderService } from "@gitpod/public-api/lib/gitpod/v1/authprovider_connect";
2628

2729
const transport = createConnectTransport({
2830
baseUrl: `${window.location.protocol}//${window.location.host}/public-api`,
@@ -49,6 +51,8 @@ export const organizationClient = createServiceClient(
4951
// No jsonrcp client for the configuration service as it's only used in new UI of the dashboard
5052
export const configurationClient = createServiceClient(ConfigurationService);
5153

54+
export const authProviderClient = createServiceClient(AuthProviderService, new JsonRpcAuthProviderClient());
55+
5256
export async function listAllProjects(opts: { orgId: string }): Promise<ProtocolProject[]> {
5357
let pagination = {
5458
page: 1,

0 commit comments

Comments
 (0)