use axum::extract::State; use axum::response::{Html, IntoResponse, Response}; use http::StatusCode; use minijinja::context; use crate::db::{DatabaseInterface, Operation}; use crate::http::{HttpSession, HttpState}; pub async fn home( State(state): State>, // Only logged in users are allowed here session: HttpSession, ) -> Response { // When the user has no domain (service admin) list all domains let op = Operation::ListUsers(session.user.domain.clone()); let other_users = if session.user.can_perform(&op) { match state .db .list_domain_users(session.user.domain.clone()) .await { Ok(other_users) => other_users, Err(e) => { return format!("Database error: {e}").into_response(); } } } else { vec![] }; tracing::info!( "Found {} users on domain {:?}", other_users.len(), session.user.domain ); let domains = match state.db.domains_user_can_see(&session.user).await { Ok(domains) => domains, Err(e) => { return format!("Database error: {e}").into_response(); } }; let ctx = context! { domains, user => session.user, can_create_domain => session.user.can_create_domain(), other_users, }; let page = state .templates .get_template("home.html") .unwrap() .render(ctx) .unwrap(); (StatusCode::OK, Html(page)).into_response() }