From acfd8a6d72d1c787415b6efc0635faf78ed3b990 Mon Sep 17 00:00:00 2001 From: jmanczak Date: Thu, 9 Apr 2026 22:19:41 +0200 Subject: [PATCH] tag deletion --- src/web/pages/mod.rs | 2 ++ src/web/pages/tags.rs | 28 +++++++++++++++++++++++++++- 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/src/web/pages/mod.rs b/src/web/pages/mod.rs index 243db27..355765a 100644 --- a/src/web/pages/mod.rs +++ b/src/web/pages/mod.rs @@ -27,8 +27,10 @@ pub fn pages() -> Router { .route("/users/{id}", get(users::profile::page)) .route("/users/create", get(users::create::page)) .route("/users/create-form", post(users::create::create_user)) + // .route("/tags", get(tags::page)) .route("/tags/create", post(tags::create)) + .route("/tags/{id}/delete", post(tags::delete_tag)) // .route("/persons", get(persons::page)) .route("/persons/create", post(persons::create)) diff --git a/src/web/pages/tags.rs b/src/web/pages/tags.rs index 54fe196..fd23dc9 100644 --- a/src/web/pages/tags.rs +++ b/src/web/pages/tags.rs @@ -1,11 +1,12 @@ use axum::{ Form, - extract::Request, + extract::{Path, Request}, http::HeaderMap, response::{IntoResponse, Redirect, Response}, }; use maud::{PreEscaped, html}; use serde::Deserialize; +use uuid::Uuid; use crate::{ database::{self}, @@ -62,6 +63,13 @@ pub async fn page(req: Request) -> Result { // div class="ml-2" {} // "0" span class="*:size-3 ml-1 text-neutral-400" {(PreEscaped(icons::FILE_IMAGE))} } + @if let Ok(0) = tag.get_tagged_quotes_count(&conn) { + form action=(format!("/tags/{}/delete", tag.id)) method="post" class="flex items-center ml-1" { + button type="submit" class="text-neutral-500 hover:text-red-400 text-sm flex items-center justify-center cursor-pointer" title="Delete" { + "✕" + } + } + } } } } @@ -112,3 +120,21 @@ pub async fn create( tx.commit()?; Ok(Redirect::to("/tags").into_response()) } + +pub async fn delete_tag( + Path(id): Path, + headers: HeaderMap, +) -> Result { + let u = User::authenticate(&headers)?.required()?; + let mut conn = database::conn()?; + let tx = conn.transaction()?; + + let t = Tag::get_by_id(&tx, id)?; + let name = t.name.as_str().to_string(); + t.delete(&tx)?; + + LogEntry::new(&tx, u, LogAction::DeleteTag { id, name })?; + tx.commit()?; + + Ok(Redirect::to("/tags").into_response()) +}