Skip to content

Commit 8e41547

Browse files
committed
implement shim'd getAuthenticatedUser
1 parent eb47000 commit 8e41547

File tree

3 files changed

+157
-3
lines changed

3 files changed

+157
-3
lines changed

components/dashboard/src/service/json-rpc-user-client.ts

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,19 @@
66

77
import { UserService } from "@gitpod/public-api/lib/gitpod/v1/user_connect";
88

9-
import { Code, ConnectError, PromiseClient } from "@connectrpc/connect";
9+
import { PromiseClient } from "@connectrpc/connect";
1010
import { PartialMessage } from "@bufbuild/protobuf";
1111
import { GetAuthenticatedUserRequest, GetAuthenticatedUserResponse } from "@gitpod/public-api/lib/gitpod/v1/user_pb";
12+
import { getGitpodService } from "./service";
13+
import { converter } from "./public-api";
1214

1315
export class JsonRpcUserClient implements PromiseClient<typeof UserService> {
1416
async getAuthenticatedUser(
1517
request: PartialMessage<GetAuthenticatedUserRequest>,
1618
): Promise<GetAuthenticatedUserResponse> {
17-
throw new ConnectError("unimplemented", Code.Unimplemented);
19+
const user = await getGitpodService().server.getLoggedInUser();
20+
return new GetAuthenticatedUserResponse({
21+
user: converter.toUser(user),
22+
});
1823
}
1924
}

components/gitpod-protocol/src/protocol.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -278,7 +278,7 @@ export interface AdditionalUserData extends Partial<WorkspaceTimeoutSetting> {
278278
workspaceAutostartOptions?: WorkspaceAutostartOption[];
279279
}
280280

281-
interface WorkspaceAutostartOption {
281+
export interface WorkspaceAutostartOption {
282282
cloneURL: string;
283283
organizationId: string;
284284
workspaceClass?: string;

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

Lines changed: 149 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,15 @@ import {
2525
AuthProviderType,
2626
OAuth2Config,
2727
} from "@gitpod/public-api/lib/gitpod/v1/authprovider_pb";
28+
import {
29+
Identity,
30+
User,
31+
User_EmailNotificationSettings,
32+
User_RoleOrPermission,
33+
User_UserFeatureFlag,
34+
User_WorkspaceAutostartOption,
35+
User_WorkspaceTimeoutSettings,
36+
} from "@gitpod/public-api/lib/gitpod/v1/user_pb";
2837
import {
2938
BranchMatchingStrategy,
3039
Configuration,
@@ -73,6 +82,8 @@ import {
7382
UnauthorizedRepositoryAccessError,
7483
} from "./messaging/error";
7584
import {
85+
User as UserProtocol,
86+
Identity as IdentityProtocol,
7687
AuthProviderEntry as AuthProviderProtocol,
7788
AuthProviderInfo,
7889
CommitContext,
@@ -89,6 +100,9 @@ import {
89100
Token,
90101
SuggestedRepository as SuggestedRepositoryProtocol,
91102
UserSSHPublicKeyValue,
103+
NamedWorkspaceFeatureFlag,
104+
WorkspaceAutostartOption,
105+
IDESettings,
92106
} from "./protocol";
93107
import {
94108
OrgMemberInfo,
@@ -109,6 +123,7 @@ import {
109123
} from "./workspace-instance";
110124
import { Author, Commit } from "@gitpod/public-api/lib/gitpod/v1/scm_pb";
111125
import type { DeepPartial } from "./util/deep-partial";
126+
import { RoleOrPermission } from "./permission";
112127

113128
export type PartialConfiguration = DeepPartial<Configuration> & Pick<Configuration, "id">;
114129

@@ -910,4 +925,138 @@ export class PublicAPIConverter {
910925
result.lastUsedTime = Timestamp.fromDate(new Date(sshKey.lastUsedTime || sshKey.creationTime));
911926
return result;
912927
}
928+
929+
toUser(from: UserProtocol): User {
930+
const {
931+
id,
932+
name,
933+
creationDate,
934+
identities,
935+
additionalData,
936+
avatarUrl,
937+
featureFlags,
938+
organizationId,
939+
rolesOrPermissions,
940+
usageAttributionId,
941+
blocked,
942+
lastVerificationTime,
943+
verificationPhoneNumber,
944+
} = from;
945+
const {
946+
disabledClosedTimeout,
947+
dotfileRepo,
948+
emailNotificationSettings,
949+
ideSettings,
950+
profile,
951+
workspaceAutostartOptions,
952+
workspaceClasses,
953+
workspaceTimeout,
954+
} = additionalData || {};
955+
956+
return new User({
957+
id,
958+
name,
959+
createdAt: this.toTimestamp(creationDate),
960+
avatarUrl,
961+
organizationId,
962+
usageAttributionId,
963+
blocked,
964+
identities: identities?.map((i) => this.toIdentity(i)),
965+
rolesOrPermissions: rolesOrPermissions?.map((rp) => this.toRoleOrPermission(rp)),
966+
workspaceFeatureFlags: featureFlags?.permanentWSFeatureFlags?.map((ff) => this.toUserFeatureFlags(ff)),
967+
timeoutSettings: new User_WorkspaceTimeoutSettings({
968+
disabledClosedTimeout,
969+
workspaceTimeout,
970+
}),
971+
dotfileRepo,
972+
emailNotificationSettings: new User_EmailNotificationSettings({
973+
allowsChangelogMail: emailNotificationSettings?.allowsChangelogMail,
974+
allowsDevxMail: emailNotificationSettings?.allowsDevXMail,
975+
allowsOnboardingMail: emailNotificationSettings?.allowsOnboardingMail,
976+
}),
977+
editorSettings: this.toEditorReference(ideSettings),
978+
lastVerificationTime: this.toTimestamp(lastVerificationTime),
979+
verificationPhoneNumber,
980+
workspaceClass: workspaceClasses?.regular,
981+
workspaceAutostartOptions: workspaceAutostartOptions?.map((o) => this.toWorkspaceAutostartOption(o)),
982+
profile,
983+
});
984+
}
985+
986+
toTimestamp(from?: string | undefined): Timestamp | undefined {
987+
return from ? Timestamp.fromDate(new Date(from)) : undefined;
988+
}
989+
990+
toIdentity(from: IdentityProtocol): Identity {
991+
const { authId, authName, authProviderId, lastSigninTime, primaryEmail } = from;
992+
return new Identity({
993+
authProviderId,
994+
authId,
995+
authName,
996+
lastSigninTime: this.toTimestamp(lastSigninTime),
997+
primaryEmail,
998+
});
999+
}
1000+
1001+
toRoleOrPermission(from: RoleOrPermission): User_RoleOrPermission {
1002+
switch (from) {
1003+
case "admin":
1004+
return User_RoleOrPermission.ADMIN;
1005+
case "devops":
1006+
return User_RoleOrPermission.DEVOPS;
1007+
case "viewer":
1008+
return User_RoleOrPermission.VIEWER;
1009+
case "developer":
1010+
return User_RoleOrPermission.DEVELOPER;
1011+
case "registry-access":
1012+
return User_RoleOrPermission.REGISTRY_ACCESS;
1013+
case "admin-permissions":
1014+
return User_RoleOrPermission.ADMIN_PERMISSIONS;
1015+
case "admin-users":
1016+
return User_RoleOrPermission.ADMIN_USERS;
1017+
case "admin-workspace-content":
1018+
return User_RoleOrPermission.ADMIN_WORKSPACE_CONTENT;
1019+
case "admin-workspaces":
1020+
return User_RoleOrPermission.ADMIN_WORKSPACE;
1021+
case "admin-projects":
1022+
return User_RoleOrPermission.ADMIN_PROJECTS;
1023+
case "new-workspace-cluster":
1024+
return User_RoleOrPermission.NEW_WORKSPACE_CLUSTER;
1025+
}
1026+
return User_RoleOrPermission.UNSPECIFIED;
1027+
}
1028+
1029+
toUserFeatureFlags(from: NamedWorkspaceFeatureFlag): User_UserFeatureFlag {
1030+
switch (from) {
1031+
case "full_workspace_backup":
1032+
return User_UserFeatureFlag.FULL_WORKSPACE_BACKUP;
1033+
case "workspace_class_limiting":
1034+
return User_UserFeatureFlag.WORKSPACE_CLASS_LIMITING;
1035+
case "workspace_connection_limiting":
1036+
return User_UserFeatureFlag.WORKSPACE_CONNECTION_LIMITING;
1037+
case "workspace_psi":
1038+
return User_UserFeatureFlag.WORKSPACE_PSI;
1039+
}
1040+
return User_UserFeatureFlag.UNSPECIFIED;
1041+
}
1042+
1043+
toEditorReference(from?: IDESettings): EditorReference | undefined {
1044+
if (!from) {
1045+
return undefined;
1046+
}
1047+
return new EditorReference({
1048+
name: from.defaultIde,
1049+
version: from.useLatestVersion ? "latest" : "stable",
1050+
});
1051+
}
1052+
1053+
toWorkspaceAutostartOption(from: WorkspaceAutostartOption): User_WorkspaceAutostartOption {
1054+
return new User_WorkspaceAutostartOption({
1055+
cloneUrl: from.cloneURL,
1056+
editorSettings: this.toEditorReference(from.ideSettings),
1057+
organizationId: from.organizationId,
1058+
region: from.region,
1059+
workspaceClass: from.workspaceClass,
1060+
});
1061+
}
9131062
}

0 commit comments

Comments
 (0)