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