diff --git a/src/model/role.rs b/src/model/role.rs index f66120c..765a168 100644 --- a/src/model/role.rs +++ b/src/model/role.rs @@ -45,6 +45,19 @@ WHERE name like ? .ok() } + pub async fn names_from_role(&self, db: &SqlitePool) -> Vec { + let query = format!( + "SELECT u.name. + FROM user u + JOIN user_role ur ON u.id = ur.user_id + JOIN role r ON ur.role_id = r.id + WHERE r.id = {} AND deleted=0;", + self.id + ); + + sqlx::query_scalar(&query).fetch_all(db).await.unwrap() + } + pub async fn mails_from_role(&self, db: &SqlitePool) -> Vec { let query = format!( "SELECT u.mail diff --git a/src/model/user.rs b/src/model/user.rs index 8dc5fcc..ba7a4b7 100644 --- a/src/model/user.rs +++ b/src/model/user.rs @@ -266,7 +266,7 @@ impl User { pub async fn roles(&self, db: &SqlitePool) -> Vec { sqlx::query!( - "SELECT r.name FROM role r JOIN user_role ur ON r.id = ur.role_id WHERE ur.user_id = ?;", + "SELECT r.name FROM role r JOIN user_role ur ON r.id = ur.role_id JOIN user u ON u.id = ur.user_id WHERE ur.user_id = ? AND u.deleted = 0;", self.id ) .fetch_all(db) diff --git a/src/tera/admin/mod.rs b/src/tera/admin/mod.rs index cb4e24d..2daf4c6 100644 --- a/src/tera/admin/mod.rs +++ b/src/tera/admin/mod.rs @@ -1,8 +1,9 @@ -use rocket::{get, routes, Route, State}; +use rocket::{form::Form, get, post, routes, FromForm, Route, State}; +use rocket_dyn_templates::{context, Template}; use sqlx::SqlitePool; use crate::{ - model::{log::Log, user::AdminUser}, + model::{log::Log, role::Role, user::AdminUser}, tera::Config, }; @@ -25,12 +26,36 @@ async fn show_rss(db: &State, _admin: AdminUser) -> String { Log::show(db).await } +#[get("/list")] +async fn show_list(_admin: AdminUser) -> Template { + Template::render("admin/list/index", context!()) +} + +#[derive(FromForm)] +struct ListForm { + list: String, +} + +#[post("/list", data = "")] +async fn list(db: &State, _admin: AdminUser, list_form: Form) -> Template { + let role = Role::find_by_name(db, "Donau Linz").await.unwrap(); + let acceptable_users = role.names_from_role(db).await; + + //TODO: continue here + + let context = context! { + result: "test" + }; + + Template::render("admin/list/result", &context) +} + pub fn routes() -> Vec { let mut ret = Vec::new(); ret.append(&mut user::routes()); ret.append(&mut boat::routes()); ret.append(&mut mail::routes()); ret.append(&mut planned_event::routes()); - ret.append(&mut routes![rss, show_rss]); + ret.append(&mut routes![rss, show_rss, show_list, list]); ret } diff --git a/templates/admin/list/index.html.tera b/templates/admin/list/index.html.tera new file mode 100644 index 0000000..6fe0e31 --- /dev/null +++ b/templates/admin/list/index.html.tera @@ -0,0 +1,12 @@ +{% import "includes/macros" as macros %} +{% extends "base" %} +{% block content %} + {% if flash %}{{ macros::alert(message=flash.1, type=flash.0, class="sm:col-span-2 lg:col-span-3") }}{% endif %} +
+

List

+
+ + +
+
+{% endblock content %} diff --git a/templates/admin/list/result.html.tera b/templates/admin/list/result.html.tera new file mode 100644 index 0000000..5c6fd30 --- /dev/null +++ b/templates/admin/list/result.html.tera @@ -0,0 +1,9 @@ +{% import "includes/macros" as macros %} +{% extends "base" %} +{% block content %} + {% if flash %}{{ macros::alert(message=flash.1, type=flash.0, class="sm:col-span-2 lg:col-span-3") }}{% endif %} +
+

List - Result

+ {{result}} +
+{% endblock content %}