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 ++++++++++++++++++++++++++++++++++++- src/models/user.rs | 9 ++++- 2 files changed, 85 insertions(+), 3 deletions(-) (limited to 'src') 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] } diff --git a/src/models/user.rs b/src/models/user.rs index 9587fd3..82a359b 100644 --- a/src/models/user.rs +++ b/src/models/user.rs @@ -18,10 +18,10 @@ impl User { users.load::(&*conn) } - pub fn by_id(user_id: i32, conn: utils::DbConn) -> QueryResult { + pub fn by_id(user_id: i32, conn: &utils::DbConn) -> QueryResult { use schema::users::dsl::*; users.filter(id.eq(user_id)) - .load::(&*conn) + .load::(&**conn) .map(|ref v| v[0].clone()) } @@ -38,6 +38,11 @@ impl User { .get_result(&*conn) } + pub fn update(user: &User, conn: &utils::DbConn) -> QueryResult { + use ::schema::users::dsl::*; + user.save_changes(&*conn) + } + pub fn delete(user_id: i32, conn: utils::DbConn) -> QueryResult { use ::schema::users::dsl::*; diesel::delete(users.filter(id.eq(user_id))).get_result::(&*conn) -- cgit v1.2.3