4
4
* See License.AGPL.txt in the project root for license information.
5
5
*/
6
6
7
- import { Timestamp , toPlainMessage } from "@bufbuild/protobuf" ;
7
+ import { Timestamp , toPlainMessage , Duration } from "@bufbuild/protobuf" ;
8
8
import { Code , ConnectError } from "@connectrpc/connect" ;
9
9
import {
10
10
FailedPreconditionDetails ,
@@ -25,6 +25,15 @@ import {
25
25
AuthProviderType ,
26
26
OAuth2Config ,
27
27
} 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" ;
28
37
import {
29
38
BranchMatchingStrategy ,
30
39
Configuration ,
@@ -73,6 +82,8 @@ import {
73
82
UnauthorizedRepositoryAccessError ,
74
83
} from "./messaging/error" ;
75
84
import {
85
+ User as UserProtocol ,
86
+ Identity as IdentityProtocol ,
76
87
AuthProviderEntry as AuthProviderProtocol ,
77
88
AuthProviderInfo ,
78
89
CommitContext ,
@@ -89,6 +100,9 @@ import {
89
100
Token ,
90
101
SuggestedRepository as SuggestedRepositoryProtocol ,
91
102
UserSSHPublicKeyValue ,
103
+ NamedWorkspaceFeatureFlag ,
104
+ WorkspaceAutostartOption ,
105
+ IDESettings ,
92
106
} from "./protocol" ;
93
107
import {
94
108
OrgMemberInfo ,
@@ -109,6 +123,8 @@ import {
109
123
} from "./workspace-instance" ;
110
124
import { Author , Commit } from "@gitpod/public-api/lib/gitpod/v1/scm_pb" ;
111
125
import type { DeepPartial } from "./util/deep-partial" ;
126
+ import { RoleOrPermission } from "./permission" ;
127
+ import { parseGoDurationToMs } from "./util/timeutil" ;
112
128
113
129
export type PartialConfiguration = DeepPartial < Configuration > & Pick < Configuration , "id" > ;
114
130
@@ -910,4 +926,151 @@ export class PublicAPIConverter {
910
926
result . lastUsedTime = Timestamp . fromDate ( new Date ( sshKey . lastUsedTime || sshKey . creationTime ) ) ;
911
927
return result ;
912
928
}
929
+
930
+ toUser ( from : UserProtocol ) : User {
931
+ const {
932
+ id,
933
+ name,
934
+ creationDate,
935
+ identities,
936
+ additionalData,
937
+ avatarUrl,
938
+ featureFlags,
939
+ organizationId,
940
+ rolesOrPermissions,
941
+ usageAttributionId,
942
+ blocked,
943
+ lastVerificationTime,
944
+ verificationPhoneNumber,
945
+ } = from ;
946
+ const {
947
+ disabledClosedTimeout,
948
+ dotfileRepo,
949
+ emailNotificationSettings,
950
+ ideSettings,
951
+ profile,
952
+ workspaceAutostartOptions,
953
+ workspaceClasses,
954
+ workspaceTimeout,
955
+ } = additionalData || { } ;
956
+
957
+ return new User ( {
958
+ id,
959
+ name,
960
+ createdAt : this . toTimestamp ( creationDate ) ,
961
+ avatarUrl,
962
+ organizationId,
963
+ usageAttributionId,
964
+ blocked,
965
+ identities : identities ?. map ( ( i ) => this . toIdentity ( i ) ) ,
966
+ rolesOrPermissions : rolesOrPermissions ?. map ( ( rp ) => this . toRoleOrPermission ( rp ) ) ,
967
+ workspaceFeatureFlags : featureFlags ?. permanentWSFeatureFlags ?. map ( ( ff ) => this . toUserFeatureFlags ( ff ) ) ,
968
+ workspaceTimeoutSettings : new User_WorkspaceTimeoutSettings ( {
969
+ inactivity : this . toDuration ( workspaceTimeout ) ,
970
+ disabledDisconnected : disabledClosedTimeout ,
971
+ } ) ,
972
+ dotfileRepo,
973
+ emailNotificationSettings : new User_EmailNotificationSettings ( {
974
+ allowsChangelogMail : emailNotificationSettings ?. allowsChangelogMail ,
975
+ allowsDevxMail : emailNotificationSettings ?. allowsDevXMail ,
976
+ allowsOnboardingMail : emailNotificationSettings ?. allowsOnboardingMail ,
977
+ } ) ,
978
+ editorSettings : this . toEditorReference ( ideSettings ) ,
979
+ lastVerificationTime : this . toTimestamp ( lastVerificationTime ) ,
980
+ verificationPhoneNumber,
981
+ workspaceClass : workspaceClasses ?. regular ,
982
+ workspaceAutostartOptions : workspaceAutostartOptions ?. map ( ( o ) => this . toWorkspaceAutostartOption ( o ) ) ,
983
+ profile,
984
+ } ) ;
985
+ }
986
+
987
+ toDuration ( from ?: string ) : Duration | undefined {
988
+ if ( ! from ) {
989
+ return undefined ;
990
+ }
991
+ const millis = parseGoDurationToMs ( from ) ;
992
+ const seconds = BigInt ( Math . floor ( millis / 1000 ) ) ;
993
+ const nanos = ( millis % 1000 ) * 1000000 ;
994
+ return new Duration ( {
995
+ seconds,
996
+ nanos,
997
+ } ) ;
998
+ }
999
+
1000
+ toTimestamp ( from ?: string | undefined ) : Timestamp | undefined {
1001
+ return from ? Timestamp . fromDate ( new Date ( from ) ) : undefined ;
1002
+ }
1003
+
1004
+ toIdentity ( from : IdentityProtocol ) : Identity {
1005
+ const { authId, authName, authProviderId, lastSigninTime, primaryEmail } = from ;
1006
+ return new Identity ( {
1007
+ authProviderId,
1008
+ authId,
1009
+ authName,
1010
+ lastSigninTime : this . toTimestamp ( lastSigninTime ) ,
1011
+ primaryEmail,
1012
+ } ) ;
1013
+ }
1014
+
1015
+ toRoleOrPermission ( from : RoleOrPermission ) : User_RoleOrPermission {
1016
+ switch ( from ) {
1017
+ case "admin" :
1018
+ return User_RoleOrPermission . ADMIN ;
1019
+ case "devops" :
1020
+ return User_RoleOrPermission . DEVOPS ;
1021
+ case "viewer" :
1022
+ return User_RoleOrPermission . VIEWER ;
1023
+ case "developer" :
1024
+ return User_RoleOrPermission . DEVELOPER ;
1025
+ case "registry-access" :
1026
+ return User_RoleOrPermission . REGISTRY_ACCESS ;
1027
+ case "admin-permissions" :
1028
+ return User_RoleOrPermission . ADMIN_PERMISSIONS ;
1029
+ case "admin-users" :
1030
+ return User_RoleOrPermission . ADMIN_USERS ;
1031
+ case "admin-workspace-content" :
1032
+ return User_RoleOrPermission . ADMIN_WORKSPACE_CONTENT ;
1033
+ case "admin-workspaces" :
1034
+ return User_RoleOrPermission . ADMIN_WORKSPACES ;
1035
+ case "admin-projects" :
1036
+ return User_RoleOrPermission . ADMIN_PROJECTS ;
1037
+ case "new-workspace-cluster" :
1038
+ return User_RoleOrPermission . NEW_WORKSPACE_CLUSTER ;
1039
+ }
1040
+ return User_RoleOrPermission . UNSPECIFIED ;
1041
+ }
1042
+
1043
+ toUserFeatureFlags ( from : NamedWorkspaceFeatureFlag ) : User_UserFeatureFlag {
1044
+ switch ( from ) {
1045
+ case "full_workspace_backup" :
1046
+ return User_UserFeatureFlag . FULL_WORKSPACE_BACKUP ;
1047
+ case "workspace_class_limiting" :
1048
+ return User_UserFeatureFlag . WORKSPACE_CLASS_LIMITING ;
1049
+ case "workspace_connection_limiting" :
1050
+ return User_UserFeatureFlag . WORKSPACE_CONNECTION_LIMITING ;
1051
+ case "workspace_psi" :
1052
+ return User_UserFeatureFlag . WORKSPACE_PSI ;
1053
+ }
1054
+ return User_UserFeatureFlag . UNSPECIFIED ;
1055
+ }
1056
+
1057
+ toEditorReference ( from ?: IDESettings ) : EditorReference | undefined {
1058
+ if ( ! from ) {
1059
+ return undefined ;
1060
+ }
1061
+ return new EditorReference ( {
1062
+ name : from . defaultIde ,
1063
+ version : from . useLatestVersion ? "latest" : "stable" ,
1064
+ } ) ;
1065
+ }
1066
+
1067
+ toWorkspaceAutostartOption ( from : WorkspaceAutostartOption ) : User_WorkspaceAutostartOption {
1068
+ return new User_WorkspaceAutostartOption ( {
1069
+ cloneUrl : from . cloneURL ,
1070
+ editorSettings : this . toEditorReference ( from . ideSettings ) ,
1071
+ organizationId : from . organizationId ,
1072
+ region : from . region ,
1073
+ workspaceClass : from . workspaceClass ,
1074
+ } ) ;
1075
+ }
913
1076
}
0 commit comments