From 3627ccee739a758a1fc4003b291714a468972094 Mon Sep 17 00:00:00 2001 From: Stephan Richter Date: Tue, 9 Sep 2025 16:19:03 +0200 Subject: [PATCH] working on wiki index Signed-off-by: Stephan Richter --- .../umbrella/core/model/WikiPage.java | 21 +++++++++++ frontend/src/App.svelte | 2 + frontend/src/routes/wiki/Index.svelte | 37 +++++++++++++++++++ .../srsoftware/umbrella/wiki/Constants.java | 2 +- .../de/srsoftware/umbrella/wiki/SqliteDb.java | 26 ++++++++----- .../de/srsoftware/umbrella/wiki/WikiDb.java | 8 +--- .../srsoftware/umbrella/wiki/WikiModule.java | 34 +++++++++++++++++ 7 files changed, 113 insertions(+), 17 deletions(-) create mode 100644 core/src/main/java/de/srsoftware/umbrella/core/model/WikiPage.java create mode 100644 frontend/src/routes/wiki/Index.svelte diff --git a/core/src/main/java/de/srsoftware/umbrella/core/model/WikiPage.java b/core/src/main/java/de/srsoftware/umbrella/core/model/WikiPage.java new file mode 100644 index 0000000..280d0eb --- /dev/null +++ b/core/src/main/java/de/srsoftware/umbrella/core/model/WikiPage.java @@ -0,0 +1,21 @@ +package de.srsoftware.umbrella.core.model; + +import de.srsoftware.tools.Mappable; + +import java.util.Map; + +import static de.srsoftware.umbrella.core.Constants.ID; + +public class WikiPage implements Mappable { + + private final long id; + + public WikiPage(long id){ + this.id = id; + } + + @Override + public Map toMap() { + return Map.of(ID,id); + } +} diff --git a/frontend/src/App.svelte b/frontend/src/App.svelte index 6bf3976..550b608 100644 --- a/frontend/src/App.svelte +++ b/frontend/src/App.svelte @@ -32,6 +32,7 @@ import ViewDoc from "./routes/document/View.svelte"; import ViewPrj from "./routes/project/View.svelte"; import ViewTask from "./routes/task/View.svelte"; + import WikiIndex from "./routes/wiki/Index.svelte"; let translations_ready = $state(false); @@ -87,6 +88,7 @@ + Not found! diff --git a/frontend/src/routes/wiki/Index.svelte b/frontend/src/routes/wiki/Index.svelte new file mode 100644 index 0000000..b56896d --- /dev/null +++ b/frontend/src/routes/wiki/Index.svelte @@ -0,0 +1,37 @@ + + +{#if error} +{error} +{/if} +

{t('wiki')}

+{#if pages} +{#each pages as page} +{#if page.charAt(0).toUpperCase() != lastLetter} + +

{lastLetter = page.charAt(0).toUpperCase()||page.charAt(0).toUpperCase()}

+{/if} +
+{page} +
+{/each} +{/if} \ No newline at end of file diff --git a/wiki/src/main/java/de/srsoftware/umbrella/wiki/Constants.java b/wiki/src/main/java/de/srsoftware/umbrella/wiki/Constants.java index 830f1f4..a80dbb7 100644 --- a/wiki/src/main/java/de/srsoftware/umbrella/wiki/Constants.java +++ b/wiki/src/main/java/de/srsoftware/umbrella/wiki/Constants.java @@ -9,6 +9,6 @@ public class Constants { public static final String PAGE_ID = "page_id"; public static final String PERMISSIONS = "permissions"; public static final String TABLE_PAGES = "pages"; - public static final String TABLE_PAGES_USERS = "pages_users"; + public static final String TABLE_PAGES_USERS = "page_users"; public static final String VERSION = "version"; } diff --git a/wiki/src/main/java/de/srsoftware/umbrella/wiki/SqliteDb.java b/wiki/src/main/java/de/srsoftware/umbrella/wiki/SqliteDb.java index 2098af0..0693f9d 100644 --- a/wiki/src/main/java/de/srsoftware/umbrella/wiki/SqliteDb.java +++ b/wiki/src/main/java/de/srsoftware/umbrella/wiki/SqliteDb.java @@ -1,21 +1,16 @@ package de.srsoftware.umbrella.wiki; +import de.srsoftware.tools.jdbc.Condition; import de.srsoftware.umbrella.core.BaseDb; import java.sql.Connection; import java.sql.SQLException; +import java.util.*; +import static de.srsoftware.tools.jdbc.Query.select; import static de.srsoftware.umbrella.core.Constants.*; -import static de.srsoftware.umbrella.core.Constants.DESCRIPTION; -import static de.srsoftware.umbrella.core.Constants.DUE_DATE; import static de.srsoftware.umbrella.core.Constants.ERROR_FAILED_CREATE_TABLE; -import static de.srsoftware.umbrella.core.Constants.EST_TIME; -import static de.srsoftware.umbrella.core.Constants.NAME; -import static de.srsoftware.umbrella.core.Constants.NO_INDEX; -import static de.srsoftware.umbrella.core.Constants.SHOW_CLOSED; -import static de.srsoftware.umbrella.core.Constants.START_DATE; -import static de.srsoftware.umbrella.core.Constants.STATUS; -import static de.srsoftware.umbrella.core.model.Status.OPEN; +import static de.srsoftware.umbrella.core.exceptions.UmbrellaException.databaseException; import static de.srsoftware.umbrella.wiki.Constants.*; import static java.lang.System.Logger.Level.ERROR; import static java.text.MessageFormat.format; @@ -63,4 +58,17 @@ public class SqliteDb extends BaseDb implements WikiDb { throw new RuntimeException(e); } } + + @Override + public List listUserPages(long userId) { + try { + var rs = select(ID,"MAX(version) AS version").from(TABLE_PAGES).leftJoin(ID,TABLE_PAGES_USERS,PAGE_ID).where(USER_ID, Condition.equal(userId)).groupBy(ID).sort("ID COLLATE NOCASE ASC").exec(db); + var set = new ArrayList(); + while (rs.next()) set.add(rs.getString(ID)); + rs.close(); + return set; + } catch (SQLException e) { + throw databaseException("Failed to list wiki articles for user {0}",userId); + } + } } \ No newline at end of file diff --git a/wiki/src/main/java/de/srsoftware/umbrella/wiki/WikiDb.java b/wiki/src/main/java/de/srsoftware/umbrella/wiki/WikiDb.java index f43ff06..e9f5588 100644 --- a/wiki/src/main/java/de/srsoftware/umbrella/wiki/WikiDb.java +++ b/wiki/src/main/java/de/srsoftware/umbrella/wiki/WikiDb.java @@ -2,15 +2,9 @@ package de.srsoftware.umbrella.wiki; -import de.srsoftware.umbrella.core.exceptions.UmbrellaException; -import de.srsoftware.umbrella.core.model.Permission; -import de.srsoftware.umbrella.core.model.Task; -import de.srsoftware.umbrella.core.model.UmbrellaUser; - -import java.util.Collection; import java.util.List; -import java.util.Map; public interface WikiDb { + List listUserPages(long userId); } diff --git a/wiki/src/main/java/de/srsoftware/umbrella/wiki/WikiModule.java b/wiki/src/main/java/de/srsoftware/umbrella/wiki/WikiModule.java index 8007034..474064e 100644 --- a/wiki/src/main/java/de/srsoftware/umbrella/wiki/WikiModule.java +++ b/wiki/src/main/java/de/srsoftware/umbrella/wiki/WikiModule.java @@ -1,11 +1,21 @@ package de.srsoftware.umbrella.wiki; +import com.sun.net.httpserver.HttpExchange; import de.srsoftware.configuration.Configuration; +import de.srsoftware.tools.Path; +import de.srsoftware.tools.SessionToken; import de.srsoftware.umbrella.core.BaseHandler; import de.srsoftware.umbrella.core.ModuleRegistry; import de.srsoftware.umbrella.core.api.WikiService; +import de.srsoftware.umbrella.core.exceptions.UmbrellaException; +import de.srsoftware.umbrella.core.model.Token; +import de.srsoftware.umbrella.core.model.UmbrellaUser; + +import java.io.IOException; +import java.util.Optional; import static de.srsoftware.umbrella.core.ConnectionProvider.connect; +import static de.srsoftware.umbrella.core.Util.mapValues; import static de.srsoftware.umbrella.core.exceptions.UmbrellaException.missingFieldException; import static de.srsoftware.umbrella.wiki.Constants.CONFIG_DATABASE; @@ -17,4 +27,28 @@ public class WikiModule extends BaseHandler implements WikiService { var dbFile = config.get(CONFIG_DATABASE).orElseThrow(() -> missingFieldException(CONFIG_DATABASE)); wikiDb = new SqliteDb(connect(dbFile)); } + + + @Override + public boolean doGet(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(); + return switch (head) { + case null -> getUserPages(user.get(),ex); + default -> super.doGet(path,ex); + }; + } catch (UmbrellaException e){ + return send(ex,e); + } + } + + private boolean getUserPages(UmbrellaUser user, HttpExchange ex) throws IOException { + var pageList = wikiDb.listUserPages(user.id()); + return sendContent(ex,pageList); + } + }