From 2f3a29d6067908a9f10e65610c3171360d932a63 Mon Sep 17 00:00:00 2001 From: Stephan Richter Date: Wed, 8 Oct 2025 16:02:40 +0200 Subject: [PATCH] working on patching vcards --- .../umbrella/contact/ContactDb.java | 7 ++++- .../umbrella/contact/ContactModule.java | 24 +++++++++++++++ .../srsoftware/umbrella/contact/SqliteDb.java | 21 +++++++++++++ .../srsoftware/umbrella/core/Constants.java | 2 ++ .../umbrella/core/model/Contact.java | 9 ++++++ frontend/src/routes/contact/Card.svelte | 30 +++++++++++++++++-- frontend/src/routes/contact/FN.svelte | 12 ++++++-- 7 files changed, 98 insertions(+), 7 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 4d3921e..bb30981 100644 --- a/contact/src/main/java/de/srsoftware/umbrella/contact/ContactDb.java +++ b/contact/src/main/java/de/srsoftware/umbrella/contact/ContactDb.java @@ -3,8 +3,13 @@ package de.srsoftware.umbrella.contact; import de.srsoftware.umbrella.core.exceptions.UmbrellaException; import de.srsoftware.umbrella.core.model.Contact; + import java.util.Map; public interface ContactDb { - Map listContactsOf(long id) throws UmbrellaException; + Map listContactsOf(long userId) throws UmbrellaException; + + Contact load(long id, long userId); + + Contact save(Contact contact); } 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 68162c0..3c86d8b 100644 --- a/contact/src/main/java/de/srsoftware/umbrella/contact/ContactModule.java +++ b/contact/src/main/java/de/srsoftware/umbrella/contact/ContactModule.java @@ -50,6 +50,30 @@ public class ContactModule extends BaseHandler implements ContactService { } } + @Override + 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); + if (user.isEmpty()) return unauthorized(ex); + var head = path.pop(); + try { + var id = Long.parseLong(head); + return patchContact(id, user.get(), ex); + } catch (Exception ignored){ + return super.doPatch(path,ex); + } + } catch (UmbrellaException e) { + return send(ex,e); + } + } + + private boolean patchContact(long id, UmbrellaUser user, HttpExchange ex) throws IOException { + var contact = contactDb.load(id, user.id()).patch(json(ex)); + return sendContent(ex,contactDb.save(contact).toMap()); + } + private boolean getContacts(UmbrellaUser user, HttpExchange ex) throws IOException { return sendContent(ex,mapValues(listContactsOf(user))); } 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 96ee13e..a5f2adb 100644 --- a/contact/src/main/java/de/srsoftware/umbrella/contact/SqliteDb.java +++ b/contact/src/main/java/de/srsoftware/umbrella/contact/SqliteDb.java @@ -7,6 +7,8 @@ import static de.srsoftware.tools.jdbc.Query.select; 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.umbrella.core.BaseDb; @@ -72,4 +74,23 @@ public class SqliteDb extends BaseDb implements ContactDb{ } } + @Override + public Contact load(long id, long userId) { + try { + var rs = select(ALL).from(TABLE_CONTACTS).leftJoin(ID,TABLE_CONTACTS_USERS,CONTACT_ID).where(USER_ID,equal(userId)).where(ID,equal(id)).exec(db); + Contact contact = null; + if (rs.next()) contact = Contact.of(rs); + rs.close(); + if (contact != null) return contact; + throw notFound("Failed to load contact with id = {0}",id); + } catch (SQLException e) { + throw databaseException("Failed to load contacts of user {0}",userId); + } + } + + @Override + public Contact save(Contact contact) { + LOG.log(ERROR,"Save not implemented!"); + return contact; + } } diff --git a/core/src/main/java/de/srsoftware/umbrella/core/Constants.java b/core/src/main/java/de/srsoftware/umbrella/core/Constants.java index 7ab37d8..172884a 100644 --- a/core/src/main/java/de/srsoftware/umbrella/core/Constants.java +++ b/core/src/main/java/de/srsoftware/umbrella/core/Constants.java @@ -99,6 +99,7 @@ public class Constants { public static final String FIELD_TYPE_PREFIX = "type_prefix"; public static final String FIELD_TYPE_SUFFIX = "type_suffix"; public static final String FIELD_UNIT = "unit"; + public static final String FROM = "from"; public static final String FULLTEXT = "fulltext"; public static final String GET = "GET"; @@ -168,6 +169,7 @@ public class Constants { public static final String THEME = "theme"; public static final String TITLE = "title"; public static final String TIMESTAMP = "timestamp"; + public static final String TO = "to"; public static final String TOKEN = "token"; public static final String TOTAL_PRIO = "total_prio"; public static final String TYPE = "type"; 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 a62e951..c202e04 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 @@ -2,8 +2,11 @@ package de.srsoftware.umbrella.core.model; 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; @@ -17,4 +20,10 @@ public record Contact(long id, String vcard) implements Mappable { 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)); + } } diff --git a/frontend/src/routes/contact/Card.svelte b/frontend/src/routes/contact/Card.svelte index ee412b4..39a012a 100644 --- a/frontend/src/routes/contact/Card.svelte +++ b/frontend/src/routes/contact/Card.svelte @@ -1,5 +1,8 @@ {#if name} -{name} + {/if} \ No newline at end of file