Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
gitpod-io
GitHub Repository: gitpod-io/gitpod
Path: blob/main/components/gitpod-db/src/user-db.ts
2498 views
1
/**
2
* Copyright (c) 2020 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 {
8
GitpodToken,
9
GitpodTokenType,
10
Identity,
11
IdentityLookup,
12
SSHPublicKeyValue,
13
Token,
14
TokenEntry,
15
User,
16
UserEnvVar,
17
UserEnvVarValue,
18
UserSSHPublicKey,
19
} from "@gitpod/gitpod-protocol";
20
import { OAuthTokenRepository, OAuthUserRepository } from "@jmondi/oauth2-server";
21
import { Repository } from "typeorm";
22
import { DBUser } from "./typeorm/entity/db-user";
23
import { TransactionalDB } from "./typeorm/transactional-db-impl";
24
25
export type MaybeUser = User | undefined;
26
27
export const UserDB = Symbol("UserDB");
28
export interface UserDB extends OAuthUserRepository, OAuthTokenRepository, TransactionalDB<UserDB> {
29
newUser(): Promise<User>;
30
storeUser(newUser: User): Promise<User>;
31
updateUserPartial(partial: PartialUserUpdate): Promise<void>;
32
findUserById(id: string): Promise<MaybeUser>;
33
findUserByIdentity(identity: IdentityLookup): Promise<MaybeUser>;
34
35
/**
36
* Gets the number of users.
37
*
38
* @param excludeBuiltinUsers substract the builtin-users from the count (currently only the user builtin-workspace-prober), true by default
39
*/
40
getUserCount(excludeBuiltinUsers?: boolean): Promise<number>;
41
42
getUserRepo(): Promise<Repository<DBUser>>;
43
44
/**
45
* stores the given token and marks any existing tokens in that identity deleted.
46
*
47
* @param identity
48
* @param token
49
*/
50
storeSingleToken(identity: Pick<Identity, "authProviderId" | "authId">, token: Token): Promise<TokenEntry>;
51
52
/**
53
* adds the given token to the identity
54
*
55
* @param identity
56
* @param token
57
*/
58
addToken(identity: Pick<Identity, "authProviderId" | "authId">, token: Token): Promise<TokenEntry>;
59
60
/**
61
* Will mark tokens for the given identity as deleted.
62
*
63
* @param identity
64
* @param shouldDelete optional predicate to suppress deletion of certain entries
65
*/
66
deleteTokens(identity: Identity, shouldDelete?: (entry: TokenEntry) => boolean): Promise<void>;
67
68
/**
69
* Find TokenEntry by id
70
*
71
* @param uid
72
*/
73
findTokenEntryById(uid: string): Promise<TokenEntry | undefined>;
74
75
/**
76
* Delete TokenEntry by id
77
*
78
* @param uid
79
*/
80
deleteTokenEntryById(uid: string): Promise<void>;
81
82
/**
83
* Delete expired TokenEntries
84
*
85
* @param date All tokens with an expiry date before (older than) this ISO8601 formatted date are considered expired and will be deleted.
86
*/
87
deleteExpiredTokenEntries(date: string): Promise<void>;
88
89
/**
90
* Update TokenEntry by id
91
*
92
* @param tokenEntry
93
*/
94
updateTokenEntry(tokenEntry: Partial<TokenEntry> & Pick<TokenEntry, "uid">): Promise<void>;
95
96
/**
97
* @param identity
98
* @throws an error when there is more than one token
99
*/
100
findTokenEntryForIdentity(identity: Identity): Promise<TokenEntry | undefined>;
101
102
/**
103
*
104
* @param identity
105
* @param includeDeleted whether deleted tokens should be returned as well
106
*/
107
findTokensForIdentity(identity: Identity, includeDeleted?: boolean): Promise<TokenEntry[]>;
108
109
/**
110
* returns all users using the same email
111
*
112
* @param email
113
*/
114
findUsersByEmail(email: string): Promise<User[]>;
115
116
findEnvVar(userId: string, envVar: UserEnvVarValue): Promise<UserEnvVar | undefined>;
117
addEnvVar(userId: string, envVar: UserEnvVarValue): Promise<UserEnvVar>;
118
updateEnvVar(userId: string, envVar: Partial<UserEnvVarValue>): Promise<UserEnvVar | undefined>;
119
deleteEnvVar(envVar: UserEnvVar): Promise<void>;
120
getEnvVars(userId: string): Promise<UserEnvVar[]>;
121
122
// User SSH Keys
123
hasSSHPublicKey(userId: string): Promise<boolean>;
124
getSSHPublicKeys(userId: string): Promise<UserSSHPublicKey[]>;
125
addSSHPublicKey(userId: string, value: SSHPublicKeyValue): Promise<UserSSHPublicKey>;
126
deleteSSHPublicKey(userId: string, id: string): Promise<void>;
127
128
findAllUsers(
129
offset: number,
130
limit: number,
131
orderBy: keyof User,
132
orderDir: "ASC" | "DESC",
133
searchTerm?: string,
134
minCreationDate?: Date,
135
maxCreationDate?: Date,
136
excludeBuiltinUsers?: boolean,
137
): Promise<{ total: number; rows: User[] }>;
138
findUserByName(name: string): Promise<User | undefined>;
139
140
findUserByGitpodToken(
141
tokenHash: string,
142
tokenType?: GitpodTokenType,
143
): Promise<{ user: User; token: GitpodToken } | undefined>;
144
findGitpodTokensOfUser(userId: string, tokenHash: string): Promise<GitpodToken | undefined>;
145
findAllGitpodTokensOfUser(userId: string): Promise<GitpodToken[]>;
146
storeGitpodToken(token: GitpodToken): Promise<void>;
147
deleteGitpodToken(tokenHash: string): Promise<void>;
148
deleteGitpodTokensNamedLike(userId: string, namePattern: string): Promise<void>;
149
countUsagesOfPhoneNumber(phoneNumber: string): Promise<number>;
150
isBlockedPhoneNumber(phoneNumber: string): Promise<boolean>;
151
152
findOrgOwnedUser(organizationId: string, email: string): Promise<MaybeUser>;
153
154
findUserIdsNotYetMigratedToFgaVersion(fgaRelationshipsVersion: number, limit: number): Promise<string[]>;
155
}
156
export type PartialUserUpdate = Partial<Omit<User, "identities">> & Pick<User, "id">;
157
158
export const BUILTIN_WORKSPACE_PROBE_USER_ID = "builtin-user-workspace-probe-0000000";
159
160
export const BUILTIN_WORKSPACE_USER_AGENT_SMITH = "builtin-user-agent-smith-0000000";
161
162
// We need a valid UUID for the builtin admin user so that it can authenticate in order to call endpoints for setting up SSO
163
export const BUILTIN_INSTLLATION_ADMIN_USER_ID = "f071bb8e-b5d1-46cf-a436-da03ae63bcd2";
164
165
export function isBuiltinUser(userId: string): boolean {
166
return [
167
BUILTIN_WORKSPACE_PROBE_USER_ID,
168
BUILTIN_WORKSPACE_USER_AGENT_SMITH,
169
BUILTIN_INSTLLATION_ADMIN_USER_ID,
170
].some((id) => id === userId);
171
}
172
173