diff --git a/src/db/interface.rs b/src/db/interface.rs index 42154e7..c109873 100644 --- a/src/db/interface.rs +++ b/src/db/interface.rs @@ -54,7 +54,10 @@ pub trait DatabaseInterface: Clone + Send + Sync + 'static { &mut self, domain: &str, ) -> impl Future, BoxedError>>; - fn get_domain(&self, domain: &str) -> impl Future, BoxedError>>; + fn get_domain( + &self, + domain: &str, + ) -> impl Future, BoxedError>> + Send; fn get_user( &self, diff --git a/src/http/domain.rs b/src/http/domain.rs new file mode 100644 index 0000000..479b5f4 --- /dev/null +++ b/src/http/domain.rs @@ -0,0 +1,54 @@ +use axum::extract::{Path, State}; +use axum::response::{Html, IntoResponse, Response}; +use axum_extra::extract::cookie::CookieJar; +use http::StatusCode; +use minijinja::context; + +use crate::db::{DatabaseInterface, Operation}; +use crate::http::HttpState; +use crate::http::login::login_page; + +pub async fn get_domain( + State(state): State>, + cookies: CookieJar, + Path(domain): Path, +) -> Response { + let Some(session) = state.sessions.get_session(&cookies) else { + return login_page(State(state), None).await.into_response(); + }; + + let domain = match state.db.get_domain(&domain).await { + Ok(Some(domain)) => domain, + Ok(None) => return format!("Domain not found: {domain}").into_response(), + Err(e) => { + return format!("Database error: {e}").into_response(); + } + }; + + let domain_users = match state.db.list_domain_users(Some(domain.name.clone())).await { + Ok(users) => users, + Err(e) => { + return format!("Database error: {e}").into_response(); + } + }; + + // Redundant because someone who can see the domain admin page for the moment + // always can create accounts. + let op = Operation::CreateUser(domain.name.clone()); + let can_create_user = session.user.can_perform(&op); + + let ctx = context! { + can_create_user, + domain, + user => session.user, + users => domain_users, + }; + + let page = state + .templates + .get_template("domain.html") + .unwrap() + .render(ctx) + .unwrap(); + (StatusCode::OK, Html(page)).into_response() +} diff --git a/src/http/mod.rs b/src/http/mod.rs index 1d65472..4692ec9 100644 --- a/src/http/mod.rs +++ b/src/http/mod.rs @@ -13,6 +13,7 @@ use crate::db::{Database, DatabaseInterface}; use crate::listener::{Listener, ListenerKind}; use crate::stream::{AbstractSocketAddr, AbstractStreamKind}; +mod domain; mod home; mod login; mod logout; @@ -99,6 +100,8 @@ pub async fn http_listen(listener: Listener, db: Database< .route("/login", get(home::home)) .route("/login", post(login::post_login)) .route("/logout", get(logout::logout)) + .route("/domain/{domain}", get(domain::get_domain)) + //.route("/domain", post(domain::create_domain)) .with_state(HttpState::new(db)); axum::serve(listener, app).await.unwrap(); diff --git a/templates/domain.html b/templates/domain.html new file mode 100644 index 0000000..a5c46a4 --- /dev/null +++ b/templates/domain.html @@ -0,0 +1,30 @@ +{% extends 'base.html' %} +{% block main %} +
+ +

You are logged in as {{ user.username }}

+
+ Logout +
+ {% if can_create_user %} +
+

Create user

+
+ + + + +
+
+ {% endif %} +
+

Users on {{ domain.name }}

+
    + {% for user in users %} +
  • {{ user.mail }}
  • + {% endfor %} +
+
+
+{% endblock %} + diff --git a/templates/home.html b/templates/home.html index 13f717e..d1f71b2 100644 --- a/templates/home.html +++ b/templates/home.html @@ -9,7 +9,7 @@ {% if can_create_domain %}

Create domain

-
+