From 86801e10c2ae218fd6f0b23bfc293c9fc8231688 Mon Sep 17 00:00:00 2001 From: Stephan Richter Date: Fri, 11 Jul 2025 14:23:47 +0200 Subject: [PATCH] implemented markdown renderer in backend and frontend --- backend/build.gradle.kts | 1 + .../umbrella/backend/Application.java | 5 ++- .../srsoftware/umbrella/core/BaseHandler.java | 1 + frontend/src/Components/MarkdownEditor.svelte | 17 +++++++- markdown/build.gradle.kts | 6 +++ .../umbrella/markdown/MarkdownApi.java | 40 +++++++++++++++++++ settings.gradle.kts | 4 +- 7 files changed, 70 insertions(+), 4 deletions(-) create mode 100644 markdown/build.gradle.kts create mode 100644 markdown/src/main/java/de/srsoftware/umbrella/markdown/MarkdownApi.java diff --git a/backend/build.gradle.kts b/backend/build.gradle.kts index 1ac11cb..13a7a1b 100644 --- a/backend/build.gradle.kts +++ b/backend/build.gradle.kts @@ -16,6 +16,7 @@ dependencies{ implementation(project(":core")) implementation(project(":documents")) implementation(project(":legacy")) + implementation(project(":markdown")) implementation(project(":messages")) implementation(project(":translations")) implementation(project(":user")) diff --git a/backend/src/main/java/de/srsoftware/umbrella/backend/Application.java b/backend/src/main/java/de/srsoftware/umbrella/backend/Application.java index a463dea..fa23c71 100644 --- a/backend/src/main/java/de/srsoftware/umbrella/backend/Application.java +++ b/backend/src/main/java/de/srsoftware/umbrella/backend/Application.java @@ -13,6 +13,7 @@ import de.srsoftware.umbrella.core.Util; import de.srsoftware.umbrella.core.exceptions.UmbrellaException; import de.srsoftware.umbrella.documents.DocumentApi; import de.srsoftware.umbrella.legacy.LegacyApi; +import de.srsoftware.umbrella.markdown.MarkdownApi; import de.srsoftware.umbrella.message.MessageApi; import de.srsoftware.umbrella.message.MessageSystem; import de.srsoftware.umbrella.translations.Translations; @@ -57,14 +58,16 @@ public class Application { var companyModule = new CompanyModule(config, userModule); var documentApi = new DocumentApi(companyModule, config); var legacyApi = new LegacyApi(userModule.userDb(),config); + var markdownApi = new MarkdownApi(userModule); var messageApi = new MessageApi(messageSystem); var webHandler = new WebHandler(); documentApi .bindPath("/api/document") .on(server); - legacyApi .bindPath("/legacy") .on(server); + markdownApi .bindPath("/api/markdown") .on(server); messageApi .bindPath("/api/messages") .on(server); translationModule.bindPath("/api/translations").on(server); userModule .bindPath("/api/user") .on(server); + legacyApi .bindPath("/legacy") .on(server); webHandler .bindPath("/") .on(server); server.setExecutor(Executors.newFixedThreadPool(threads)); diff --git a/core/src/main/java/de/srsoftware/umbrella/core/BaseHandler.java b/core/src/main/java/de/srsoftware/umbrella/core/BaseHandler.java index 851749a..6264d83 100644 --- a/core/src/main/java/de/srsoftware/umbrella/core/BaseHandler.java +++ b/core/src/main/java/de/srsoftware/umbrella/core/BaseHandler.java @@ -11,6 +11,7 @@ import com.sun.net.httpserver.HttpExchange; import de.srsoftware.tools.Path; import de.srsoftware.tools.PathHandler; import de.srsoftware.umbrella.core.exceptions.UmbrellaException; + import java.io.ByteArrayOutputStream; import java.io.IOException; import java.util.List; diff --git a/frontend/src/Components/MarkdownEditor.svelte b/frontend/src/Components/MarkdownEditor.svelte index 3f86d42..4b2fa27 100644 --- a/frontend/src/Components/MarkdownEditor.svelte +++ b/frontend/src/Components/MarkdownEditor.svelte @@ -2,8 +2,9 @@ let { editable = false, value = $bindable(null) } = $props(); let editing = $state(false); - let editValue = {source:value.source,rendered:value.rendered}; + let editValue = $state({source:value.source,rendered:value.rendered}); + let timer = null; function applyEdit(){ value.source = editValue.source; value.rendered = editValue.rendered; @@ -19,10 +20,22 @@ editing = editable; } + async function render(){ + const url = `${location.protocol}//${location.host.replace('5173','8080')}/api/markdown/render`; + const resp = await fetch(url,{ + credentials: 'include', + method: 'POST', + body: editValue.source + }); + editValue.rendered = await resp.text(); + } + function typed(ev){ if (ev.keyCode == 13 && ev.ctrlKey) applyEdit(); if (ev.keyCode == 27) resetEdit(); + if (timer) clearTimeout(timer); + timer = setTimeout(render,1000); // TODO: start timer, send text to renderer, update editValue.rendered } @@ -37,4 +50,4 @@ {#if editable && editing} {/if} -
{@html value.rendered}
+
{@html editValue.rendered}
diff --git a/markdown/build.gradle.kts b/markdown/build.gradle.kts new file mode 100644 index 0000000..3fa97bf --- /dev/null +++ b/markdown/build.gradle.kts @@ -0,0 +1,6 @@ +description = "Umbrella : MarkdownCompanies renderer" + +dependencies{ + implementation(project(":core")) + implementation("de.srsoftware:tools.mime:1.1.2") +} \ No newline at end of file diff --git a/markdown/src/main/java/de/srsoftware/umbrella/markdown/MarkdownApi.java b/markdown/src/main/java/de/srsoftware/umbrella/markdown/MarkdownApi.java new file mode 100644 index 0000000..00c5214 --- /dev/null +++ b/markdown/src/main/java/de/srsoftware/umbrella/markdown/MarkdownApi.java @@ -0,0 +1,40 @@ +package de.srsoftware.umbrella.markdown; + +import com.sun.net.httpserver.HttpExchange; +import de.srsoftware.tools.Path; +import de.srsoftware.tools.SessionToken; +import de.srsoftware.umbrella.core.BaseHandler; +import de.srsoftware.umbrella.core.Util; +import de.srsoftware.umbrella.core.api.UserService; +import de.srsoftware.umbrella.core.exceptions.UmbrellaException; +import de.srsoftware.umbrella.core.model.Token; + +import java.io.IOException; +import java.util.Optional; + +import static de.srsoftware.tools.MimeType.MIME_HTML; + +public class MarkdownApi extends BaseHandler { + + private final UserService users; + + public MarkdownApi(UserService userService) { + users = userService; + } + + @Override + public boolean doPost(Path path, HttpExchange ex) throws IOException { + try { + addCors(ex); + Optional token = SessionToken.from(ex).map(Token::of); + var user = users.loadUser(token); + + if (user.isEmpty()) throw UmbrellaException.forbidden("You must be logged in to use the markdown renderer!"); + var rendered = Util.markdown(body(ex)); + ex.getResponseHeaders().add(CONTENT_TYPE,MIME_HTML); + return sendContent(ex,rendered); + } catch (UmbrellaException e){ + return send(ex,e); + } + } +} diff --git a/settings.gradle.kts b/settings.gradle.kts index c622015..8f76ca9 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -10,4 +10,6 @@ include("user") include("web") include("company") -include("contact") \ No newline at end of file +include("contact") + +include("markdown") \ No newline at end of file