From f8f47cc3ff75d94040096df8cf26360efa0afe3f Mon Sep 17 00:00:00 2001 From: jakubmanczak Date: Sat, 7 Mar 2026 00:24:52 +0100 Subject: [PATCH] tag rename --- src/api/mod.rs | 3 ++- src/api/tags.rs | 19 +++++++++++++++++-- src/tags.rs | 7 +++++++ src/users/permissions.rs | 1 + 4 files changed, 27 insertions(+), 3 deletions(-) diff --git a/src/api/mod.rs b/src/api/mod.rs index 7703456..c26b791 100644 --- a/src/api/mod.rs +++ b/src/api/mod.rs @@ -1,7 +1,7 @@ use axum::{ Router, response::{IntoResponse, Response}, - routing::{delete, get, post}, + routing::{delete, get, patch, post}, }; use crate::{ @@ -36,6 +36,7 @@ pub fn api_router() -> Router { .route("/api/tags", get(tags::get_all)) .route("/api/tags", post(tags::create)) .route("/api/tags/{id}", get(tags::get_by_id)) + .route("/api/tags/{id}", patch(tags::rename)) .route("/api/tags/{id}", delete(tags::delete)) .route("/api/tags/#{name}", get(tags::get_by_name)) } diff --git a/src/api/tags.rs b/src/api/tags.rs index feaeec5..6f72285 100644 --- a/src/api/tags.rs +++ b/src/api/tags.rs @@ -19,6 +19,7 @@ use crate::{ const CANT_MAKE_TAGS: &str = "You don't have permission to create new tags."; const CANT_DEL_TAGS: &str = "You don't have permission to delete tags."; +const CANT_RENAME_TAGS: &str = "You don't have permission to rename tags."; const TAG_DELETED: &str = "Tag deleted successfully."; pub async fn get_all(headers: HeaderMap) -> Result { @@ -43,12 +44,12 @@ pub async fn get_by_name( } #[derive(Deserialize)] -pub struct NewTag { +pub struct TagNameForm { name: TagName, } pub async fn create( headers: HeaderMap, - Json(form): Json, + Json(form): Json, ) -> Result { let u = User::authenticate(&headers)?.required()?; if !u.has_permission(Permission::CreateTags)? { @@ -57,6 +58,20 @@ pub async fn create( Ok(Json(Tag::create(form.name)?).into_response()) } +pub async fn rename( + Path(id): Path, + headers: HeaderMap, + Json(form): Json, +) -> Result { + let u = User::authenticate(&headers)?.required()?; + if !u.has_permission(Permission::RenameTags)? { + return Ok((StatusCode::FORBIDDEN, CANT_RENAME_TAGS).into_response()); + } + let mut tag = Tag::get_by_id(id)?; + tag.rename(form.name)?; + Ok(Json(tag).into_response()) +} + pub async fn delete(Path(id): Path, headers: HeaderMap) -> Result { let u = User::authenticate(&headers)?.required()?; if !u.has_permission(Permission::DeleteTags)? { diff --git a/src/tags.rs b/src/tags.rs index 2ce1798..8645c55 100644 --- a/src/tags.rs +++ b/src/tags.rs @@ -69,6 +69,13 @@ impl Tag { .execute((id, &name))?; Ok(Tag { id, name }) } + pub fn rename(&mut self, name: TagName) -> Result<(), TagError> { + database::conn()? + .prepare("UPDATE tags SET tagname = ?1 WHERE id = ?2")? + .execute((&name, self.id))?; + self.name = name; + Ok(()) + } pub fn delete(self) -> Result<(), TagError> { database::conn()? .prepare("DELETE FROM tags WHERE id = ?1")? diff --git a/src/users/permissions.rs b/src/users/permissions.rs index 5103104..2313d58 100644 --- a/src/users/permissions.rs +++ b/src/users/permissions.rs @@ -12,6 +12,7 @@ pub enum Permission { ChangeOthersHandles, ManuallyCreateUsers, CreateTags, + RenameTags, DeleteTags, }