use askama::Template; use axum::{ Router, extract::State, response::{Html, IntoResponse}, routing::get, }; use crate::auth::CurrentUser; use crate::routes::AppState; #[derive(Template)] #[template(path = "dashboard.html")] struct DashboardTemplate { username: String, is_superuser: bool, password_change_required: bool, active_instance: Option, container_state: String, } #[derive(Clone)] struct ActiveInstanceInfo { name: String, version: String, server_type: String, max_players: i32, } pub fn router() -> Router { Router::new().route("/", get(dashboard)) } async fn dashboard( State(state): State, CurrentUser(account): CurrentUser, ) -> Result { let (active_info, container_state) = { let conn = state.db.conn(); let result = conn.query_row( "SELECT name, version, server_type, max_players, container_state FROM instances WHERE is_active = 1", [], |row| { Ok(( Some(ActiveInstanceInfo { name: row.get(0)?, version: row.get(1)?, server_type: row.get(2)?, max_players: row.get(3)?, }), row.get::<_, String>(4)?, )) }, ); result.unwrap_or((None, "stopped".into())) }; let template = DashboardTemplate { username: account.username, is_superuser: account.is_superuser, password_change_required: account.password_change_required, active_instance: active_info, container_state, }; Ok(Html(template.render().unwrap_or_default())) }