delete large user-update-function 🎉 Fixes #958
Some checks failed
CI/CD Pipeline / test (push) Failing after 10m56s
CI/CD Pipeline / deploy-staging (push) Has been skipped
CI/CD Pipeline / deploy-main (push) Has been skipped

This commit is contained in:
Philipp Hofer 2025-05-03 18:31:14 +02:00
parent e6895c8cf1
commit d50501b362
2 changed files with 7 additions and 117 deletions

View File

@ -8,14 +8,12 @@ use rocket::{
http::{Cookie, Status}, http::{Cookie, Status},
request::{FromRequest, Outcome}, request::{FromRequest, Outcome},
time::{Duration, OffsetDateTime}, time::{Duration, OffsetDateTime},
tokio::io::AsyncReadExt,
Request, Request,
}; };
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use sqlx::{FromRow, Sqlite, SqlitePool, Transaction}; use sqlx::{FromRow, Sqlite, SqlitePool, Transaction};
use super::{ use super::{
family::Family,
log::Log, log::Log,
logbook::Logbook, logbook::Logbook,
mail::Mail, mail::Mail,
@ -26,7 +24,7 @@ use super::{
tripdetails::TripDetails, tripdetails::TripDetails,
Day, Day,
}; };
use crate::{tera::admin::user::UserEditForm, AMOUNT_DAYS_TO_SHOW_TRIPS_AHEAD}; use crate::AMOUNT_DAYS_TO_SHOW_TRIPS_AHEAD;
use scheckbuch::ScheckbuchUser; use scheckbuch::ScheckbuchUser;
mod basic; mod basic;
@ -483,68 +481,6 @@ ORDER BY last_access DESC
.unwrap(); //Okay, because we can only create a User of a valid id .unwrap(); //Okay, because we can only create a User of a valid id
} }
pub async fn update(&self, db: &SqlitePool, data: UserEditForm<'_>) -> Result<(), String> {
let mut db = db.begin().await.map_err(|e| e.to_string())?;
let mut family_id = data.family_id;
if family_id.is_some_and(|x| x == -1) {
family_id = Some(Family::insert_tx(&mut db).await)
}
if !self.has_membership_pdf_tx(&mut db).await {
if let Some(membership_pdf) = data.membership_pdf {
let mut stream = membership_pdf.open().await.unwrap();
let mut buffer = Vec::new();
stream.read_to_end(&mut buffer).await.unwrap();
sqlx::query!(
"UPDATE user SET membership_pdf = ? where id = ?",
buffer,
self.id
)
.execute(db.deref_mut())
.await
.unwrap(); //Okay, because we can only create a User of a valid id
}
}
sqlx::query!(
"UPDATE user SET dob = ?, weight = ?, sex = ?, member_since_date=?, birthdate=?, mail=?, nickname=?, notes=?, phone=?, address=?, family_id = ? where id = ?",
data.dob,
data.weight,
data.sex,
data.member_since_date,
data.birthdate,
data.mail,
data.nickname,
data.notes,
data.phone,
data.address,
family_id,
self.id
)
.execute(db.deref_mut())
.await
.unwrap(); //Okay, because we can only create a User of a valid id
// handle roles
sqlx::query!("DELETE FROM user_role WHERE user_id = ?", self.id)
.execute(db.deref_mut())
.await
.unwrap();
for role_id in data.roles.into_keys() {
let role = Role::find_by_id_tx(&mut db, role_id.parse::<i32>().unwrap())
.await
.unwrap();
self.add_role_tx(&mut db, &role).await?;
}
db.commit().await.map_err(|e| e.to_string())?;
Ok(())
}
async fn send_end_mail_scheckbuch( async fn send_end_mail_scheckbuch(
&self, &self,
db: &mut Transaction<'_, Sqlite>, db: &mut Transaction<'_, Sqlite>,

View File

@ -1,5 +1,3 @@
use std::collections::HashMap;
use crate::{ use crate::{
model::{ model::{
family::Family, family::Family,
@ -301,49 +299,6 @@ async fn delete(db: &State<SqlitePool>, admin: ManageUserUser, user: i32) -> Fla
} }
} }
#[derive(FromForm, Debug)]
pub struct UserEditForm<'a> {
pub(crate) id: i32,
pub(crate) dob: Option<String>,
pub(crate) weight: Option<String>,
pub(crate) sex: Option<String>,
pub(crate) roles: HashMap<String, String>,
pub(crate) member_since_date: Option<String>,
pub(crate) birthdate: Option<String>,
pub(crate) mail: Option<String>,
pub(crate) nickname: Option<String>,
pub(crate) notes: Option<String>,
pub(crate) phone: Option<String>,
pub(crate) address: Option<String>,
pub(crate) family_id: Option<i64>,
pub(crate) membership_pdf: Option<TempFile<'a>>,
}
#[post("/user", data = "<data>", format = "multipart/form-data")]
async fn update(
db: &State<SqlitePool>,
data: Form<UserEditForm<'_>>,
admin: ManageUserUser,
) -> Flash<Redirect> {
let user = User::find_by_id(db, data.id).await;
Log::create(
db,
format!("{} updated user from {user:?} to {data:?}", admin.user.name),
)
.await;
let Some(user) = user else {
return Flash::error(
Redirect::to("/admin/user"),
format!("User with ID {} does not exist!", data.id),
);
};
match user.update(db, data.into_inner()).await {
Ok(_) => Flash::success(Redirect::to("/admin/user"), "Successfully updated user"),
Err(e) => Flash::error(Redirect::to("/admin/user"), e),
}
}
#[derive(FromForm, Debug)] #[derive(FromForm, Debug)]
pub struct MailUpdateForm { pub struct MailUpdateForm {
mail: String, mail: String,
@ -712,11 +667,11 @@ async fn create(
} }
} }
#[derive(FromForm, Debug)] //#[derive(FromForm, Debug)]
struct UserAddScheckbuchForm<'r> { //struct UserAddScheckbuchForm<'r> {
name: &'r str, // name: &'r str,
mail: &'r str, // mail: &'r str,
} //}
//#[post("/user/new/scheckbuch", data = "<data>")] //#[post("/user/new/scheckbuch", data = "<data>")]
//async fn create_scheckbuch( //async fn create_scheckbuch(
@ -778,7 +733,7 @@ pub struct SchnupperantToRegularForm<'a> {
#[post("/user/<id>/schnupperant-to-regular", data = "<data>")] #[post("/user/<id>/schnupperant-to-regular", data = "<data>")]
async fn schnupperant_to_regular( async fn schnupperant_to_regular(
db: &State<SqlitePool>, db: &State<SqlitePool>,
data: Form<ScheckToRegularForm<'_>>, data: Form<SchnupperantToRegularForm<'_>>,
admin: ManageUserUser, admin: ManageUserUser,
config: &State<Config>, config: &State<Config>,
id: i32, id: i32,
@ -1174,7 +1129,6 @@ pub fn routes() -> Vec<Route> {
index_admin, index_admin,
view, view,
resetpw, resetpw,
update,
create, create,
//create_scheckbuch, //create_scheckbuch,
delete, delete,