Skip to content

Commit 8828eb9

Browse files
committed
WIP: create, update, and delete authProviders
1 parent e30c7f0 commit 8828eb9

File tree

2 files changed

+95
-3
lines changed

2 files changed

+95
-3
lines changed

components/gitpod-protocol/src/public-api-converter.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -424,4 +424,19 @@ export class PublicAPIConverter {
424424
return AuthProviderType.UNSPECIFIED; // not allowed
425425
}
426426
}
427+
428+
fromAuthProviderType(type: AuthProviderType): string {
429+
switch (type) {
430+
case AuthProviderType.GITHUB:
431+
return "GitHub";
432+
case AuthProviderType.GITLAB:
433+
return "GitLab";
434+
case AuthProviderType.BITBUCKET:
435+
return "Bitbucket";
436+
case AuthProviderType.BITBUCKET_SERVER:
437+
return "BitbucketServer";
438+
default:
439+
return ""; // not allowed
440+
}
441+
}
427442
}

components/server/src/api/auth-provider-service-api.ts

Lines changed: 80 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,35 @@ export class AuthProviderServiceAPI implements ServiceImpl<typeof AuthProviderSe
3636
request: CreateAuthProviderRequest,
3737
context: HandlerContext,
3838
): Promise<CreateAuthProviderResponse> {
39-
throw new ConnectError("unimplemented", Code.Unimplemented);
39+
const ownerId = request.owner.case === "ownerId" ? request.owner.value : undefined;
40+
const organizationId = request.owner.case === "organizationId" ? request.owner.value : undefined;
41+
42+
if (!organizationId && !ownerId) {
43+
throw new ConnectError("organizationId or ownerId is required", Code.InvalidArgument);
44+
}
45+
46+
if (organizationId) {
47+
const result = await this.authProviderService.createOrgAuthProvider(context.user.id, {
48+
organizationId,
49+
host: request.host,
50+
ownerId: context.user.id,
51+
type: this.apiConverter.fromAuthProviderType(request.type),
52+
clientId: request.oauth2Config?.clientId,
53+
clientSecret: request.oauth2Config?.clientSecret,
54+
});
55+
56+
return new CreateAuthProviderResponse({ authProvider: this.apiConverter.toAuthProvider(result) });
57+
} else {
58+
const result = await this.authProviderService.createAuthProviderOfUser(context.user.id, {
59+
host: request.host,
60+
ownerId: context.user.id,
61+
type: this.apiConverter.fromAuthProviderType(request.type),
62+
clientId: request.oauth2Config?.clientId,
63+
clientSecret: request.oauth2Config?.clientSecret,
64+
});
65+
66+
return new CreateAuthProviderResponse({ authProvider: this.apiConverter.toAuthProvider(result) });
67+
}
4068
}
4169
async getAuthProvider(request: GetAuthProviderRequest, context: HandlerContext): Promise<GetAuthProviderResponse> {
4270
if (!request.authProviderId) {
@@ -88,13 +116,62 @@ export class AuthProviderServiceAPI implements ServiceImpl<typeof AuthProviderSe
88116
request: UpdateAuthProviderRequest,
89117
context: HandlerContext,
90118
): Promise<UpdateAuthProviderResponse> {
91-
throw new ConnectError("unimplemented", Code.Unimplemented);
119+
if (!request.authProviderId) {
120+
throw new ConnectError("authProviderId is required", Code.InvalidArgument);
121+
}
122+
const clientId = request?.oauth2Config?.clientId;
123+
const clientSecret = request?.oauth2Config?.clientSecret;
124+
if (!clientId || typeof clientSecret === "undefined") {
125+
throw new ConnectError("clientId or clientSecret are required", Code.InvalidArgument);
126+
}
127+
128+
const authProvider = await this.authProviderService.getAuthProvider(context.user.id, request.authProviderId);
129+
if (!authProvider) {
130+
throw new ConnectError("Provider not found.", Code.NotFound);
131+
}
132+
133+
if (authProvider.organizationId) {
134+
await this.authProviderService.updateOrgAuthProvider(context.user.id, {
135+
id: request.authProviderId,
136+
organizationId: authProvider.organizationId,
137+
clientId: clientId,
138+
clientSecret: clientSecret,
139+
});
140+
} else {
141+
await this.authProviderService.updateAuthProviderOfUser(context.user.id, {
142+
id: request.authProviderId,
143+
ownerId: context.user.id,
144+
clientId: clientId,
145+
clientSecret: clientSecret,
146+
});
147+
}
148+
149+
return new UpdateAuthProviderResponse();
92150
}
93151

94152
async deleteAuthProvider(
95153
request: DeleteAuthProviderRequest,
96154
context: HandlerContext,
97155
): Promise<DeleteAuthProviderResponse> {
98-
throw new ConnectError("unimplemented", Code.Unimplemented);
156+
if (!request.authProviderId) {
157+
throw new ConnectError("authProviderId is required", Code.InvalidArgument);
158+
}
159+
160+
const authProvider = await this.authProviderService.getAuthProvider(context.user.id, request.authProviderId);
161+
if (!authProvider) {
162+
throw new ConnectError("Provider not found.", Code.NotFound);
163+
}
164+
165+
if (authProvider.organizationId) {
166+
await this.authProviderService.deleteAuthProviderOfOrg(
167+
context.user.id,
168+
authProvider.organizationId,
169+
request.authProviderId,
170+
);
171+
} else {
172+
await this.authProviderService.deleteAuthProviderOfUser(context.user.id, request.authProviderId);
173+
}
174+
175+
return new DeleteAuthProviderResponse();
99176
}
100177
}

0 commit comments

Comments
 (0)