From 8dbeffddc9d71abd010e6f813e1fc66866a55ee4 Mon Sep 17 00:00:00 2001 From: Philippe Loctaux Date: Sun, 7 May 2023 18:59:00 +0200 Subject: [PATCH] admin/roles: update label --- crates/database/queries/roles/set_label.sql | 5 +++ crates/database/sqlx-data.json | 10 +++++ crates/database/src/tables/roles.rs | 18 ++++++++- crates/ezidam/src/routes/admin.rs | 1 + crates/ezidam/src/routes/admin/roles.rs | 42 +++++++++++++++++++++ crates/roles/src/database.rs | 6 +++ 6 files changed, 80 insertions(+), 2 deletions(-) create mode 100644 crates/database/queries/roles/set_label.sql diff --git a/crates/database/queries/roles/set_label.sql b/crates/database/queries/roles/set_label.sql new file mode 100644 index 0000000..bc91ac1 --- /dev/null +++ b/crates/database/queries/roles/set_label.sql @@ -0,0 +1,5 @@ +update roles + +set label = ? + +where name is ? \ No newline at end of file diff --git a/crates/database/sqlx-data.json b/crates/database/sqlx-data.json index e36b6f9..f6c905a 100644 --- a/crates/database/sqlx-data.json +++ b/crates/database/sqlx-data.json @@ -612,6 +612,16 @@ }, "query": "update users\n\nset paper_key = ?\n\nwhere id is ?" }, + "693c8c3de266cb3a8fc98bdea8e3b87de0dcb78316628d48f0e6efc0f8103040": { + "describe": { + "columns": [], + "nullable": [], + "parameters": { + "Right": 2 + } + }, + "query": "update roles\n\nset label = ?\n\nwhere name is ?" + }, "6ff12f357d884a50035d708577a7f3109a07a1ca193cb3082d13687af65c6de0": { "describe": { "columns": [], diff --git a/crates/database/src/tables/roles.rs b/crates/database/src/tables/roles.rs index d125570..00d1531 100644 --- a/crates/database/src/tables/roles.rs +++ b/crates/database/src/tables/roles.rs @@ -44,11 +44,25 @@ impl Roles { pub async fn set_archive_status( conn: impl SqliteExecutor<'_>, - id: &str, + name: &str, value: bool, ) -> Result, Error> { let query: SqliteQueryResult = - sqlx::query_file!("queries/roles/set_archive_status.sql", value, id) + sqlx::query_file!("queries/roles/set_archive_status.sql", value, name) + .execute(conn) + .await + .map_err(handle_error)?; + + Ok((query.rows_affected() == 1).then_some(())) + } + + pub async fn set_label( + conn: impl SqliteExecutor<'_>, + name: &str, + label: &str, + ) -> Result, Error> { + let query: SqliteQueryResult = + sqlx::query_file!("queries/roles/set_label.sql", label, name) .execute(conn) .await .map_err(handle_error)?; diff --git a/crates/ezidam/src/routes/admin.rs b/crates/ezidam/src/routes/admin.rs index cf621f9..9427717 100644 --- a/crates/ezidam/src/routes/admin.rs +++ b/crates/ezidam/src/routes/admin.rs @@ -42,6 +42,7 @@ pub fn routes() -> Vec { admin_roles_new_form, admin_roles_view, admin_roles_archive, + admin_roles_info_update, ] } diff --git a/crates/ezidam/src/routes/admin/roles.rs b/crates/ezidam/src/routes/admin/roles.rs index fd7e60d..2b78ccf 100644 --- a/crates/ezidam/src/routes/admin/roles.rs +++ b/crates/ezidam/src/routes/admin/roles.rs @@ -176,3 +176,45 @@ pub async fn admin_roles_archive( Ok(Flash::new(redirect, flash_kind, flash_message)) } + +#[derive(Debug, FromForm)] +pub struct UpdateRoleForm<'r> { + pub label: &'r str, +} + +#[post("/admin/roles//info", data = "
")] +pub async fn admin_roles_info_update( + _admin: JwtAdmin, + mut db: Connection, + id: RocketRoleID, + form: Form>, +) -> Result> { + let mut transaction = db.begin().await?; + + let role = Role::get_by_name(&mut transaction, &id.0) + .await? + .ok_or_else(|| Error::not_found("Could not find role"))?; + + if role.is_archived() { + return Err(Error::forbidden("Role is archived")); + } + + // Update label + if role.label() != form.label { + if let Err(e) = role.set_label(&mut transaction, form.label).await { + return Ok(Flash::new( + Redirect::to(uri!(admin_roles_view(id))), + FlashKind::Danger, + e.to_string(), + )); + } + } + + transaction.commit().await?; + + Ok(Flash::new( + Redirect::to(uri!(admin_roles_view(id))), + FlashKind::Success, + format!("Role has been updated."), + )) +} diff --git a/crates/roles/src/database.rs b/crates/roles/src/database.rs index 97deeb1..8e9f816 100644 --- a/crates/roles/src/database.rs +++ b/crates/roles/src/database.rs @@ -60,4 +60,10 @@ impl Role { Ok(()) } + + pub async fn set_label(&self, conn: impl SqliteExecutor<'_>, label: &str) -> Result<(), Error> { + DatabaseRoles::set_label(conn, self.name.as_ref(), label).await?; + + Ok(()) + } }