debt-pirate/api/src/requests/mod.rs

74 lines
1.6 KiB
Rust
Raw Normal View History

mod user;
2024-08-22 17:29:24 -04:00
use std::sync::Arc;
use axum::Router;
use tokio::net::TcpListener;
2024-08-24 13:22:51 -04:00
use webauthn_rs::prelude::*;
2024-08-24 13:22:51 -04:00
use crate::{
db::DbPool,
models::{AppError, Environment},
};
#[derive(Clone)]
pub struct AppState {
pool: DbPool,
env: Environment,
2024-08-22 17:29:24 -04:00
webauthn: Arc<Webauthn>,
}
impl AppState {
pub fn new(pool: DbPool, env: Environment) -> Self {
2024-08-24 13:22:51 -04:00
let rp_id = env.rp_id();
let rp_origin = env
.domain()
.parse::<Url>()
.expect("RP_ORIGIN must be in a valid domain name format");
2024-08-22 17:29:24 -04:00
2024-08-24 13:22:51 -04:00
let webauthn = Arc::new(
WebauthnBuilder::new(rp_id, &rp_origin)
.map(|builder| builder.allow_any_port(true))
.and_then(WebauthnBuilder::build)
.inspect_err(|err| eprintln!("{err}"))
.expect("Unable to build authenticator"),
);
Self {
pool,
env,
webauthn,
}
}
pub fn pool(&self) -> &DbPool {
&self.pool
}
pub fn env(&self) -> &Environment {
&self.env
}
2024-08-24 13:22:51 -04:00
pub fn webauthn(&self) -> Arc<Webauthn> {
Arc::clone(&self.webauthn)
}
}
pub async fn start_app(pool: DbPool, env: Environment) -> Result<(), AppError> {
2024-08-22 17:29:24 -04:00
let address = env.hostname();
let port = env.port();
let listener = TcpListener::bind(format!("{address}:{port}"))
.await
.unwrap();
let app_state = AppState::new(pool, env);
let app = Router::new().merge(user::requests(app_state.clone()));
axum::serve(listener, app)
.await
.map_err(AppError::app_startup)?;
println!("Application started successfully.");
Ok(())
}