4
4
* See License.AGPL.txt in the project root for license information.
5
5
*/
6
6
7
+ import { del } from "@gitbeaker/core/dist/types/infrastructure" ;
7
8
import { ErrorCodes } from "@gitpod/gitpod-protocol/lib/messaging/error" ;
8
9
import { OpenFgaApi , TupleKey } from "@openfga/sdk" ;
9
10
import { ResponseError } from "vscode-jsonrpc" ;
@@ -30,42 +31,59 @@ function proj(id: string): string {
30
31
return `project:${ id } ` ;
31
32
}
32
33
34
+ export async function isTeamOwner ( userID : string , teamID : string ) : Promise < boolean > {
35
+ return (
36
+ (
37
+ await OpenFGA . check ( {
38
+ tuple_key : tup ( user ( userID ) , "owner" , team ( teamID ) ) ,
39
+ } )
40
+ ) . allowed || false
41
+ ) ;
42
+ }
43
+
44
+ export async function isTeamMember ( userID : string , teamID : string ) : Promise < boolean > {
45
+ return (
46
+ (
47
+ await OpenFGA . check ( {
48
+ tuple_key : tup ( user ( userID ) , "member" , team ( teamID ) ) ,
49
+ } )
50
+ ) . allowed || false
51
+ ) ;
52
+ }
53
+
33
54
export async function grantTeamOwner ( userID : string , teamID : string ) {
34
- await OpenFGA . write ( {
55
+ const deletes : TupleKey [ ] = [ ] ;
56
+
57
+ const isMember = await isTeamMember ( userID , teamID ) ;
58
+ if ( isMember ) {
59
+ deletes . push ( tup ( user ( userID ) , "member" , team ( teamID ) ) ) ;
60
+ }
61
+
62
+ return await OpenFGA . write ( {
35
63
writes : {
36
64
tuple_keys : [ tup ( user ( userID ) , "owner" , team ( teamID ) ) ] ,
37
65
} ,
66
+ deletes : {
67
+ tuple_keys : deletes ,
68
+ } ,
38
69
} ) ;
39
-
40
- try {
41
- // also remove any existing member role, if it existed
42
- await OpenFGA . write ( {
43
- deletes : {
44
- tuple_keys : [ tup ( user ( userID ) , "member" , team ( teamID ) ) ] ,
45
- } ,
46
- } ) ;
47
- } catch ( e ) {
48
- // if the member role did not exist, the delete we fail, but we do not need to do anything as we have the desired outcome.
49
- }
50
70
}
51
71
52
72
export async function grantTeamMember ( userID : string , teamID : string ) {
73
+ const deletes : TupleKey [ ] = [ ] ;
74
+
75
+ const isMember = await isTeamOwner ( userID , teamID ) ;
76
+ if ( isMember ) {
77
+ deletes . push ( tup ( user ( userID ) , "owner" , team ( teamID ) ) ) ;
78
+ }
53
79
await OpenFGA . write ( {
54
80
writes : {
55
81
tuple_keys : [ tup ( user ( userID ) , "member" , team ( teamID ) ) ] ,
56
82
} ,
83
+ deletes : {
84
+ tuple_keys : deletes ,
85
+ } ,
57
86
} ) ;
58
-
59
- try {
60
- // also remove any existing owner role
61
- await OpenFGA . write ( {
62
- deletes : {
63
- tuple_keys : [ tup ( user ( userID ) , "owner" , team ( teamID ) ) ] ,
64
- } ,
65
- } ) ;
66
- } catch ( e ) {
67
- // if the owner role did not exist, the delete we fail, but we do not need to do anything as we have the desired outcome.
68
- }
69
87
}
70
88
71
89
export async function removeUserFromTeam ( userID : string , teamID : string ) {
0 commit comments