1
use std::sync::Arc;
2

            
3
use axum::{
4
    Router, middleware,
5
    routing::{get, post},
6
};
7

            
8
use crate::{
9
    AppState,
10
    files::download_file,
11
    handler::{
12
        get_home_link, get_logout_link, get_me_handler, get_version, login_user_handler,
13
        logout_handler, refresh_access_token_handler, register_user_handler,
14
    },
15
    jwt_auth::{admin, auth},
16
    pages::{account, commodity, file_table, tag},
17
    redirect_middleware::redirect_on_auth_error,
18
};
19

            
20
2
pub fn create_pages_router(app_state: Arc<AppState>) -> Router<Arc<AppState>> {
21
2
    Router::new()
22
2
        .route(
23
2
            "/commodity/create",
24
2
            get(crate::pages::commodity::create::submit::commodity_create_page),
25
        )
26
2
        .route(
27
2
            "/commodity/list",
28
2
            get(crate::pages::commodity::list::commodity_list_page),
29
        )
30
2
        .route_layer(middleware::from_fn_with_state(app_state.clone(), auth))
31
2
        .route_layer(middleware::from_fn(redirect_on_auth_error))
32
2
        .with_state(app_state.clone())
33
2
}
34

            
35
2
pub fn create_accounts_router(app_state: Arc<AppState>) -> Router<Arc<AppState>> {
36
2
    Router::new()
37
2
        .route(
38
2
            "/account/create",
39
2
            get(crate::pages::account::create::submit::account_create_page),
40
        )
41
2
        .route(
42
2
            "/account/list",
43
2
            get(crate::pages::account::list::account_list_page),
44
        )
45
2
        .route_layer(middleware::from_fn_with_state(app_state.clone(), auth))
46
2
        .route_layer(middleware::from_fn(redirect_on_auth_error))
47
2
        .with_state(app_state.clone())
48
2
}
49

            
50
2
pub fn create_transactions_router(app_state: Arc<AppState>) -> Router<Arc<AppState>> {
51
2
    Router::new()
52
2
        .route(
53
2
            "/transaction/create",
54
2
            get(crate::pages::transaction::create::submit::transaction_create_page),
55
        )
56
2
        .route(
57
2
            "/transaction/list",
58
2
            get(crate::pages::transaction::list::transaction_list_page),
59
        )
60
2
        .route(
61
2
            "/transaction/edit/{id}",
62
2
            get(crate::pages::transaction::edit::submit::transaction_edit_page),
63
        )
64
2
        .route_layer(middleware::from_fn_with_state(app_state.clone(), auth))
65
2
        .route_layer(middleware::from_fn(redirect_on_auth_error))
66
2
        .with_state(app_state.clone())
67
2
}
68

            
69
pub fn create_tags_router(app_state: Arc<AppState>) -> Router<Arc<AppState>> {
70
    Router::new()
71
        .route(
72
            "/tag/create",
73
            get(crate::pages::tag::create::tag_create_page),
74
        )
75
        .route("/tag/list", get(crate::pages::tag::list::tag_list_page))
76
        .route(
77
            "/tag/edit/{id}",
78
            get(crate::pages::tag::edit::tag_edit_page),
79
        )
80
        .route_layer(middleware::from_fn_with_state(app_state.clone(), auth))
81
        .route_layer(middleware::from_fn(redirect_on_auth_error))
82
        .with_state(app_state.clone())
83
}
84

            
85
6
pub fn create_api_router(app_state: Arc<AppState>) -> Router<Arc<AppState>> {
86
6
    let public_router = Router::new()
87
6
        .route("/auth/login", post(login_user_handler))
88
6
        .route("/version", get(get_version));
89

            
90
6
    let auth_router = Router::new()
91
6
        .route("/auth/refresh", get(refresh_access_token_handler))
92
6
        .route("/files/list", get(file_table))
93
6
        .route("/files/download/{file_name}", get(download_file))
94
6
        .route("/auth/logout", get(logout_handler))
95
6
        .route("/users/me", get(get_me_handler))
96
6
        .route("/htmx/logoutlink", get(get_logout_link))
97
6
        .route_layer(middleware::from_fn_with_state(app_state.clone(), auth))
98
6
        .with_state(app_state.clone());
99

            
100
6
    let account_router = Router::new()
101
6
        .route("/account/list", get(account::list::account_table))
102
6
        .route("/account/info", get(account::list::account_info))
103
6
        .route("/account/search", post(account::search::search_accounts))
104
6
        .route(
105
6
            "/account/create/submit",
106
6
            post(account::create::submit::create_account),
107
        )
108
6
        .route(
109
6
            "/account/create/validate/name",
110
6
            post(account::create::validate::validate_name),
111
        )
112
6
        .route_layer(middleware::from_fn_with_state(app_state.clone(), auth))
113
6
        .with_state(app_state.clone());
114

            
115
6
    let nav_router = Router::new()
116
6
        .route("/nav/home", get(get_home_link))
117
6
        .route_layer(middleware::from_fn_with_state(app_state.clone(), auth))
118
6
        .with_state(app_state.clone());
119

            
120
6
    let commodity_router = Router::new()
121
6
        .route("/commodity/list", get(commodity::list::commodity_table))
122
6
        .route(
123
6
            "/commodity/search",
124
6
            post(commodity::search::search_commodities),
125
        )
126
6
        .route(
127
6
            "/commodity/create/submit",
128
6
            post(commodity::create::submit::commodity_submit),
129
        )
130
6
        .route(
131
6
            "/commodity/create/validate/fraction",
132
6
            post(commodity::create::validate::validate_fraction),
133
        )
134
6
        .route(
135
6
            "/commodity/create/validate/symbol",
136
6
            post(commodity::create::validate::validate_symbol),
137
        )
138
6
        .route(
139
6
            "/commodity/create/validate/name",
140
6
            post(commodity::create::validate::validate_name),
141
        )
142
6
        .route_layer(middleware::from_fn_with_state(app_state.clone(), auth))
143
6
        .with_state(app_state.clone());
144

            
145
6
    let transaction_router = Router::new()
146
6
        .route(
147
6
            "/transaction/list",
148
6
            get(crate::pages::transaction::list::transaction_table),
149
        )
150
6
        .route(
151
6
            "/transaction/split/create",
152
6
            get(crate::pages::transaction::create::split::split_create_handler),
153
        )
154
6
        .route(
155
6
            "/transaction/create/submit",
156
6
            post(crate::pages::transaction::create::submit::transaction_submit),
157
        )
158
6
        .route(
159
6
            "/transaction/create/validate/amount",
160
6
            post(crate::pages::transaction::validate::validate_amount_html),
161
        )
162
6
        .route(
163
6
            "/transaction/create/validate/from_account",
164
6
            post(crate::pages::transaction::validate::validate_from_account_html),
165
        )
166
6
        .route(
167
6
            "/transaction/create/validate/to_account",
168
6
            post(crate::pages::transaction::validate::validate_to_account_html),
169
        )
170
6
        .route(
171
6
            "/transaction/create/validate/note",
172
6
            post(crate::pages::transaction::validate::validate_note_html),
173
        )
174
6
        .route(
175
6
            "/transaction/edit/submit",
176
6
            post(crate::pages::transaction::edit::submit::transaction_edit_submit),
177
        )
178
6
        .route(
179
6
            "/transaction/edit/validate/amount",
180
6
            post(crate::pages::transaction::validate::validate_amount_json),
181
        )
182
6
        .route(
183
6
            "/transaction/edit/validate/from_account",
184
6
            post(crate::pages::transaction::validate::validate_from_account_json),
185
        )
186
6
        .route(
187
6
            "/transaction/edit/validate/to_account",
188
6
            post(crate::pages::transaction::validate::validate_to_account_json),
189
        )
190
6
        .route(
191
6
            "/transaction/edit/validate/note",
192
6
            post(crate::pages::transaction::validate::validate_note_json),
193
        )
194
6
        .route(
195
6
            "/transaction/delete/{id}",
196
6
            post(crate::pages::transaction::delete::submit::transaction_delete_submit),
197
        )
198
6
        .route_layer(middleware::from_fn_with_state(app_state.clone(), auth))
199
6
        .with_state(app_state.clone());
200

            
201
6
    let tag_router = Router::new()
202
6
        .route("/tag/list", get(tag::list::tag_table))
203
6
        .route("/tag/create/submit", post(tag::create::create_tag))
204
6
        .route(
205
6
            "/transaction/{id}/tag/create/submit",
206
6
            post(tag::create::create_transaction_tag),
207
        )
208
6
        .route(
209
6
            "/split/{id}/tag/create/submit",
210
6
            post(tag::create::create_split_tag),
211
        )
212
6
        .route("/tag/edit/submit", post(tag::edit::edit_tag))
213
6
        .route("/tag/delete/{id}", post(tag::edit::delete_tag))
214
6
        .route(
215
6
            "/tags/transaction/names",
216
6
            get(tag::autocomplete::transaction_tag_names),
217
        )
218
6
        .route(
219
6
            "/tags/transaction/values",
220
6
            get(tag::autocomplete::transaction_tag_values),
221
        )
222
6
        .route("/tags/split/names", get(tag::autocomplete::split_tag_names))
223
6
        .route(
224
6
            "/tags/split/values",
225
6
            get(tag::autocomplete::split_tag_values),
226
        )
227
6
        .route_layer(middleware::from_fn_with_state(app_state.clone(), auth))
228
6
        .with_state(app_state.clone());
229

            
230
6
    let admin_router = Router::new()
231
6
        .route("/auth/register", post(register_user_handler))
232
6
        .route_layer(middleware::from_fn_with_state(app_state.clone(), admin))
233
6
        .route_layer(middleware::from_fn_with_state(app_state, auth));
234

            
235
6
    Router::new()
236
6
        .merge(public_router)
237
6
        .merge(nav_router)
238
6
        .merge(auth_router)
239
6
        .merge(account_router)
240
6
        .merge(commodity_router)
241
6
        .merge(transaction_router)
242
6
        .merge(tag_router)
243
6
        .merge(admin_router)
244
6
}