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

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

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