1use std::sync::Arc;
2
3use axum::{Extension, Router};
4
5#[cfg(any(feature = "log", feature = "auth"))]
6use axum::middleware::from_fn;
7#[cfg(feature = "auth")]
8use server_common::jwt::JwtService;
9use server_config::app::AppConfig;
10use server_database::connect_db;
11#[cfg(feature = "auth")]
12use server_middleware::middleware::auth::auth_middleware;
13#[cfg(feature = "log")]
14use server_middleware::middleware::log::logging_middleware;
15use tokio::net::TcpListener;
16#[cfg(feature = "log")]
17use trace_log::{LogLevel, init_logger};
18use tracing::info;
19
20pub async fn start(app: Router) {
23 let config = AppConfig::from_env().unwrap();
25 let server_name = &config.server_name;
27 let server_host = &config.server_host;
29 let server_port = &config.server_port;
31 let database_config = &config.database;
33
34 let pg_pool = connect_db(database_config).await.unwrap();
35
36 #[cfg(feature = "log")]
37 let _wg = match &config.log {
38 Some(data) => {
39 let level = match &data.level.parse::<LogLevel>() {
40 Ok(level) => level.clone(),
41 Err(_) => LogLevel::Debug,
42 };
43 let wg = init_logger(level);
44 Some(wg)
45 }
46 None => None,
47 };
48
49 #[cfg(feature = "auth")]
52 let app = match &config.jwt {
54 Some(_) => app.layer(from_fn(auth_middleware)),
55 None => app,
56 };
57
58 #[cfg(feature = "log")]
59 let app = match &config.log {
61 Some(data) if data.http => app.layer(from_fn(logging_middleware)),
62 _ => app,
63 };
64
65 #[cfg(feature = "auth")]
66 let app = match &config.jwt {
68 Some(data) => {
69 let jwt_service = JwtService::new(data.clone());
70 app.layer(Extension(Arc::new(jwt_service)))
71 }
72 None => app,
73 };
74
75 let app = app.layer(Extension(Arc::new(pg_pool)));
77
78 let app = app.layer(Extension(Arc::new(config.clone())));
80
81 info!(
83 "Starting {}: http://{}:{}",
84 server_name, server_host, server_port
85 );
86
87 let listener = TcpListener::bind(format!("{}:{}", server_host, server_port))
89 .await
90 .unwrap();
91 axum::serve(listener, app).await.unwrap();
93}