From 1cfaa3ccc60f05a897ebc2031c490e0a57817e74 Mon Sep 17 00:00:00 2001 From: Stephan Richter Date: Fri, 10 Oct 2025 14:41:03 +0200 Subject: [PATCH] altered contact/add in order to make use of the new contact backend instead of the legacy API Signed-off-by: Stephan Richter --- .../umbrella/contact/ContactDb.java | 2 -- .../srsoftware/umbrella/contact/SqliteDb.java | 1 - .../umbrella/core/model/Contact.java | 3 +- .../umbrella/documents/DocumentApi.java | 15 -------- .../documents/model/CustomerSettings.java | 3 +- .../src/Components/ContactSelector.svelte | 35 +++++++++++++++++-- frontend/src/routes/contact/Address.svelte | 14 ++++---- frontend/src/routes/document/Add.svelte | 6 ++-- frontend/src/vcard.js | 4 +-- 9 files changed, 47 insertions(+), 36 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..912919d 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,6 @@ 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 { 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..08f0b53 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; 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..4b37620 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,11 +5,10 @@ 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 { diff --git a/documents/src/main/java/de/srsoftware/umbrella/documents/DocumentApi.java b/documents/src/main/java/de/srsoftware/umbrella/documents/DocumentApi.java index 1c7b310..294a280 100644 --- a/documents/src/main/java/de/srsoftware/umbrella/documents/DocumentApi.java +++ b/documents/src/main/java/de/srsoftware/umbrella/documents/DocumentApi.java @@ -7,7 +7,6 @@ import static de.srsoftware.document.mustang.Constants.KEY_PDF; import static de.srsoftware.document.mustang.Constants.KEY_PRODUCER; import static de.srsoftware.document.mustang.Constants.KEY_TEMPLATE; import static de.srsoftware.document.zugferd.data.UnitCode.*; -import static de.srsoftware.tools.MimeType.MIME_FORM_URL; import static de.srsoftware.tools.MimeType.MIME_PDF; import static de.srsoftware.tools.Optionals.isSet; import static de.srsoftware.tools.Strings.escapeHtmlEntities; @@ -26,7 +25,6 @@ import static de.srsoftware.umbrella.core.ModuleRegistry.*; import static de.srsoftware.umbrella.core.Paths.*; import static de.srsoftware.umbrella.core.ResponseCode.HTTP_UNPROCESSABLE; import static de.srsoftware.umbrella.core.Util.mapValues; -import static de.srsoftware.umbrella.core.Util.request; import static de.srsoftware.umbrella.core.exceptions.UmbrellaException.*; import static de.srsoftware.umbrella.core.model.Document.State.NEW; import static de.srsoftware.umbrella.core.model.Document.State.SENT; @@ -67,7 +65,6 @@ import java.util.*; import java.util.function.Function; import java.util.function.Predicate; import java.util.stream.Stream; -import org.json.JSONArray; import org.json.JSONObject; public class DocumentApi extends BaseHandler implements DocumentService { @@ -141,7 +138,6 @@ public class DocumentApi extends BaseHandler implements DocumentService { if (user.isEmpty()) return unauthorized(ex); var head = path.pop(); return switch (head){ - case CONTACTS -> getContacts(ex,user.get(),token.orElse(null)); case PATH_TYPES -> getDocTypes(ex); case STATES -> getDocStates(ex); case null -> super.doGet(path,ex); @@ -207,10 +203,6 @@ public class DocumentApi extends BaseHandler implements DocumentService { } } - private boolean getContacts(HttpExchange ex, UmbrellaUser user, Token token) throws IOException, UmbrellaException { - return sendContent(ex,getLegacyContacts(ex,user,token)); - } - private boolean getDocStates(HttpExchange ex) throws IOException { var map = Stream.of(Document.State.values()).collect(toMap(Document.State::code, Document.State::name)); return sendContent(ex,map); @@ -376,13 +368,6 @@ public class DocumentApi extends BaseHandler implements DocumentService { return sendContent(ex,content.bytes()); } - private JSONArray getLegacyContacts(HttpExchange ex, UmbrellaUser umbrellaUser, Token token) throws IOException, UmbrellaException { - var location = config.get("umbrella.modules.contact.baseUrl").map(s -> s+"/json").orElseThrow(() -> new UmbrellaException(500,"umbrella.modules.contact.baseUrl not configured!")); - var resp = request(location, token.asMap(),MIME_FORM_URL,null); - if (!(resp instanceof String s && s.startsWith("["))) throw new UmbrellaException(500,"{0} did not return JSON Array!",location); - return new JSONArray(s); - } - public Map list(long companyId) throws UmbrellaException{ return db.listDocs(companyId); } 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/Components/ContactSelector.svelte b/frontend/src/Components/ContactSelector.svelte index 0a606ed..598a858 100644 --- a/frontend/src/Components/ContactSelector.svelte +++ b/frontend/src/Components/ContactSelector.svelte @@ -2,6 +2,7 @@ import {onMount} from 'svelte'; import {api} from '../urls.svelte.js'; + import {addr, email, extra, fn, name, org} from '../vcard.js'; import {t} from '../translations.svelte.js'; let { @@ -14,10 +15,40 @@ let value = 0; async function loadContacts(){ - const url = api('document/contacts'); + const url = api('contact/list'); const resp = await fetch(url,{ credentials: 'include'}); if (resp.ok){ - contacts = await resp.json(); + const json = await resp.json(); + contacts = Object.values(json).map(contact => { + contact.ADR = addr(contact.vcard); + contact.EMAIL = email(contact.vcard); + contact.N = name(contact.vcard); + contact.FN = fn(contact.vcard); + contact.ORG = org(contact.vcard); + const extras = contact.vcard.match(/^X-.*:.+/gm); + for (let ex of extras){ + ex = extra(ex); + switch (ex.name){ + case 'CUSTOMER-NUMBER': + contact.customer_number = ex.value; + break; + case 'TAX-NUMBER': + contact.tax_id = ex.value; + break; + case 'BANK-ACCOUNT': + contact.bank_account = ex.value; + break; + case 'COURT': + contact.local_court = ex.value; + break; + default: + console.log(ex); + } + } + delete contact.vcard; + console.log(contact); + return contact; + }) } else { message = await resp.text(); } diff --git a/frontend/src/routes/contact/Address.svelte b/frontend/src/routes/contact/Address.svelte index c61b5a7..9fa4576 100644 --- a/frontend/src/routes/contact/Address.svelte +++ b/frontend/src/routes/contact/Address.svelte @@ -36,11 +36,11 @@ - onSet(address.box,newVal)} title={t('post_box')} /> - onSet(address.ext,newVal)} title={t('extended_address')} /> - onSet(address.street,newVal)} title={t('street')} /> - onSet(address.code,newVal)} title={t('post_code')} /> - onSet(address.loc,newVal)} title={t('locality')} /> - onSet(address.region,newVal)} title={t('region')} /> - onSet(address.country,newVal)} title={t('country')} /> + onSet(address.box,newVal)} title={t('post_box')} /> + onSet(address.ext,newVal)} title={t('extended_address')} /> + onSet(address.street,newVal)} title={t('street')} /> + onSet(address.post_code,newVal)} title={t('post_code')} /> + onSet(address.locality,newVal)} title={t('locality')} /> + onSet(address.region,newVal)} title={t('region')} /> + onSet(address.country,newVal)} title={t('country')} /> \ No newline at end of file diff --git a/frontend/src/routes/document/Add.svelte b/frontend/src/routes/document/Add.svelte index 7464039..a83608c 100644 --- a/frontend/src/routes/document/Add.svelte +++ b/frontend/src/routes/document/Add.svelte @@ -68,9 +68,9 @@ if (contact.ADR.locality) addr += contact.ADR.post_code + " "+ contact.ADR.locality + "\n"; if (contact.ADR.county) addr += contact.ADR.country+"\n"; document.customer.name = addr; - document.customer.tax_id = contact['X-TAX-NUMBER']; - document.customer.id = contact['X-CUSTOMER-NUMBER']; - document.customer.email = contact.EMAIL.val; + document.customer.tax_id = contact.tax_id; + document.customer.id = contact.customer_number; + document.customer.email = contact.EMAIL; } async function submit(){ diff --git a/frontend/src/vcard.js b/frontend/src/vcard.js index a71b102..7d7c6e7 100644 --- a/frontend/src/vcard.js +++ b/frontend/src/vcard.js @@ -14,9 +14,9 @@ export function addr(vcard){ adr.box = parts[0]; adr.ext = parts[1]; adr.street = parts[2]; - adr.loc = parts[3]; + adr.locality = parts[3]; adr.region = parts[4]; - adr.code = parts[5]; + adr.post_code = parts[5]; adr.country = parts[6]; } return adr;