allow to change type between members
This commit is contained in:
parent
8dc55a7aad
commit
46981c3311
162
src/model/user/clubmember.rs
Normal file
162
src/model/user/clubmember.rs
Normal file
@ -0,0 +1,162 @@
|
|||||||
|
use super::User;
|
||||||
|
use crate::{
|
||||||
|
model::{log::Log, notification::Notification, role::Role, user::ManageUserUser},
|
||||||
|
special_user,
|
||||||
|
};
|
||||||
|
use rocket::async_trait;
|
||||||
|
use sqlx::SqlitePool;
|
||||||
|
|
||||||
|
special_user!(ClubMemberUser, +"Donau Linz", +"Förderndes Mitglied", +"Unterstützend");
|
||||||
|
|
||||||
|
impl ClubMemberUser {
|
||||||
|
async fn add_membership_role(&self, db: &SqlitePool, role: &Role) {
|
||||||
|
sqlx::query!(
|
||||||
|
"INSERT INTO user_role(user_id, role_id) VALUES (?, ?)",
|
||||||
|
self.id,
|
||||||
|
role.id
|
||||||
|
)
|
||||||
|
.execute(db)
|
||||||
|
.await
|
||||||
|
.unwrap();
|
||||||
|
}
|
||||||
|
|
||||||
|
async fn remove_membership_role(&self, db: &SqlitePool) {
|
||||||
|
let role = Role::find_by_name(db, "Förderndes Mitglied").await.unwrap();
|
||||||
|
sqlx::query!(
|
||||||
|
"DELETE FROM user_role WHERE user_id = ? and role_id = ?",
|
||||||
|
self.id,
|
||||||
|
role.id
|
||||||
|
)
|
||||||
|
.execute(db)
|
||||||
|
.await
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
|
let role = Role::find_by_name(db, "Unterstützend").await.unwrap();
|
||||||
|
sqlx::query!(
|
||||||
|
"DELETE FROM user_role WHERE user_id = ? and role_id = ?",
|
||||||
|
self.id,
|
||||||
|
role.id
|
||||||
|
)
|
||||||
|
.execute(db)
|
||||||
|
.await
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
|
let role = Role::find_by_name(db, "Donau Linz").await.unwrap();
|
||||||
|
sqlx::query!(
|
||||||
|
"DELETE FROM user_role WHERE user_id = ? and role_id = ?",
|
||||||
|
self.id,
|
||||||
|
role.id
|
||||||
|
)
|
||||||
|
.execute(db)
|
||||||
|
.await
|
||||||
|
.unwrap();
|
||||||
|
}
|
||||||
|
async fn new_membership_role(&self, db: &SqlitePool, role: &str) -> Result<(), String> {
|
||||||
|
let role = Role::find_by_name(db, role).await.unwrap();
|
||||||
|
self.remove_membership_role(db).await;
|
||||||
|
self.add_membership_role(db, &role).await;
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
pub(crate) async fn move_to_regular(
|
||||||
|
self,
|
||||||
|
db: &SqlitePool,
|
||||||
|
modified_by: &ManageUserUser,
|
||||||
|
) -> Result<(), String> {
|
||||||
|
if self.has_role(db, "Donau Linz").await {
|
||||||
|
return Err(format!("User {self} ist bereits reguläres Mitglied."));
|
||||||
|
}
|
||||||
|
|
||||||
|
self.new_membership_role(db, "Donau Linz").await?;
|
||||||
|
|
||||||
|
Notification::create_for_steering_people(
|
||||||
|
db,
|
||||||
|
&format!(
|
||||||
|
"Liebe Steuerberechtigte, {} war unterstützendes/förderndes Mitglied und ist nun ein neues reguläres Mitglied. 🎉",
|
||||||
|
self.name,
|
||||||
|
),
|
||||||
|
"Neues Vereinsmitglied",
|
||||||
|
None,
|
||||||
|
None,
|
||||||
|
)
|
||||||
|
.await;
|
||||||
|
|
||||||
|
Log::create(
|
||||||
|
db,
|
||||||
|
format!("{modified_by} has moved user {self} to regular membership."),
|
||||||
|
)
|
||||||
|
.await;
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
pub(crate) async fn move_to_unterstuetzend(
|
||||||
|
self,
|
||||||
|
db: &SqlitePool,
|
||||||
|
modified_by: &ManageUserUser,
|
||||||
|
) -> Result<(), String> {
|
||||||
|
if self.has_role(db, "Unterstützend").await {
|
||||||
|
return Err(format!("User {self} ist bereits unterstützendes Mitglied."));
|
||||||
|
}
|
||||||
|
|
||||||
|
self.new_membership_role(db, "Unterstützend").await?;
|
||||||
|
|
||||||
|
if let Some(vorstand) = Role::find_by_name(db, "vorstand").await {
|
||||||
|
Notification::create_for_role(
|
||||||
|
db,
|
||||||
|
&vorstand,
|
||||||
|
&format!(
|
||||||
|
"Lieber Vorstnad, {} war aktives/förderndes Mitglied und ist nun ein unterstützendes Mitglied.",
|
||||||
|
self.name,
|
||||||
|
),
|
||||||
|
"Neues unterstützendes Vereinsmitglied",
|
||||||
|
None,
|
||||||
|
None,
|
||||||
|
)
|
||||||
|
.await;
|
||||||
|
}
|
||||||
|
|
||||||
|
Log::create(
|
||||||
|
db,
|
||||||
|
format!("{modified_by} has moved user {self} to unterstützend membership."),
|
||||||
|
)
|
||||||
|
.await;
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
pub(crate) async fn move_to_foerdernd(
|
||||||
|
self,
|
||||||
|
db: &SqlitePool,
|
||||||
|
modified_by: &ManageUserUser,
|
||||||
|
) -> Result<(), String> {
|
||||||
|
if self.has_role(db, "Förderndes Mitglied").await {
|
||||||
|
return Err(format!("User {self} ist bereits förderndes Mitglied."));
|
||||||
|
}
|
||||||
|
|
||||||
|
self.new_membership_role(db, "Förderndes Mitglied").await?;
|
||||||
|
|
||||||
|
if let Some(vorstand) = Role::find_by_name(db, "vorstand").await {
|
||||||
|
Notification::create_for_role(
|
||||||
|
db,
|
||||||
|
&vorstand,
|
||||||
|
&format!(
|
||||||
|
"Lieber Vorstnad, {} war aktives/unterstützendes Mitglied und ist nun ein förderndes Mitglied.",
|
||||||
|
self.name,
|
||||||
|
),
|
||||||
|
"Neues förderndes Vereinsmitglied",
|
||||||
|
None,
|
||||||
|
None,
|
||||||
|
)
|
||||||
|
.await;
|
||||||
|
}
|
||||||
|
|
||||||
|
Log::create(
|
||||||
|
db,
|
||||||
|
format!("{modified_by} has moved user {self} to fördernd membership."),
|
||||||
|
)
|
||||||
|
.await;
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
}
|
@ -30,6 +30,7 @@ use crate::{tera::admin::user::UserEditForm, AMOUNT_DAYS_TO_SHOW_TRIPS_AHEAD};
|
|||||||
use scheckbuch::ScheckbuchUser;
|
use scheckbuch::ScheckbuchUser;
|
||||||
|
|
||||||
mod basic;
|
mod basic;
|
||||||
|
pub(crate) mod clubmember;
|
||||||
mod fee;
|
mod fee;
|
||||||
pub(crate) mod foerdernd;
|
pub(crate) mod foerdernd;
|
||||||
pub(crate) mod member;
|
pub(crate) mod member;
|
||||||
|
@ -7,9 +7,9 @@ use crate::{
|
|||||||
logbook::Logbook,
|
logbook::Logbook,
|
||||||
role::Role,
|
role::Role,
|
||||||
user::{
|
user::{
|
||||||
member::Member, scheckbuch::ScheckbuchUser, AdminUser, AllowedToEditPaymentStatusUser,
|
clubmember::ClubMemberUser, member::Member, scheckbuch::ScheckbuchUser, AdminUser,
|
||||||
ManageUserUser, User, UserWithDetails, UserWithMembershipPdf,
|
AllowedToEditPaymentStatusUser, ManageUserUser, User, UserWithDetails,
|
||||||
UserWithRolesAndMembershipPdf, VorstandUser,
|
UserWithMembershipPdf, UserWithRolesAndMembershipPdf, VorstandUser,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
tera::Config,
|
tera::Config,
|
||||||
@ -933,6 +933,53 @@ async fn scheckbook_to_regular(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(FromForm, Debug)]
|
||||||
|
pub struct ChangeMembertypeForm {
|
||||||
|
membertype: String,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[post("/user/<id>/change-membertype", data = "<data>")]
|
||||||
|
async fn change_membertype(
|
||||||
|
db: &State<SqlitePool>,
|
||||||
|
admin: ManageUserUser,
|
||||||
|
data: Form<ChangeMembertypeForm>,
|
||||||
|
id: i32,
|
||||||
|
) -> Flash<Redirect> {
|
||||||
|
let Some(user) = User::find_by_id(db, id).await else {
|
||||||
|
return Flash::error(
|
||||||
|
Redirect::to("/admin/user"),
|
||||||
|
format!("User with ID {} does not exist!", id),
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
let Some(user) = ClubMemberUser::new(&db, &user).await else {
|
||||||
|
return Flash::error(
|
||||||
|
Redirect::to("/admin/user"),
|
||||||
|
format!("User {user} ist kein Vereinsmitglied"),
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
let response = match &*data.membertype {
|
||||||
|
"regular" => user.move_to_regular(db, &admin).await,
|
||||||
|
"unterstuetzend" => user.move_to_unterstuetzend(db, &admin).await,
|
||||||
|
"foerdernd" => user.move_to_foerdernd(db, &admin).await,
|
||||||
|
_ => {
|
||||||
|
return Flash::error(
|
||||||
|
Redirect::to("/admin/user"),
|
||||||
|
format!("Membertype gibt's ned"),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
match response {
|
||||||
|
Ok(_) => Flash::success(
|
||||||
|
Redirect::to(format!("/admin/user/{}", id)),
|
||||||
|
"Mitgliedstyp umgewandelt und Infos versendet",
|
||||||
|
),
|
||||||
|
Err(e) => Flash::error(Redirect::to(format!("/admin/user/{}", id)), e),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub fn routes() -> Vec<Route> {
|
pub fn routes() -> Vec<Route> {
|
||||||
routes![
|
routes![
|
||||||
index,
|
index,
|
||||||
@ -962,5 +1009,6 @@ pub fn routes() -> Vec<Route> {
|
|||||||
remove_role,
|
remove_role,
|
||||||
//
|
//
|
||||||
scheckbook_to_regular,
|
scheckbook_to_regular,
|
||||||
|
change_membertype,
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user