42 lines
1.1 KiB
Rust
42 lines
1.1 KiB
Rust
use axum::Router;
|
|
use dotenvy::dotenv;
|
|
use std::net::SocketAddr;
|
|
|
|
mod api;
|
|
mod core;
|
|
mod db;
|
|
mod errors;
|
|
mod schemas;
|
|
mod services;
|
|
mod utils;
|
|
|
|
use crate::core::config::Config;
|
|
|
|
#[tokio::main]
|
|
async fn main() -> anyhow::Result<()> {
|
|
dotenv().ok();
|
|
tracing_subscriber::fmt::init();
|
|
|
|
let config = Config::from_env()?;
|
|
|
|
// Initialize DB
|
|
let db = db::connect(&config).await?;
|
|
|
|
// Shared app state
|
|
let state = std::sync::Arc::new(crate::api::deps::AppState { db: db.clone(), cfg: config.clone() });
|
|
|
|
// Build router with /api/v1 prefix and provide state via Extension
|
|
let api_router = Router::new()
|
|
.merge(api::routers::auth::router())
|
|
.merge(api::routers::users::router());
|
|
|
|
let app = Router::new().nest("/api/v1", api_router).layer(axum::Extension(state));
|
|
|
|
let addr = SocketAddr::from((config.server_host.parse::<std::net::IpAddr>()?, config.server_port));
|
|
tracing::info!("Starting server on {}", addr);
|
|
let listener = tokio::net::TcpListener::bind(&addr).await?;
|
|
axum::serve(listener, app).await?;
|
|
|
|
Ok(())
|
|
}
|