use axum::{ extract::{Request, State}, response::{IntoResponse, Redirect, Response}, }; use maud::{PreEscaped, html}; use crate::{ MnemoState, error::CompositeError, users::{User, auth::UserAuthenticate, permissions::Permission}, web::{ components::{nav::nav, user_miniprofile::user_miniprofile}, icons, pages::base, }, }; pub mod create; pub mod profile; pub async fn page( State(state): State, req: Request, ) -> Result { let mut conn = state.pool.acquire().await?; let u = match User::authenticate(&mut *conn, req.headers()).await? { Some(u) => u, None => return Ok(Redirect::to(&format!("/login?r={}", req.uri().path())).into_response()), }; let us = User::get_all(&mut *conn).await; let can_create_users = u .has_permission(&mut *conn, Permission::ManuallyCreateUsers) .await; Ok(base( "Users | Mnemosyne", html!( (nav(&mut conn, Some(&u), req.uri().path()).await) div class="mx-auto max-w-4xl px-2 my-4" { p class="flex items-center gap-2" { span class="text-neutral-500" {(PreEscaped(icons::USERS))} span class="text-2xl font-semibold font-lora" {"Users"} } p class="text-neutral-500 text-sm font-light" { @if let Ok(v) = &us { (v.len()) " users registered with Mnemosyne." } @else { "Could not fetch user count." } @if let Ok(true) = can_create_users { " " a href="/users/create" class="text-blue-500 hover:text-blue-400 hover:underline" { "Create a new user" } } } } div class="mx-auto max-w-4xl flex flex-wrap gap-4" { @if let Ok(vec) = &us { @for user in vec { (user_miniprofile(user)) } } @else { p class="text-center py-4 text-light text-red-500" {"Failed to load users."} } } ), ) .into_response()) }