only allow people with 'donau linz' role to be in logbook #350

Merged
philipp merged 2 commits from staging into main 2024-04-08 19:05:35 +02:00
3 changed files with 38 additions and 8 deletions

View File

@ -959,6 +959,30 @@ impl Deref for PlannedEventUser {
&self.0 &self.0
} }
} }
#[derive(FromRow, Serialize, Deserialize, Clone, Debug)]
pub struct UserWithRolesAndMembershipPdf {
#[serde(flatten)]
pub user: User,
pub membership_pdf: bool,
pub roles: Vec<String>,
}
impl UserWithRolesAndMembershipPdf {
pub(crate) async fn from_user(db: &SqlitePool, user: User) -> Self {
let membership_pdf: bool =
sqlx::query_scalar!("SELECT membership_pdf FROM user WHERE id = $1", user.id)
.fetch_optional(db)
.await
.unwrap()
.is_some();
Self {
roles: user.roles(db).await,
user,
membership_pdf,
}
}
}
#[derive(FromRow, Serialize, Deserialize, Clone, Debug)] #[derive(FromRow, Serialize, Deserialize, Clone, Debug)]
pub struct UserWithMembershipPdf { pub struct UserWithMembershipPdf {

View File

@ -5,7 +5,10 @@ use crate::model::{
log::Log, log::Log,
logbook::Logbook, logbook::Logbook,
role::Role, role::Role,
user::{AdminUser, User, UserWithMembershipPdf, UserWithRoles, VorstandUser}, user::{
AdminUser, User, UserWithMembershipPdf, UserWithRoles, UserWithRolesAndMembershipPdf,
VorstandUser,
},
}; };
use futures::future::join_all; use futures::future::join_all;
use rocket::{ use rocket::{
@ -45,13 +48,13 @@ async fn index(
let user_futures: Vec<_> = User::all(db) let user_futures: Vec<_> = User::all(db)
.await .await
.into_iter() .into_iter()
.map(|u| async move { UserWithRoles::from_user(u, db).await }) .map(|u| async move { UserWithRolesAndMembershipPdf::from_user(db, u).await })
.collect(); .collect();
let user: User = user.into(); let user: User = user.into();
let allowed_to_edit = user.has_role(db, "admin").await; let allowed_to_edit = user.has_role(db, "admin").await;
let users: Vec<UserWithRoles> = join_all(user_futures).await; let users: Vec<UserWithRolesAndMembershipPdf> = join_all(user_futures).await;
let roles = Role::all(db).await; let roles = Role::all(db).await;
let families = Family::all_with_members(db).await; let families = Family::all_with_members(db).await;
@ -78,14 +81,13 @@ async fn index_admin(
let user_futures: Vec<_> = User::all(db) let user_futures: Vec<_> = User::all(db)
.await .await
.into_iter() .into_iter()
.map(|u| async move { UserWithRoles::from_user(u, db).await }) .map(|u| async move { UserWithRolesAndMembershipPdf::from_user(db, u).await })
.collect(); .collect();
let users: Vec<UserWithRolesAndMembershipPdf> = join_all(user_futures).await;
let user: User = user.user; let user: User = user.user;
let allowed_to_edit = user.has_role(db, "admin").await; let allowed_to_edit = user.has_role(db, "admin").await;
let users: Vec<UserWithRoles> = join_all(user_futures).await;
let roles = Role::all(db).await; let roles = Role::all(db).await;
let families = Family::all_with_members(db).await; let families = Family::all_with_members(db).await;

View File

@ -49,20 +49,24 @@ async fn index(
) -> Template { ) -> Template {
let boats = Boat::for_user(db, &user).await; let boats = Boat::for_user(db, &user).await;
let coxes: Vec<UserWithWaterStatus> = futures::future::join_all( let mut coxes: Vec<UserWithWaterStatus> = futures::future::join_all(
User::cox(db) User::cox(db)
.await .await
.into_iter() .into_iter()
.map(|user| UserWithWaterStatus::from_user(user, db)), .map(|user| UserWithWaterStatus::from_user(user, db)),
) )
.await; .await;
let users: Vec<UserWithWaterStatus> = futures::future::join_all( coxes.retain(|u| u.roles.contains(&"Donau Linz".into()));
let mut users: Vec<UserWithWaterStatus> = futures::future::join_all(
User::all(db) User::all(db)
.await .await
.into_iter() .into_iter()
.map(|user| UserWithWaterStatus::from_user(user, db)), .map(|user| UserWithWaterStatus::from_user(user, db)),
) )
.await; .await;
users.retain(|u| u.roles.contains(&"Donau Linz".into()));
let logtypes = LogType::all(db).await; let logtypes = LogType::all(db).await;
let distances = Logbook::distances(db).await; let distances = Logbook::distances(db).await;