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 ++++- templates/edit_user.html | 30 ++++++++++++++ templates/users.html | 5 ++- 4 files changed, 119 insertions(+), 4 deletions(-) create mode 100644 templates/edit_user.html 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) diff --git a/templates/edit_user.html b/templates/edit_user.html new file mode 100644 index 0000000..e1f379c --- /dev/null +++ b/templates/edit_user.html @@ -0,0 +1,30 @@ +
+
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ +
+
diff --git a/templates/users.html b/templates/users.html index 4656e88..3ed4aa6 100644 --- a/templates/users.html +++ b/templates/users.html @@ -12,7 +12,10 @@ {{ .username }} {{ .realname() }} {{ .email() }} - Delete + + Delete + Edit + {{/ users }} -- cgit v1.2.3