13
13
// limitations under the License.
14
14
15
15
use databend_common_exception:: Result ;
16
- use databend_common_users:: UserApiProvider ;
17
16
use poem:: error:: InternalServerError ;
18
17
use poem:: error:: Result as PoemResult ;
19
18
use poem:: web:: Json ;
@@ -23,6 +22,8 @@ use serde::Serialize;
23
22
24
23
use crate :: servers:: http:: v1:: HttpQueryContext ;
25
24
25
+ const PUBLIC_ROLE : & str = "public" ;
26
+
26
27
#[ derive( Serialize , Deserialize , Debug , Clone ) ]
27
28
pub struct ListRolesResponse {
28
29
pub roles : Vec < RoleInfo > ,
@@ -35,47 +36,34 @@ pub struct RoleInfo {
35
36
pub is_default : bool ,
36
37
}
37
38
39
+ /// same as `show_roles` in
40
+ /// src/query/service/src/table_functions/show_roles/show_roles_table.rs
38
41
#[ async_backtrace:: framed]
39
42
async fn handle ( ctx : & HttpQueryContext ) -> Result < ListRolesResponse > {
40
- let user = ctx. session . get_current_user ( ) ?;
43
+ let mut all_roles = ctx. session . get_all_available_roles ( ) . await ?;
44
+ all_roles. sort_by ( |a, b| a. name . cmp ( & b. name ) ) ;
45
+ let current_user = ctx. session . get_current_user ( ) ?;
41
46
let current_role = ctx
42
47
. session
43
48
. get_current_role ( )
44
- . map_or ( "public" . to_string ( ) , |role| role. name ) ;
45
- let default_role = user
49
+ . map_or ( PUBLIC_ROLE . to_string ( ) , |role| role. name ) ;
50
+ let default_role = current_user
46
51
. option
47
52
. default_role ( )
48
- . map_or ( "public" . to_string ( ) , |role| role. to_string ( ) ) ;
53
+ . map_or ( PUBLIC_ROLE . to_string ( ) , |role| role. to_string ( ) ) ;
49
54
let mut roles = vec ! [ ] ;
50
- if user. is_account_admin ( ) {
51
- // return all roles for account admin
52
- let user_api = UserApiProvider :: instance ( ) ;
53
- let all_roles = user_api
54
- . get_roles ( & ctx. session . get_current_tenant ( ) )
55
- . await ?;
56
- for role in all_roles {
57
- let is_current = role. name == current_role;
58
- let is_default = role. name == default_role;
59
- roles. push ( RoleInfo {
60
- name : role. name ,
61
- is_current,
62
- is_default,
63
- } ) ;
64
- }
65
- } else {
66
- for role in user. grants . roles ( ) {
67
- let is_current = role == current_role;
68
- let is_default = role == default_role;
69
- roles. push ( RoleInfo {
70
- name : role. clone ( ) ,
71
- is_current,
72
- is_default,
73
- } ) ;
74
- }
55
+ for role in all_roles {
56
+ let is_current = role. name == current_role;
57
+ let is_default = role. name == default_role;
58
+ roles. push ( RoleInfo {
59
+ name : role. name ,
60
+ is_current,
61
+ is_default,
62
+ } ) ;
75
63
}
76
64
if roles. is_empty ( ) {
77
65
roles. push ( RoleInfo {
78
- name : "public" . to_string ( ) ,
66
+ name : PUBLIC_ROLE . to_string ( ) ,
79
67
is_current : true ,
80
68
is_default : true ,
81
69
} ) ;
0 commit comments