5
5
*/
6
6
7
7
import { injectable , inject } from "inversify" ;
8
- import { UserDB , WorkspaceDB , UserStorageResourcesDB , TeamDB } from '@gitpod/gitpod-db/lib' ;
8
+ import { UserDB , WorkspaceDB , UserStorageResourcesDB , TeamDB , ProjectDB } from '@gitpod/gitpod-db/lib' ;
9
9
import { User , Workspace } from "@gitpod/gitpod-protocol" ;
10
10
import { StorageClient } from "../storage/storage-client" ;
11
11
import { log } from '@gitpod/gitpod-protocol/lib/util/logging' ;
@@ -23,6 +23,7 @@ export class UserDeletionService {
23
23
@inject ( WorkspaceDB ) protected readonly workspaceDb : WorkspaceDB ;
24
24
@inject ( UserStorageResourcesDB ) protected readonly userStorageResourcesDb : UserStorageResourcesDB ;
25
25
@inject ( TeamDB ) protected readonly teamDb : TeamDB ;
26
+ @inject ( ProjectDB ) protected readonly projectDb : ProjectDB ;
26
27
@inject ( StorageClient ) protected readonly storageClient : StorageClient ;
27
28
@inject ( WorkspaceManagerClientProvider ) protected readonly workspaceManagerClientProvider : WorkspaceManagerClientProvider ;
28
29
@inject ( WorkspaceDeletionService ) protected readonly workspaceDeletionService : WorkspaceDeletionService ;
@@ -74,8 +75,12 @@ export class UserDeletionService {
74
75
this . userStorageResourcesDb . deleteAllForUser ( user . id ) ,
75
76
// Bucket
76
77
this . deleteUserBucket ( id ) ,
78
+ // Owned teams
79
+ this . deleteTeams ( id ) ,
77
80
// Team memberships
78
81
this . deleteTeamMemberships ( id ) ,
82
+ // User projects
83
+ this . deleteUserProjects ( id ) ,
79
84
] ) ;
80
85
81
86
// Track the deletion Event for Analytics Purposes
@@ -140,6 +145,23 @@ export class UserDeletionService {
140
145
await Promise . all ( teams . map ( t => this . teamDb . removeMemberFromTeam ( userId , t . id ) ) ) ;
141
146
}
142
147
148
+ protected async deleteTeams ( userId : string ) {
149
+ const ownedTeams = await this . teamDb . findTeamsByUserAsSoleOwner ( userId ) ;
150
+
151
+ ownedTeams . forEach ( async team => {
152
+ const teamProjects = this . projectDb . findTeamProjects ( team . id ) ;
153
+ ( await teamProjects ) . forEach ( project => this . projectDb . markDeleted ( project . id ) ) ;
154
+ } )
155
+
156
+ await Promise . all ( ownedTeams . map ( t => this . teamDb . deleteTeam ( t . id ) ) ) ;
157
+ }
158
+
159
+ protected async deleteUserProjects ( id : string ) {
160
+ const userProjects = await this . projectDb . findUserProjects ( id ) ;
161
+
162
+ await Promise . all ( userProjects . map ( project => this . projectDb . markDeleted ( project . id ) ) ) ;
163
+ }
164
+
143
165
anonymizeWorkspace ( ws : Workspace ) {
144
166
ws . context . title = 'deleted-title' ;
145
167
ws . context . normalizedContextURL = 'deleted-normalizedContextURL' ;
0 commit comments