#[macro_use] extern crate rocket; mod db; mod guards; mod models; mod routes; use std::collections::HashSet; use aws_config::BehaviorVersion; use aws_credential_types::Credentials; use aws_sdk_s3::config::RequestChecksumCalculation; use aws_sdk_s3::Client; use rand::RngExt; use rocket_dyn_templates::Template; use models::AdminConsoleKey; #[derive(Clone, Debug)] pub struct AllowedExtensions(pub HashSet); #[launch] async fn rocket() -> _ { dotenvy::dotenv().ok(); let endpoint = std::env::var("MINIO_ENDPOINT").expect("MINIO_ENDPOINT missing"); let access_key = std::env::var("MINIO_ACCESS_KEY").expect("MINIO_ACCESS_KEY missing"); let secret_key = std::env::var("MINIO_SECRET_KEY").expect("MINIO_SECRET_KEY missing"); let region = std::env::var("MINIO_REGION").unwrap_or_else(|_| "us-east-1".to_string()); let allowed_bucket = std::env::var("ALLOWED_BUCKET").expect("ALLOWED_BUCKET missing"); let allowed_ext_str = std::env::var("ALLOWED_EXTENSIONS") .unwrap_or_else(|_| "jpg,jpeg,png,gif,webp".to_string()); let allowed_extensions: HashSet = allowed_ext_str .split(',') .map(|s| s.trim().to_lowercase()) .filter(|s| !s.is_empty()) .collect(); let db_pool = db::init_db(); let mut random_bytes = [0u8; 16]; rand::rng().fill(&mut random_bytes); let console_admin_key = hex::encode(random_bytes); println!("\n=================================================================="); println!("key: {}", console_admin_key); println!("Panel located at /admin?key={}", console_admin_key); println!("==================================================================\n"); let credentials = Credentials::new(access_key, secret_key, None, None, "static"); let s3_config = aws_sdk_s3::Config::builder() .behavior_version(BehaviorVersion::latest()) .endpoint_url(endpoint) .credentials_provider(credentials) .region(aws_sdk_s3::config::Region::new(region)) .force_path_style(true) .request_checksum_calculation(RequestChecksumCalculation::WhenRequired) .build(); let client = Client::from_conf(s3_config); rocket::build() .manage(client) .manage(allowed_bucket) .manage(AllowedExtensions(allowed_extensions)) .manage(db_pool) .manage(AdminConsoleKey(console_admin_key)) .attach(Template::fairing()) .mount( "/", routes![ routes::i::get_asset, routes::upload::upload_asset, routes::admin::index::admin_dashboard, routes::admin::keys::create::create_key, routes::admin::keys::revoke::revoke_key, ], ) }