From f1f9859894923a8527420de1c4855ce5f3667e01 Mon Sep 17 00:00:00 2001 From: Stephan Richter Date: Fri, 8 Aug 2025 23:59:05 +0200 Subject: [PATCH] preparing for deletion of company --- .../umbrella/company/CompanyModule.java | 30 ++++++++++++++++++- frontend/src/routes/company/Index.svelte | 24 ++++++++++++++- translations/src/main/resources/de.json | 2 +- 3 files changed, 53 insertions(+), 3 deletions(-) diff --git a/company/src/main/java/de/srsoftware/umbrella/company/CompanyModule.java b/company/src/main/java/de/srsoftware/umbrella/company/CompanyModule.java index 113a76a..afad7fd 100644 --- a/company/src/main/java/de/srsoftware/umbrella/company/CompanyModule.java +++ b/company/src/main/java/de/srsoftware/umbrella/company/CompanyModule.java @@ -32,6 +32,34 @@ public class CompanyModule extends BaseHandler implements CompanyService { users = userService; } + private boolean deleteCompany(long companyId, UmbrellaUser user, HttpExchange ex) { + var company = get(companyId); + if (!membership(companyId,user.id())) throw forbidden("You are mot a member of company {0}",company.name()); + // TODO: check, whether company is referenced by a document + // TODO: check, whether company is referenced by a item + // TODO: check, whether company is referenced by a project + return false; + } + + @Override + public boolean doDelete(Path path, HttpExchange ex) throws IOException { + addCors(ex); + try { + Optional token = SessionToken.from(ex).map(Token::of); + var user = users.loadUser(token); + if (user.isEmpty()) return unauthorized(ex); + var head = path.pop(); + return switch (head) { + case null -> super.doDelete(path, ex); + default -> deleteCompany(Long.parseLong(head), user.get(), ex); + }; + } catch (NumberFormatException n) { + return send(ex,invalidFieldException(ID,"ID (Long)")); + } catch (UmbrellaException e) { + return send(ex,e); + } + } + @Override public boolean doGet(Path path, HttpExchange ex) throws IOException { addCors(ex); @@ -59,7 +87,7 @@ public class CompanyModule extends BaseHandler implements CompanyService { if (user.isEmpty()) return unauthorized(ex); var head = path.pop(); return switch (head) { - case null -> super.doGet(path, ex); + case null -> super.doPatch(path, ex); default -> patchCompany(Long.parseLong(head), user.get(), ex); }; } catch (NumberFormatException n) { diff --git a/frontend/src/routes/company/Index.svelte b/frontend/src/routes/company/Index.svelte index e21117f..41141ff 100644 --- a/frontend/src/routes/company/Index.svelte +++ b/frontend/src/routes/company/Index.svelte @@ -28,6 +28,21 @@ } } + async function drop(company){ + if (!confirm(t('confirm_delete',{element:company.name}))) return; + const url = api(`company/${company.id}`); + const resp = await fetch(url,{ + credentials : 'include', + method : 'DELETE' + }); + if (resp.ok){ + delete companies[company.id]; + error = null; + } else { + error = await resp.text(); + } + } + async function loadCompanies(){ const url = api('company/list'); const resp = await fetch(url,{credentials:'include'}); @@ -64,7 +79,10 @@ {t('email')} - {t('detail')} + {t('members')} + + + {t('actions')} @@ -76,6 +94,7 @@ + @@ -91,6 +110,9 @@ {/each} + + + {#if selected==cid} diff --git a/translations/src/main/resources/de.json b/translations/src/main/resources/de.json index 60ec5d8..b908391 100644 --- a/translations/src/main/resources/de.json +++ b/translations/src/main/resources/de.json @@ -45,7 +45,7 @@ "data_sent": "Daten übermittelt", "date": "Datum", "delete": "löschen", - "delete_task": "Aufgabe löschen ", + "delete_object": "{object} löschen", "DELETE_USERS": "Nutzer löschen", "delivery_date": "Lieferdatum", "description": "Beschreibung",