forked from Ruderverein-Donau-Linz/rowt
168 lines
4.8 KiB
Rust
168 lines
4.8 KiB
Rust
use super::User;
|
|
use crate::{
|
|
model::{
|
|
activity::ActivityBuilder, 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, {} hat upgegraded und ist nun ein neues reguläres Mitglied. 🎉",
|
|
self.name,
|
|
),
|
|
"Neues Vereinsmitglied",
|
|
None,
|
|
None,
|
|
)
|
|
.await;
|
|
|
|
ActivityBuilder::new(&format!(
|
|
"{modified_by} hat {self} zu einem regulären hochgestuft."
|
|
))
|
|
.relevant_for_user(&self)
|
|
.save(db)
|
|
.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 Vorstand, der Mitgliedstatus von {} hat sich geändert auf 'Unterstützendes Mitglied'.",
|
|
self.name,
|
|
),
|
|
"Neues unterstützendes Vereinsmitglied",
|
|
None,
|
|
None,
|
|
)
|
|
.await;
|
|
}
|
|
|
|
ActivityBuilder::new(&format!(
|
|
"{modified_by} hat {self} zu einem unterstützenden Mitglied gemacht."
|
|
))
|
|
.relevant_for_user(&self)
|
|
.save(db)
|
|
.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 Vorstand, der Mitgliedstatus von {} hat sich geändert auf 'Förderndes Mitglied'.",
|
|
self.name,
|
|
),
|
|
"Neues förderndes Vereinsmitglied",
|
|
None,
|
|
None,
|
|
)
|
|
.await;
|
|
}
|
|
|
|
ActivityBuilder::new(&format!(
|
|
"{modified_by} hat {self} zu ein förderndes Mitglied gemacht."
|
|
))
|
|
.relevant_for_user(&self)
|
|
.save(db)
|
|
.await;
|
|
|
|
Ok(())
|
|
}
|
|
}
|