1
1
package com .openblocks .domain .permission .service ;
2
2
3
+ import static com .openblocks .domain .permission .model .ResourceHolder .USER ;
4
+ import static com .openblocks .sdk .constants .Authentication .ANONYMOUS_USER_ID ;
5
+
3
6
import java .util .Collection ;
4
7
import java .util .Collections ;
5
8
import java .util .List ;
6
9
import java .util .Map ;
10
+ import java .util .function .Function ;
11
+ import java .util .stream .Collectors ;
7
12
13
+ import org .apache .commons .collections4 .CollectionUtils ;
8
14
import org .springframework .beans .factory .annotation .Autowired ;
9
15
import org .springframework .context .annotation .Lazy ;
10
16
import org .springframework .stereotype .Component ;
11
17
18
+ import com .google .common .collect .Maps ;
12
19
import com .openblocks .domain .datasource .model .Datasource ;
13
20
import com .openblocks .domain .datasource .service .DatasourceService ;
14
21
import com .openblocks .domain .permission .model .ResourceAction ;
15
22
import com .openblocks .domain .permission .model .ResourcePermission ;
23
+ import com .openblocks .domain .permission .model .ResourceRole ;
24
+ import com .openblocks .domain .permission .model .ResourceType ;
16
25
17
26
import reactor .core .publisher .Mono ;
18
27
19
28
@ Lazy
20
29
@ Component
21
30
class DatasourcePermissionHandler extends ResourcePermissionHandler {
22
31
32
+ private static final ResourceRole SYSTEM_STATIC_DATASOURCE_USER_ROLE = ResourceRole .OWNER ;
33
+
23
34
@ Autowired
24
35
private DatasourceService datasourceService ;
25
36
@@ -33,4 +44,39 @@ protected Mono<String> getOrgId(String resourceId) {
33
44
return datasourceService .getById (resourceId )
34
45
.map (Datasource ::getOrganizationId );
35
46
}
47
+
48
+ @ Override
49
+ public Mono <Map <String , List <ResourcePermission >>> getAllMatchingPermissions (String userId , Collection <String > resourceIds ,
50
+ ResourceAction resourceAction ) {
51
+
52
+ List <String > systemStaticDatasourceIds = resourceIds .stream ()
53
+ .filter (Datasource ::isSystemStaticId )
54
+ .toList ();
55
+ List <String > nonSystemStaticDatasourceIds = resourceIds .stream ()
56
+ .filter (Datasource ::isNotSystemStaticId )
57
+ .toList ();
58
+
59
+ if (CollectionUtils .isEmpty (systemStaticDatasourceIds )) {
60
+ return super .getAllMatchingPermissions (userId , nonSystemStaticDatasourceIds , resourceAction );
61
+ }
62
+ return super .getAllMatchingPermissions (userId , nonSystemStaticDatasourceIds , resourceAction )
63
+ .map (allMatchingPermissions -> {
64
+ Map <String , List <ResourcePermission >> result = Maps .newHashMap ();
65
+ Map <String , List <ResourcePermission >> systemStaticDatasourcePermissions = systemStaticDatasourceIds .stream ()
66
+ .collect (Collectors .toMap (Function .identity (), id -> getSystemStaticDatasourcePermission (userId , id )));
67
+ result .putAll (systemStaticDatasourcePermissions );
68
+ result .putAll (allMatchingPermissions );
69
+ return result ;
70
+ });
71
+ }
72
+
73
+ private List <ResourcePermission > getSystemStaticDatasourcePermission (String userId , String datasourceId ) {
74
+ return Collections .singletonList (ResourcePermission .builder ()
75
+ .resourceId (datasourceId )
76
+ .resourceType (ResourceType .DATASOURCE )
77
+ .resourceHolder (USER )
78
+ .resourceHolderId (userId )
79
+ .resourceRole (SYSTEM_STATIC_DATASOURCE_USER_ROLE )
80
+ .build ());
81
+ }
36
82
}
0 commit comments