2024-11-28 11:47:00 +00:00
|
|
|
pub mod controllers;
|
|
|
|
pub mod router;
|
|
|
|
pub mod services;
|
|
|
|
pub mod middlewares;
|
|
|
|
pub mod renderer;
|
|
|
|
pub mod token_claims;
|
|
|
|
|
2024-10-15 10:10:46 +00:00
|
|
|
use fully_pub::fully_pub;
|
2024-11-02 16:37:57 +00:00
|
|
|
use anyhow::{Result, Context};
|
2024-11-28 11:47:00 +00:00
|
|
|
use kernel::{context::AppSecrets, models::config::Config, repositories::storage::Storage};
|
2024-10-15 10:10:46 +00:00
|
|
|
use log::info;
|
2024-11-28 11:47:00 +00:00
|
|
|
use minijinja::Environment;
|
2024-10-10 16:20:06 +00:00
|
|
|
|
2024-11-28 11:47:00 +00:00
|
|
|
use crate::{
|
|
|
|
router::build_router,
|
|
|
|
renderer::build_templating_env
|
|
|
|
};
|
2024-10-10 16:20:06 +00:00
|
|
|
|
2024-11-28 11:47:00 +00:00
|
|
|
pub const WEB_GUI_JWT_COOKIE_NAME: &str = "minauthator_jwt";
|
2024-10-10 16:20:06 +00:00
|
|
|
|
2024-10-15 10:10:46 +00:00
|
|
|
#[derive(Debug)]
|
|
|
|
#[fully_pub]
|
|
|
|
/// HTTP server arguments
|
|
|
|
pub struct ServerConfig {
|
|
|
|
listen_host: String,
|
|
|
|
listen_port: u32,
|
|
|
|
assets_path: String
|
|
|
|
}
|
|
|
|
|
|
|
|
#[derive(Debug, Clone)]
|
|
|
|
#[fully_pub]
|
|
|
|
pub struct AppState {
|
2024-10-20 22:05:20 +00:00
|
|
|
secrets: AppSecrets,
|
2024-10-15 10:10:46 +00:00
|
|
|
config: Config,
|
2024-11-28 11:47:00 +00:00
|
|
|
db: Storage,
|
2024-10-15 10:10:46 +00:00
|
|
|
templating_env: Environment<'static>
|
|
|
|
}
|
|
|
|
|
2024-10-20 22:05:20 +00:00
|
|
|
pub async fn start_http_server(
|
|
|
|
server_config: ServerConfig,
|
|
|
|
config: Config,
|
|
|
|
secrets: AppSecrets,
|
2024-11-28 11:47:00 +00:00
|
|
|
db_pool: Storage
|
2024-10-20 22:05:20 +00:00
|
|
|
) -> Result<()> {
|
2024-10-15 10:10:46 +00:00
|
|
|
// build state
|
|
|
|
let state = AppState {
|
|
|
|
templating_env: build_templating_env(&config),
|
|
|
|
config,
|
2024-10-20 22:05:20 +00:00
|
|
|
secrets,
|
2024-10-15 10:10:46 +00:00
|
|
|
db: db_pool
|
|
|
|
};
|
|
|
|
|
|
|
|
// build routes
|
2024-10-20 22:05:20 +00:00
|
|
|
let services = build_router(
|
|
|
|
&server_config,
|
|
|
|
state.clone()
|
|
|
|
)
|
2024-10-15 10:10:46 +00:00
|
|
|
.with_state(state);
|
|
|
|
|
|
|
|
let listen_addr = format!("{}:{}", server_config.listen_host, server_config.listen_port);
|
|
|
|
info!("Starting web server on http://{}", &listen_addr);
|
|
|
|
let listener = tokio::net::TcpListener::bind(listen_addr).await.unwrap();
|
|
|
|
|
|
|
|
axum::serve(listener, services).await.context("Axum serve")?;
|
|
|
|
|
|
|
|
Ok(())
|
|
|
|
}
|