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, {} hat upgegraded 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 Vorstand, der Mitgliedstatus von {} hat sich geändert auf '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 Vorstand, der Mitgliedstatus von {} hat sich geändert auf '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(()) } }