use crate::configs::{ServerConfig, cors_config, init_tracing, routes_config};
use crate::handlers::page_not_found;
use crate::models::AppState;
use crate::utils::init_check_env;
use actix_web::{App, HttpServer, dev::Server, middleware::Logger, web};
use tracing::info;
use tracing_actix_web::TracingLogger;
#[derive(Clone, Default)]
pub struct Pipey;
impl Pipey {
pub async fn run_server() -> Result<(Server, web::Data<AppState>), std::io::Error> {
dotenvy::dotenv().ok();
init_tracing();
init_check_env();
let redis_url = std::env::var("REDIS_URL").expect("Missing env variable REDIS_URL");
let node_id = std::env::var("SERVER_NODE_ID").expect("Missing env variable SERVER_NODE_ID");
let server_cfg = ServerConfig::from_env();
let app_state = web::Data::new(AppState::new(&node_id, &redis_url).await);
let server = HttpServer::new({
let app_state = app_state.clone();
move || {
App::new()
.app_data(app_state.clone())
.wrap(cors_config())
.wrap(Logger::new("%r\" %s %b %Dms \"%{User-Agent}i\""))
.wrap(TracingLogger::default())
.configure(routes_config)
.default_service(web::route().to(page_not_found))
}
})
.bind((server_cfg.host.clone(), server_cfg.port))?
.run();
info!(host = %server_cfg.host, port = server_cfg.port, "server starting");
Ok((server, app_state))
}
}