shoutdotdev/src/main.rs

90 lines
2.3 KiB
Rust
Raw Normal View History

2025-02-26 13:10:50 -08:00
mod api_keys;
mod app_error;
mod app_state;
mod auth;
2025-02-26 13:10:45 -08:00
mod channel_selections;
mod channels;
2025-02-26 13:10:50 -08:00
mod csrf;
2025-02-26 13:10:43 -08:00
mod email;
2025-02-26 13:10:48 -08:00
mod guards;
2025-02-26 13:10:47 -08:00
mod messages;
2025-02-26 13:10:46 -08:00
mod nav_state;
2025-02-26 13:10:50 -08:00
mod projects;
mod router;
mod schema;
mod sessions;
mod settings;
2025-02-26 13:10:48 -08:00
mod team_memberships;
mod teams;
2025-02-26 13:10:50 -08:00
mod users;
2025-02-26 13:10:47 -08:00
mod v0_router;
2025-02-26 13:10:50 -08:00
2025-02-26 13:10:43 -08:00
use std::process::exit;
use email::SmtpOptions;
2025-02-26 13:10:50 -08:00
use tracing_subscriber::EnvFilter;
2025-02-26 13:10:45 -08:00
use crate::{
2025-02-26 13:10:43 -08:00
app_state::AppState, email::Mailer, router::new_router, sessions::PgStore, settings::Settings,
2025-02-26 13:10:45 -08:00
};
2025-02-26 13:10:50 -08:00
#[tokio::main]
async fn main() {
let settings = Settings::load().unwrap();
tracing_subscriber::fmt()
.with_env_filter(EnvFilter::from_default_env())
.init();
let database_url = settings.database_url.clone();
let manager =
deadpool_diesel::postgres::Manager::new(database_url, deadpool_diesel::Runtime::Tokio1);
let db_pool = deadpool_diesel::postgres::Pool::builder(manager)
.build()
.unwrap();
let session_store = PgStore::new(db_pool.clone());
2025-02-26 13:10:45 -08:00
let reqwest_client = reqwest::ClientBuilder::new()
.https_only(true)
.build()
.unwrap();
2025-02-26 13:10:50 -08:00
let oauth_client = auth::new_oauth_client(&settings).unwrap();
2025-02-26 13:10:45 -08:00
2025-02-26 13:10:43 -08:00
let mailer = if let Some(smtp_settings) = settings.email.smtp.clone() {
Mailer::new_smtp(SmtpOptions {
server: smtp_settings.server,
username: smtp_settings.username,
password: smtp_settings.password,
})
.unwrap()
} else if let Some(postmark_settings) = settings.email.postmark.clone() {
Mailer::new_postmark(postmark_settings.server_token)
.unwrap()
.with_reqwest_client(reqwest_client.clone())
} else {
tracing::error!("no email backend settings configured");
exit(1);
};
2025-02-26 13:10:50 -08:00
let app_state = AppState {
db_pool,
2025-02-26 13:10:45 -08:00
mailer,
2025-02-26 13:10:50 -08:00
oauth_client,
2025-02-26 13:10:45 -08:00
reqwest_client,
2025-02-26 13:10:50 -08:00
session_store,
settings: settings.clone(),
};
let router = new_router(app_state);
2025-02-26 13:10:45 -08:00
let listener = tokio::net::TcpListener::bind((settings.host.clone(), settings.port.clone()))
2025-02-26 13:10:50 -08:00
.await
.unwrap();
2025-02-26 13:10:45 -08:00
tracing::info!(
"App running at http://{}:{}{}",
settings.host,
settings.port,
settings.base_path
);
2025-02-26 13:10:50 -08:00
axum::serve(listener, router).await.unwrap();
}