1
use std::collections::HashMap;
2

            
3
use axum::{http::Method, routing, Router};
4

            
5
use sylvia_iot_corelib::role::Role;
6

            
7
use super::super::{
8
    oauth2::middleware::{AuthService, RoleScopeType},
9
    State,
10
};
11

            
12
mod api;
13
mod request;
14
mod response;
15

            
16
1948
pub fn new_service(scope_path: &str, state: &State) -> Router {
17
1948
    let mut role_scopes_root: HashMap<Method, RoleScopeType> = HashMap::new();
18
1948
    let mut role_scopes_count: HashMap<Method, RoleScopeType> = HashMap::new();
19
1948
    let mut role_scopes_list: HashMap<Method, RoleScopeType> = HashMap::new();
20
1948
    let mut role_scopes_param: HashMap<Method, RoleScopeType> = HashMap::new();
21
1948

            
22
1948
    match state.api_scopes.get("user.get") {
23
1946
        None => {
24
1946
            role_scopes_root.insert(Method::GET, (vec![], vec![]));
25
1946
        }
26
2
        Some(scopes) => {
27
2
            role_scopes_root.insert(Method::GET, (vec![], scopes.clone()));
28
2
        }
29
    }
30
1948
    match state.api_scopes.get("user.patch") {
31
1946
        None => {
32
1946
            role_scopes_root.insert(Method::PATCH, (vec![], vec![]));
33
1946
        }
34
2
        Some(scopes) => {
35
2
            role_scopes_root.insert(Method::PATCH, (vec![], scopes.clone()));
36
2
        }
37
    }
38
1948
    match state.api_scopes.get("user.post.admin") {
39
1946
        None => {
40
1946
            role_scopes_root.insert(Method::POST, (vec![Role::ADMIN], vec![]));
41
1946
        }
42
2
        Some(scopes) => {
43
2
            role_scopes_root.insert(Method::POST, (vec![Role::ADMIN], scopes.clone()));
44
2
        }
45
    }
46
1948
    match state.api_scopes.get("user.get.admin") {
47
1946
        None => {
48
1946
            role_scopes_count.insert(Method::GET, (vec![Role::ADMIN, Role::MANAGER], vec![]));
49
1946
            role_scopes_list.insert(Method::GET, (vec![Role::ADMIN, Role::MANAGER], vec![]));
50
1946
            role_scopes_param.insert(Method::GET, (vec![Role::ADMIN, Role::MANAGER], vec![]));
51
1946
        }
52
2
        Some(scopes) => {
53
2
            role_scopes_count.insert(
54
2
                Method::GET,
55
2
                (vec![Role::ADMIN, Role::MANAGER], scopes.clone()),
56
2
            );
57
2
            role_scopes_list.insert(
58
2
                Method::GET,
59
2
                (vec![Role::ADMIN, Role::MANAGER], scopes.clone()),
60
2
            );
61
2
            role_scopes_param.insert(
62
2
                Method::GET,
63
2
                (vec![Role::ADMIN, Role::MANAGER], scopes.clone()),
64
2
            );
65
2
        }
66
    }
67
1948
    match state.api_scopes.get("user.patch.admin") {
68
1946
        None => {
69
1946
            role_scopes_param.insert(Method::PATCH, (vec![Role::ADMIN, Role::MANAGER], vec![]));
70
1946
        }
71
2
        Some(scopes) => {
72
2
            role_scopes_param.insert(
73
2
                Method::PATCH,
74
2
                (vec![Role::ADMIN, Role::MANAGER], scopes.clone()),
75
2
            );
76
2
        }
77
    }
78
1948
    match state.api_scopes.get("user.delete.admin") {
79
1946
        None => {
80
1946
            role_scopes_param.insert(Method::DELETE, (vec![Role::ADMIN], vec![]));
81
1946
        }
82
2
        Some(scopes) => {
83
2
            role_scopes_param.insert(Method::DELETE, (vec![Role::ADMIN], scopes.clone()));
84
2
        }
85
    }
86

            
87
1948
    Router::new().nest(
88
1948
        scope_path,
89
1948
        Router::new()
90
1948
            .route(
91
1948
                "/",
92
1948
                routing::get(api::get_user)
93
1948
                    .patch(api::patch_user)
94
1948
                    .post(api::post_admin_user)
95
1948
                    .layer(AuthService::new(&state.model, role_scopes_root)),
96
1948
            )
97
1948
            .route(
98
1948
                "/count",
99
1948
                routing::get(api::get_admin_user_count)
100
1948
                    .layer(AuthService::new(&state.model, role_scopes_count)),
101
1948
            )
102
1948
            .route(
103
1948
                "/list",
104
1948
                routing::get(api::get_admin_user_list)
105
1948
                    .layer(AuthService::new(&state.model, role_scopes_list)),
106
1948
            )
107
1948
            .route(
108
1948
                "/{user_id}",
109
1948
                routing::get(api::get_admin_user)
110
1948
                    .patch(api::patch_admin_user)
111
1948
                    .delete(api::delete_admin_user)
112
1948
                    .layer(AuthService::new(&state.model, role_scopes_param)),
113
1948
            )
114
1948
            .with_state(state.clone()),
115
1948
    )
116
1948
}