feat: initialize template shell and basic components
This commit is contained in:
+107
@@ -0,0 +1,107 @@
|
||||
mod common;
|
||||
mod auth;
|
||||
mod tasks;
|
||||
mod developers;
|
||||
mod main_view;
|
||||
mod components;
|
||||
|
||||
use axum::{extract::FromRef, Router};
|
||||
use std::net::SocketAddr;
|
||||
use tracing::info;
|
||||
use tracing_subscriber::{layer::SubscriberExt, util::SubscriberInitExt};
|
||||
|
||||
use crate::common::config::Config;
|
||||
use crate::common::database::connect_db;
|
||||
use crate::auth::repository::MongoUserRepository;
|
||||
use crate::tasks::repository::MongoTaskRepository;
|
||||
use crate::developers::repository::MongoDeveloperRepository;
|
||||
|
||||
#[derive(Clone)]
|
||||
struct AppState {
|
||||
config: Config,
|
||||
db: mongodb::Database,
|
||||
user_repo: MongoUserRepository,
|
||||
task_repo: MongoTaskRepository,
|
||||
dev_repo: MongoDeveloperRepository,
|
||||
}
|
||||
|
||||
impl FromRef<AppState> for Config {
|
||||
fn from_ref(state: &AppState) -> Self {
|
||||
state.config.clone()
|
||||
}
|
||||
}
|
||||
|
||||
impl FromRef<AppState> for mongodb::Database {
|
||||
fn from_ref(state: &AppState) -> Self {
|
||||
state.db.clone()
|
||||
}
|
||||
}
|
||||
|
||||
impl FromRef<AppState> for MongoUserRepository {
|
||||
fn from_ref(state: &AppState) -> Self {
|
||||
state.user_repo.clone()
|
||||
}
|
||||
}
|
||||
|
||||
impl FromRef<AppState> for MongoTaskRepository {
|
||||
fn from_ref(state: &AppState) -> Self {
|
||||
state.task_repo.clone()
|
||||
}
|
||||
}
|
||||
|
||||
impl FromRef<AppState> for MongoDeveloperRepository {
|
||||
fn from_ref(state: &AppState) -> Self {
|
||||
state.dev_repo.clone()
|
||||
}
|
||||
}
|
||||
|
||||
#[tokio::main]
|
||||
async fn main() -> Result<(), Box<dyn std::error::Error>> {
|
||||
// 1. Initialize logging
|
||||
tracing_subscriber::registry()
|
||||
.with(tracing_subscriber::fmt::layer())
|
||||
.init();
|
||||
|
||||
info!("Starting Stick Template application...");
|
||||
|
||||
// 2. Parse config from env
|
||||
let config = Config::from_env();
|
||||
|
||||
// 3. Connect to MongoDB
|
||||
let db = connect_db(&config).await?;
|
||||
|
||||
// 4. Initialize repositories
|
||||
let user_repo = MongoUserRepository::new(db.clone());
|
||||
let task_repo = MongoTaskRepository::new(db.clone());
|
||||
let dev_repo = MongoDeveloperRepository::new(db.clone());
|
||||
|
||||
// 5. Initialize shared AppState
|
||||
let state = AppState {
|
||||
config: config.clone(),
|
||||
db,
|
||||
user_repo,
|
||||
task_repo,
|
||||
dev_repo,
|
||||
};
|
||||
|
||||
// 6. Build and merge routers by use-case
|
||||
let app = Router::new()
|
||||
.merge(main_view::router())
|
||||
.merge(components::router())
|
||||
.merge(auth::router())
|
||||
.merge(tasks::router())
|
||||
.merge(developers::router())
|
||||
.with_state(state);
|
||||
|
||||
// 7. Bind address and run server
|
||||
let host_addr: SocketAddr = format!("{}:{}", config.host, config.port)
|
||||
.parse()
|
||||
.expect("Invalid HOST or PORT config");
|
||||
|
||||
info!("Listening on http://{}", host_addr);
|
||||
|
||||
let listener = tokio::net::TcpListener::bind(host_addr).await?;
|
||||
axum::serve(listener, app).await?;
|
||||
|
||||
Ok(())
|
||||
}
|
||||
Reference in New Issue
Block a user