From 3f98a10df8d8d192d1548021236915fc9147e953 Mon Sep 17 00:00:00 2001 From: jmanczak Date: Thu, 9 Apr 2026 19:29:12 +0200 Subject: [PATCH] name delete if 0 attributions --- src/logs.rs | 13 ++++++++++- src/persons/mod.rs | 10 ++++++++ src/web/pages/mod.rs | 1 + src/web/pages/persons/profile.rs | 40 ++++++++++++++++++++++++++++++-- 4 files changed, 61 insertions(+), 3 deletions(-) diff --git a/src/logs.rs b/src/logs.rs index 11ca89a..4b3f1a1 100644 --- a/src/logs.rs +++ b/src/logs.rs @@ -97,6 +97,12 @@ pub enum LogAction { pn: String, // primary name nn: String, // new name }, + DeletePersonName { + pid: Uuid, + nid: Uuid, + pn: String, + n: String, + }, SetPersonPrimaryName { pid: Uuid, // person id nid: Uuid, // name id @@ -123,7 +129,9 @@ impl LogAction { | Self::RenameTag { id, .. } | Self::DeleteTag { id, .. } | Self::ManuallyChangeUsersPassword { id } => Some(*id), - Self::AddPersonName { pid, .. } | Self::SetPersonPrimaryName { pid, .. } => Some(*pid), + Self::AddPersonName { pid, .. } + | Self::DeletePersonName { pid, .. } + | Self::SetPersonPrimaryName { pid, .. } => Some(*pid), } } pub fn get_humanreadable_payload(&self) -> String { @@ -154,6 +162,9 @@ impl LogAction { LogAction::AddPersonName { pid, nid, pn, nn } => { format!("Added name \"{nn}\" to ~{pn} (pid: {pid}; nid: {nid})") } + LogAction::DeletePersonName { pid, nid, pn, n } => { + format!("Deleted name \"{n}\" from ~{pn} (pid: {pid}; nid: {nid})") + } LogAction::SetPersonPrimaryName { pid, nid, on, nn } => { format!("~{on} now has primary name \"{nn}\" (pid: {pid}; nid: {nid})") } diff --git a/src/persons/mod.rs b/src/persons/mod.rs index 9c7d702..f4a04a9 100644 --- a/src/persons/mod.rs +++ b/src/persons/mod.rs @@ -171,6 +171,16 @@ impl Name { })? .collect::, _>>()?) } + pub fn times_attributed(&self, conn: &Connection) -> Result { + Ok(conn + .prepare("SELECT COUNT(*) FROM lines WHERE name_id = ?1")? + .query_row((&self.id,), |r| r.get(0))?) + } + pub fn delete(self, conn: &Connection) -> Result<(), PersonError> { + conn.prepare("DELETE FROM names WHERE id = ?1")? + .execute((&self.id,))?; + Ok(()) + } pub fn set_primary(&mut self, conn: &Connection) -> Result<(), PersonError> { if self.is_primary { return Err(PersonError::AlreadyPrimary); diff --git a/src/web/pages/mod.rs b/src/web/pages/mod.rs index 7cbf278..243db27 100644 --- a/src/web/pages/mod.rs +++ b/src/web/pages/mod.rs @@ -34,6 +34,7 @@ pub fn pages() -> Router { .route("/persons/create", post(persons::create)) .route("/persons/{id}", get(persons::profile::page)) .route("/persons/{id}/add-name", post(persons::profile::add_name)) + .route("/names/{id}/delete", post(persons::profile::delete_name)) // .route("/logs", get(logs::page)) // diff --git a/src/web/pages/persons/profile.rs b/src/web/pages/persons/profile.rs index e9728a7..a413ea0 100644 --- a/src/web/pages/persons/profile.rs +++ b/src/web/pages/persons/profile.rs @@ -12,7 +12,7 @@ use crate::{ database, error::CompositeError, logs::{LogAction, LogEntry}, - persons::Person, + persons::{Name, Person}, users::{ User, auth::{AuthError, UserAuthRequired, UserAuthenticate}, @@ -29,7 +29,7 @@ pub async fn page(Path(id): Path, req: Request) -> Result format!("~{} | Mnemosyne", p.primary_name), - Err(_) => "Error!".into(), + Err(_) => "Error! | Mnemosyne".into(), }; Ok(base( @@ -53,6 +53,13 @@ pub async fn page(Path(id): Path, req: Request) -> Result, + headers: HeaderMap, +) -> Result { + let u = User::authenticate(&headers)?.required()?; + let mut conn = database::conn()?; + let tx = conn.transaction()?; + + let n = Name::get_by_id(&tx, id)?; + let p = Person::get_by_id(&tx, n.person_id)?; + + let nn = n.name.clone(); + n.delete(&tx)?; + + LogEntry::new( + &tx, + u, + LogAction::DeletePersonName { + pid: p.id, + nid: id, + pn: p.primary_name, + n: nn, + }, + )?; + tx.commit()?; + + Ok(Redirect::to(&format!("/persons/{}", p.id)).into_response()) +}