54 lines
1.3 KiB
Rust
54 lines
1.3 KiB
Rust
use std::{error::Error, sync::Arc};
|
|
|
|
use axum::Router;
|
|
use sqlx::PgPool;
|
|
use tokio::{net::TcpListener, sync::RwLock};
|
|
|
|
use crate::config::MnemoConf;
|
|
|
|
mod api;
|
|
mod config;
|
|
mod database;
|
|
mod error;
|
|
mod logs;
|
|
mod persons;
|
|
mod quotes;
|
|
mod tags;
|
|
mod users;
|
|
mod web;
|
|
|
|
/// The string to be returned alongside HTTP 500
|
|
const ISE_MSG: &str = "Internal server error";
|
|
|
|
#[derive(Debug, Clone)]
|
|
pub struct MnemoState {
|
|
pool: PgPool,
|
|
conf: Arc<RwLock<MnemoConf>>,
|
|
}
|
|
|
|
#[tokio::main]
|
|
async fn main() -> Result<(), Box<dyn Error>> {
|
|
config::dotenv()?;
|
|
config::env_logger()?;
|
|
|
|
let pool = config::init_pool().await?;
|
|
sqlx::migrate!("src/database/migrations").run(&pool).await?;
|
|
log::info!("Migrations applied successfully.");
|
|
let conf = Arc::new(RwLock::new(
|
|
MnemoConf::load(&mut *pool.acquire().await?).await?,
|
|
));
|
|
users::auth::init_password_dummies();
|
|
users::setup::initialise_reserved_users_if_needed(&pool).await?;
|
|
|
|
let port = config::port()?;
|
|
let r = Router::new()
|
|
.merge(api::api_router())
|
|
.merge(web::web_router())
|
|
.with_state(MnemoState { pool, conf });
|
|
let l = TcpListener::bind(format!("0.0.0.0:{port}")).await?;
|
|
log::info!("Listener bound to {}", l.local_addr()?);
|
|
|
|
axum::serve(l, r).await?;
|
|
Ok(())
|
|
}
|