From 3e8f90c5bc5be930c5f3925f34f32419596c97f9 Mon Sep 17 00:00:00 2001 From: Stephan Richter Date: Fri, 10 Oct 2025 10:24:38 +0200 Subject: [PATCH] completed new contact creation, implemented contact deletion --- .../umbrella/contact/ContactDb.java | 4 +-- .../umbrella/contact/ContactModule.java | 27 ++++++++++++++++-- .../srsoftware/umbrella/contact/SqliteDb.java | 12 +++++++- .../umbrella/core/model/Contact.java | 13 ++++----- .../documents/model/CustomerSettings.java | 3 +- frontend/src/routes/contact/Card.svelte | 28 ++++++++++++++++++- 6 files changed, 72 insertions(+), 15 deletions(-) diff --git a/contact/src/main/java/de/srsoftware/umbrella/contact/ContactDb.java b/contact/src/main/java/de/srsoftware/umbrella/contact/ContactDb.java index 2aa9b56..5ab3744 100644 --- a/contact/src/main/java/de/srsoftware/umbrella/contact/ContactDb.java +++ b/contact/src/main/java/de/srsoftware/umbrella/contact/ContactDb.java @@ -3,11 +3,11 @@ package de.srsoftware.umbrella.contact; import de.srsoftware.umbrella.core.exceptions.UmbrellaException; import de.srsoftware.umbrella.core.model.Contact; -import de.srsoftware.umbrella.core.model.UmbrellaUser; - import java.util.Map; public interface ContactDb { + void drop(Contact contact); + Map listContactsOf(long userId) throws UmbrellaException; Contact load(long id, long userId); diff --git a/contact/src/main/java/de/srsoftware/umbrella/contact/ContactModule.java b/contact/src/main/java/de/srsoftware/umbrella/contact/ContactModule.java index 9d367e0..3345ae7 100644 --- a/contact/src/main/java/de/srsoftware/umbrella/contact/ContactModule.java +++ b/contact/src/main/java/de/srsoftware/umbrella/contact/ContactModule.java @@ -33,6 +33,30 @@ public class ContactModule extends BaseHandler implements ContactService { ModuleRegistry.add(this); } + private boolean deleteContact(long id, UmbrellaUser user, HttpExchange ex) throws IOException { + var contact = contactDb.load(id, user.id()); + contactDb.drop(contact); + return sendEmptyResponse(200,ex); + } + + @Override + public boolean doDelete(Path path, HttpExchange ex) throws IOException { + addCors(ex); + try { + var user = userService().refreshSession(ex); + if (user.isEmpty()) return unauthorized(ex); + var head = path.pop(); + try { + var id = Long.parseLong(head); + return deleteContact(id, user.get(), ex); + } catch (Exception ignored){ + return super.doPatch(path,ex); + } + } catch (UmbrellaException e) { + return send(ex,e); + } + } + @Override public boolean doGet(Path path, HttpExchange ex) throws IOException { addCors(ex); @@ -54,8 +78,7 @@ public class ContactModule extends BaseHandler implements ContactService { public boolean doPatch(Path path, HttpExchange ex) throws IOException { addCors(ex); try { - Optional token = SessionToken.from(ex).map(Token::of); - var user = userService().loadUser(token); + var user = userService().refreshSession(ex); if (user.isEmpty()) return unauthorized(ex); var head = path.pop(); try { diff --git a/contact/src/main/java/de/srsoftware/umbrella/contact/SqliteDb.java b/contact/src/main/java/de/srsoftware/umbrella/contact/SqliteDb.java index 7f545a9..d2f8494 100644 --- a/contact/src/main/java/de/srsoftware/umbrella/contact/SqliteDb.java +++ b/contact/src/main/java/de/srsoftware/umbrella/contact/SqliteDb.java @@ -9,7 +9,6 @@ import static de.srsoftware.umbrella.contact.Constants.*; import static de.srsoftware.umbrella.core.Constants.*; import static de.srsoftware.umbrella.core.exceptions.UmbrellaException.databaseException; import static de.srsoftware.umbrella.core.exceptions.UmbrellaException.notFound; -import static java.lang.System.Logger.Level.ERROR; import static java.text.MessageFormat.format; import de.srsoftware.tools.jdbc.Query; @@ -59,6 +58,17 @@ public class SqliteDb extends BaseDb implements ContactDb{ } } + @Override + public void drop(Contact contact) { + try { + db.setAutoCommit(false); + Query.delete().from(TABLE_CONTACTS).where(ID,equal(contact.id())).execute(db); + Query.delete().from(TABLE_CONTACTS_USERS).where(CONTACT_ID,equal(contact.id())).execute(db); + db.setAutoCommit(true); + } catch (SQLException e){ + throw databaseException("Failed to remove contact {0}",contact.id()); + } + } @Override public Map listContactsOf(long userId) throws UmbrellaException{ diff --git a/core/src/main/java/de/srsoftware/umbrella/core/model/Contact.java b/core/src/main/java/de/srsoftware/umbrella/core/model/Contact.java index c202e04..c0c6c54 100644 --- a/core/src/main/java/de/srsoftware/umbrella/core/model/Contact.java +++ b/core/src/main/java/de/srsoftware/umbrella/core/model/Contact.java @@ -5,25 +5,24 @@ import static de.srsoftware.umbrella.core.Constants.*; import static de.srsoftware.umbrella.core.exceptions.UmbrellaException.missingFieldException; import de.srsoftware.tools.Mappable; -import org.json.JSONObject; - import java.sql.ResultSet; import java.sql.SQLException; import java.util.Map; +import org.json.JSONObject; public record Contact(long id, String vcard) implements Mappable { public static Contact of(ResultSet rs) throws SQLException { return new Contact(rs.getLong(ID),rs.getString(DATA)); } - @Override - public Map toMap() { - return Map.of(ID,id,VCARD,vcard); - } - public Contact patch(JSONObject json) { if (!(json.get(FROM) instanceof String from)) throw missingFieldException(FROM); if (!(json.get(TO) instanceof String to)) throw missingFieldException(TO); return new Contact(id,vcard.replace(from, to)); } + + @Override + public Map toMap() { + return Map.of(ID,id,VCARD,vcard); + } } diff --git a/documents/src/main/java/de/srsoftware/umbrella/documents/model/CustomerSettings.java b/documents/src/main/java/de/srsoftware/umbrella/documents/model/CustomerSettings.java index e2b392a..d6527a0 100644 --- a/documents/src/main/java/de/srsoftware/umbrella/documents/model/CustomerSettings.java +++ b/documents/src/main/java/de/srsoftware/umbrella/documents/model/CustomerSettings.java @@ -5,12 +5,11 @@ package de.srsoftware.umbrella.documents.model; import static de.srsoftware.umbrella.core.Constants.*; import de.srsoftware.tools.Mappable; -import org.json.JSONObject; - import java.sql.ResultSet; import java.sql.SQLException; import java.util.HashSet; import java.util.Map; +import org.json.JSONObject; public class CustomerSettings implements Mappable { private static final System.Logger LOG = System.getLogger(CustomerSettings.class.getSimpleName()); diff --git a/frontend/src/routes/contact/Card.svelte b/frontend/src/routes/contact/Card.svelte index 435dd56..6516216 100644 --- a/frontend/src/routes/contact/Card.svelte +++ b/frontend/src/routes/contact/Card.svelte @@ -1,6 +1,7 @@ +{#if contact}
{#if contact.id} @@ -57,6 +79,9 @@ {t('new_contact')} {/if} + {#if contact.id} + + {/if} @@ -124,4 +149,5 @@
-
\ No newline at end of file + +{/if} \ No newline at end of file