show all users on ranking board; be able to merge users
Some checks failed
CI/CD Pipeline / test (push) Has started running
CI/CD Pipeline / deploy-staging (push) Has been cancelled
CI/CD Pipeline / deploy-main (push) Has been cancelled

This commit is contained in:
2026-01-08 20:14:57 +01:00
parent f8ea6d5aa5
commit 3fcf24958b
6 changed files with 732 additions and 15 deletions

View File

@@ -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,