llldap/src/http/home.rs

58 lines
1.5 KiB
Rust

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<HttpState>,
// 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()
}