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
    let mut role_scopes_user_param: HashMap<Method, RoleScopeType> = HashMap::new();
22
1948

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

            
74
1948
    Router::new().nest(
75
1948
        scope_path,
76
1948
        Router::new()
77
1948
            .route(
78
1948
                "/",
79
1948
                routing::post(api::post_client)
80
1948
                    .layer(AuthService::new(&state.model, role_scopes_root)),
81
1948
            )
82
1948
            .route(
83
1948
                "/count",
84
1948
                routing::get(api::get_client_count)
85
1948
                    .layer(AuthService::new(&state.model, role_scopes_count)),
86
1948
            )
87
1948
            .route(
88
1948
                "/list",
89
1948
                routing::get(api::get_client_list)
90
1948
                    .layer(AuthService::new(&state.model, role_scopes_list)),
91
1948
            )
92
1948
            .route(
93
1948
                "/{client_id}",
94
1948
                routing::get(api::get_client)
95
1948
                    .patch(api::patch_client)
96
1948
                    .delete(api::delete_client)
97
1948
                    .layer(AuthService::new(&state.model, role_scopes_param)),
98
1948
            )
99
1948
            .route(
100
1948
                "/user/{user_id}",
101
1948
                routing::delete(api::delete_client_user)
102
1948
                    .layer(AuthService::new(&state.model, role_scopes_user_param)),
103
1948
            )
104
1948
            .with_state(state.clone()),
105
1948
    )
106
1948
}