From d285d0525f86160a61067942346fb40f2bc5c797 Mon Sep 17 00:00:00 2001 From: Harald Eilertsen Date: Tue, 31 Jul 2018 22:13:30 +0200 Subject: Implemet editing users. --- src/controllers/users_controller.rs | 79 ++++++++++++++++++++++++++++++++++++- 1 file changed, 78 insertions(+), 1 deletion(-) (limited to 'src/controllers') diff --git a/src/controllers/users_controller.rs b/src/controllers/users_controller.rs index 87a0b16..a3281de 100644 --- a/src/controllers/users_controller.rs +++ b/src/controllers/users_controller.rs @@ -22,6 +22,25 @@ fn index(flash: Option, conn: utils::DbConn) -> u } } +#[derive(BartDisplay)] +#[template = "templates/edit_user.html"] +pub struct EditUserTemplate { + user: ::models::User +} + +implement_responder_for!(EditUserTemplate); + +#[get("//edit")] +fn edit(id: i32, conn: utils::DbConn) -> utils::Page { + utils::Page { + title: String::from("Edit users"), + flash: None, + content: EditUserTemplate { + user: ::models::User::by_id(id, &conn).unwrap() + } + } +} + #[get("//delete")] fn delete(id: i32, route: &rocket::Route, conn: utils::DbConn) -> Flash { match ::models::User::delete(id, conn) { @@ -78,6 +97,21 @@ impl RegisterUserForm { }) } } + + fn attrs(&self) -> Result<::models::User, &'static str> { + if self.password != self.password_confirm { + Err("Passwords don't match") + } + else { + Ok(::models::User { + id: Default::default(), + username: self.username.clone(), + realname: self.realname.clone(), + email: self.email.clone(), + password: self.password.clone() + }) + } + } } #[post("/create", data="")] @@ -93,6 +127,49 @@ fn create(user: Form, route: &rocket::Route, conn: utils::DbCo } } +#[post("//update", data="")] +fn update(id: i32, user_form: Form, route: &rocket::Route, conn: utils::DbConn) -> Flash { + match user_form.get().attrs() { + Ok(attrs) => { + if let Ok(mut user) = ::models::User::by_id(id, &conn) { + if user.username != attrs.username { + user.username = attrs.username.clone(); + } + if user.realname != attrs.realname { + user.realname = attrs.realname.clone(); + } + if user.email != attrs.email { + user.email = attrs.email.clone(); + } + if !attrs.password.is_empty() && user.password != attrs.password { + user.password = attrs.password.clone(); + } + match ::models::User::update(&user, &conn) { + Ok(user) => Flash::success( + Redirect::to(route.base.path()), + format!("User {} updated successfully", user.username) + ), + Err(msg) => Flash::error( + Redirect::to(route.base.path()), + format!("User {} was not updated! {}", user.username, msg) + ) + + } + } + else { + Flash::error( + Redirect::to(route.base.path()), + "Can't delete users which does not exist" + ) + } + }, + Err(msg) => Flash::error( + Redirect::to(route.base.path()), + format!("Invalid form data: {}", msg) + ) + } +} + pub fn routes() -> Vec { - routes![index, new, create, delete] + routes![index, new, create, edit, update, delete] } -- cgit v1.2.3