From 608ce1d9910cd68ce825838ea313e02c598f908e Mon Sep 17 00:00:00 2001 From: Mica White Date: Mon, 8 Dec 2025 20:08:21 -0500 Subject: Stuff --- src/main.rs | 216 ++++++++++++++++++++++++++++++------------------------------ 1 file changed, 108 insertions(+), 108 deletions(-) (limited to 'src/main.rs') diff --git a/src/main.rs b/src/main.rs index e946161..e403798 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,108 +1,108 @@ -use std::time::Duration; - -use actix_web::http::header::{self, HeaderValue}; -use actix_web::middleware::{ErrorHandlerResponse, ErrorHandlers, Logger, NormalizePath}; -use actix_web::web::Data; -use actix_web::{dev, App, HttpServer}; - -use bpaf::Bpaf; -use exun::*; - -mod api; -mod models; -mod resources; -mod scopes; -mod services; - -use resources::*; -use services::*; -use sqlx::MySqlPool; - -fn error_content_language( - mut res: dev::ServiceResponse, -) -> actix_web::Result> { - res.response_mut() - .headers_mut() - .insert(header::CONTENT_LANGUAGE, HeaderValue::from_static("en")); - - Ok(ErrorHandlerResponse::Response(res.map_into_right_body())) -} - -async fn delete_expired_tokens(db: MySqlPool) { - let db = db.clone(); - let mut interval = actix_rt::time::interval(Duration::from_secs(60 * 20)); - loop { - interval.tick().await; - if let Err(e) = db::delete_expired_auth_codes(&db).await { - log::error!("{}", e); - } - if let Err(e) = db::delete_expired_access_tokens(&db).await { - log::error!("{}", e); - } - if let Err(e) = db::delete_expired_refresh_tokens(&db).await { - log::error!("{}", e); - } - } -} - -#[derive(Debug, Clone, Bpaf)] -#[bpaf(options, version)] -struct Opts { - /// The environment that the server is running in. Must be one of: local, - /// dev, staging, prod. - #[bpaf( - env("LOCKDAGGER_ENVIRONMENT"), - fallback(config::Environment::Local), - display_fallback - )] - env: config::Environment, -} - -#[actix_web::main] -async fn main() -> Result<(), RawUnexpected> { - // load the environment file, but only in debug mode - #[cfg(debug_assertions)] - dotenv::dotenv()?; - - let args = opts().run(); - config::set_environment(args.env); - - // initialize the database - let db_url = secrets::database_url()?; - let sql_pool = db::initialize(&db_url).await?; - - let tera = templates::initialize()?; - - let translations = languages::initialize()?; - - actix_rt::spawn(delete_expired_tokens(sql_pool.clone())); - - // start the server - HttpServer::new(move || { - App::new() - // middleware - .wrap(ErrorHandlers::new().default_handler(error_content_language)) - .wrap(NormalizePath::trim()) - .wrap(Logger::new("\"%r\" %s %Dms")) - // app shared state - .app_data(Data::new(sql_pool.clone())) - .app_data(Data::new(tera.clone())) - .app_data(Data::new(translations.clone())) - // frontend services - .service(style::get_css) - .service(scripts::get_js) - .service(languages::languages()) - // api services - .service(api::liveops()) - .service(api::users()) - .service(api::clients()) - .service(api::oauth()) - .service(api::ops()) - }) - .shutdown_timeout(1) - .bind(("127.0.0.1", 8080))? - .run() - .await?; - - Ok(()) -} +use std::time::Duration; + +use actix_web::http::header::{self, HeaderValue}; +use actix_web::middleware::{ErrorHandlerResponse, ErrorHandlers, Logger, NormalizePath}; +use actix_web::web::Data; +use actix_web::{dev, App, HttpServer}; + +use bpaf::Bpaf; +use exun::*; + +mod api; +mod models; +mod resources; +mod scopes; +mod services; + +use resources::*; +use services::*; +use sqlx::MySqlPool; + +fn error_content_language( + mut res: dev::ServiceResponse, +) -> actix_web::Result> { + res.response_mut() + .headers_mut() + .insert(header::CONTENT_LANGUAGE, HeaderValue::from_static("en")); + + Ok(ErrorHandlerResponse::Response(res.map_into_right_body())) +} + +async fn delete_expired_tokens(db: MySqlPool) { + let db = db.clone(); + let mut interval = actix_rt::time::interval(Duration::from_secs(60 * 20)); + loop { + interval.tick().await; + if let Err(e) = db::delete_expired_auth_codes(&db).await { + log::error!("{}", e); + } + if let Err(e) = db::delete_expired_access_tokens(&db).await { + log::error!("{}", e); + } + if let Err(e) = db::delete_expired_refresh_tokens(&db).await { + log::error!("{}", e); + } + } +} + +#[derive(Debug, Clone, Bpaf)] +#[bpaf(options, version)] +struct Opts { + /// The environment that the server is running in. Must be one of: local, + /// dev, staging, prod. + #[bpaf( + env("LOCKDAGGER_ENVIRONMENT"), + fallback(config::Environment::Local), + display_fallback + )] + env: config::Environment, +} + +#[actix_web::main] +async fn main() -> Result<(), RawUnexpected> { + // load the environment file, but only in debug mode + #[cfg(debug_assertions)] + dotenv::dotenv()?; + + let args = opts().run(); + config::set_environment(args.env); + + // initialize the database + let db_url = secrets::database_url()?; + let sql_pool = db::initialize(&db_url).await?; + + let tera = templates::initialize()?; + + let translations = languages::initialize()?; + + actix_rt::spawn(delete_expired_tokens(sql_pool.clone())); + + // start the server + HttpServer::new(move || { + App::new() + // middleware + .wrap(ErrorHandlers::new().default_handler(error_content_language)) + .wrap(NormalizePath::trim()) + .wrap(Logger::new("\"%r\" %s %Dms")) + // app shared state + .app_data(Data::new(sql_pool.clone())) + .app_data(Data::new(tera.clone())) + .app_data(Data::new(translations.clone())) + // frontend services + .service(style::get_css) + .service(scripts::get_js) + .service(languages::languages()) + // api services + .service(api::liveops()) + .service(api::users()) + .service(api::clients()) + .service(api::oauth()) + .service(api::ops()) + }) + .shutdown_timeout(1) + .bind(("127.0.0.1", 8080))? + .run() + .await?; + + Ok(()) +} -- cgit v1.2.3