show all users on ranking board; be able to merge users
This commit is contained in:
@@ -306,6 +306,97 @@ async fn delete(db: &State<SqlitePool>, admin: ManageUserUser, user: i32) -> Fla
|
||||
}
|
||||
}
|
||||
|
||||
use crate::model::user::merge::UserWithKm;
|
||||
|
||||
#[get("/user/merge?<source>&<target>")]
|
||||
async fn merge_page(
|
||||
db: &State<SqlitePool>,
|
||||
admin: ManageUserUser,
|
||||
flash: Option<FlashMessage<'_>>,
|
||||
source: Option<i32>,
|
||||
target: Option<i32>,
|
||||
) -> Template {
|
||||
let users_with_km = UserWithKm::all(db).await;
|
||||
|
||||
let admin_user: User = admin.into_inner();
|
||||
|
||||
let mut context = Context::new();
|
||||
if let Some(msg) = flash {
|
||||
context.insert("flash", &msg.into_inner());
|
||||
}
|
||||
context.insert("users", &users_with_km);
|
||||
|
||||
// If both source and target are selected, show preview
|
||||
if let (Some(source_id), Some(target_id)) = (source, target) {
|
||||
if source_id != target_id {
|
||||
if let (Some(source_user), Some(target_user)) = (
|
||||
User::find_by_id(db, source_id).await,
|
||||
User::find_by_id(db, target_id).await,
|
||||
) {
|
||||
let preview = User::merge_preview(db, &source_user, &target_user).await;
|
||||
context.insert("source_user", &source_user);
|
||||
context.insert("target_user", &target_user);
|
||||
context.insert("preview", &preview);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
context.insert("selected_source", &source);
|
||||
context.insert("selected_target", &target);
|
||||
context.insert(
|
||||
"loggedin_user",
|
||||
&UserWithDetails::from_user(admin_user, db).await,
|
||||
);
|
||||
|
||||
Template::render("admin/user/merge", context.into_json())
|
||||
}
|
||||
|
||||
#[derive(FromForm, Debug)]
|
||||
pub struct MergeForm {
|
||||
source_id: i32,
|
||||
target_id: i32,
|
||||
}
|
||||
|
||||
#[post("/user/merge", data = "<data>")]
|
||||
async fn merge_execute(
|
||||
db: &State<SqlitePool>,
|
||||
admin: ManageUserUser,
|
||||
data: Form<MergeForm>,
|
||||
) -> Flash<Redirect> {
|
||||
let Some(source_user) = User::find_by_id(db, data.source_id).await else {
|
||||
return Flash::error(
|
||||
Redirect::to("/admin/user/merge"),
|
||||
format!("User mit ID {} existiert nicht", data.source_id),
|
||||
);
|
||||
};
|
||||
|
||||
let Some(target_user) = User::find_by_id(db, data.target_id).await else {
|
||||
return Flash::error(
|
||||
Redirect::to("/admin/user/merge"),
|
||||
format!("Ziel-User mit ID {} existiert nicht", data.target_id),
|
||||
);
|
||||
};
|
||||
|
||||
let source_name = source_user.name.clone();
|
||||
|
||||
match User::merge_into(db, &source_user, &target_user, &admin).await {
|
||||
Ok(()) => Flash::success(
|
||||
Redirect::to(format!("/admin/user/{}", data.target_id)),
|
||||
format!(
|
||||
"Benutzer '{}' erfolgreich in '{}' zusammengeführt",
|
||||
source_name, target_user.name
|
||||
),
|
||||
),
|
||||
Err(e) => Flash::error(
|
||||
Redirect::to(format!(
|
||||
"/admin/user/merge?source={}&target={}",
|
||||
data.source_id, data.target_id
|
||||
)),
|
||||
e,
|
||||
),
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(FromForm, Debug)]
|
||||
pub struct MailUpdateForm {
|
||||
mail: String,
|
||||
@@ -1437,6 +1528,9 @@ pub fn routes() -> Vec<Route> {
|
||||
view,
|
||||
resetpw,
|
||||
delete,
|
||||
// Merge
|
||||
merge_page,
|
||||
merge_execute,
|
||||
fees,
|
||||
fees_paid,
|
||||
scheckbuch,
|
||||
|
||||
Reference in New Issue
Block a user