diff --git a/Dockerfile b/Dockerfile index e5006505..e060138c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,15 +1,15 @@ FROM alpine:3.22 AS svelte_build RUN apk add npm RUN adduser -Dh /home/svelte svelte -ADD . /home/svelte/Umbrella +ADD frontend /home/svelte/Umbrella/frontend RUN chown -R svelte /home/svelte/Umbrella USER svelte WORKDIR /home/svelte/Umbrella/frontend RUN npm install && npm run build -FROM alpine AS java_build -RUN apk add gradle fontconfig font-opensans openjdk21-jre +FROM alpine:3.22 AS java_build +RUN apk add gradle ADD . /Umbrella WORKDIR /Umbrella COPY --from=svelte_build /home/svelte/Umbrella/frontend/dist web/src/main/resources/web @@ -17,14 +17,18 @@ RUN gradle --no-daemon build FROM alpine -RUN apk add bash fontconfig font-opensans graphviz openjdk21-jre weasyprint -RUN adduser -D umbrella -COPY --from=java_build /Umbrella/backend/build/libs/backend.jar /home/umbrella/jar/ -RUN chown -R umbrella /home/umbrella -ADD https://github.com/plantuml/plantuml/releases/download/v1.2025.10/plantuml-1.2025.10.jar /home/umbrella/plantuml.jar +RUN apk --no-cache add bash fontconfig font-opensans graphviz openjdk21-jre tzdata weasyprint \ + && adduser -D umbrella WORKDIR /home/umbrella -RUN chmod a+rx plantuml.jar -USER umbrella -RUN mkdir .config && ln -s /host/config.json .config/Umbrella.json + EXPOSE 80 CMD java -jar jar/backend.jar + +ADD https://github.com/plantuml/plantuml/releases/download/v1.2025.10/plantuml-1.2025.10.jar /home/umbrella/plantuml.jar +COPY --from=java_build /Umbrella/backend/build/libs/backend.jar /home/umbrella/jar/ +RUN mkdir .config \ + && ln -s /host/config.json .config/Umbrella.json \ + && chmod a+rx plantuml.jar \ + && chown -R umbrella . \ + && ln -s /usr/share/zoneinfo/Europe/Berlin /etc/localtime +USER umbrella 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 45bbf862..22e152da 100644 --- a/documents/src/main/java/de/srsoftware/umbrella/documents/DocumentApi.java +++ b/documents/src/main/java/de/srsoftware/umbrella/documents/DocumentApi.java @@ -541,6 +541,11 @@ public class DocumentApi extends BaseHandler implements DocumentService { var userCompanyIds = companyService().listCompaniesOf(user).keySet(); var documents = db.find(userCompanyIds,keys,fulltext); + try { + Thread.sleep(5000); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } return sendContent(ex,mapValues(documents)); } diff --git a/frontend/src/routes/project/View.svelte b/frontend/src/routes/project/View.svelte index c65ce803..f17986b5 100644 --- a/frontend/src/routes/project/View.svelte +++ b/frontend/src/routes/project/View.svelte @@ -222,7 +222,7 @@
{t('state')}
- update({status:val})} {project} /> + update({status:+val})} {project} />
{#if project.company}
{t('company')}
diff --git a/frontend/src/routes/search/Search.svelte b/frontend/src/routes/search/Search.svelte index 9883aaf1..118954e7 100644 --- a/frontend/src/routes/search/Search.svelte +++ b/frontend/src/routes/search/Search.svelte @@ -1,14 +1,15 @@ @@ -236,23 +277,6 @@ {/if} -{#if notes} -
- - {t('notes')} - - -
-{/if} {#if times}
@@ -308,3 +332,20 @@
{/if} +{#if notes} +
+ + {t('notes')} + + +
+{/if} diff --git a/stock/src/main/java/de/srsoftware/umbrella/stock/StockModule.java b/stock/src/main/java/de/srsoftware/umbrella/stock/StockModule.java index 4b46a2b6..bd8d574d 100644 --- a/stock/src/main/java/de/srsoftware/umbrella/stock/StockModule.java +++ b/stock/src/main/java/de/srsoftware/umbrella/stock/StockModule.java @@ -132,7 +132,23 @@ public class StockModule extends BaseHandler implements StockService { yield super.doGet(path,ex); } } - case null, default -> super.doGet(path,ex); + case null -> super.doGet(path,ex); + default -> { + try { + var id = Long.parseLong(head); + Item item = stockDb.loadItem(id); + Owner owner = item.owner().resolve(); + if (owner instanceof Company company) { + if (!companyService().membership(company.id(),user.get().id())) throw forbidden("You are not allowed to access {0}",OBJECT); + } + if (owner instanceof UmbrellaUser u){ + if (u.id() != user.get().id()) throw forbidden("You are not allowed to access {0}",OBJECT); + } + yield sendContent(ex,item); + } catch (NumberFormatException nfe){ + yield super.doGet(path,ex); + } + } }; } catch (UmbrellaException e){ return send(ex,e); diff --git a/tags/src/main/java/de/srsoftware/umbrella/tags/SqliteDb.java b/tags/src/main/java/de/srsoftware/umbrella/tags/SqliteDb.java index 48f8163a..30f6f8fb 100644 --- a/tags/src/main/java/de/srsoftware/umbrella/tags/SqliteDb.java +++ b/tags/src/main/java/de/srsoftware/umbrella/tags/SqliteDb.java @@ -39,6 +39,7 @@ public class SqliteDb extends BaseDb implements TagDB{ public SqliteDb(Connection tagDb, Connection bmDb) { super(tagDb); bookmarks = new de.srsoftware.umbrella.bookmarks.SqliteDb(bmDb); + createTables(); } @Override diff --git a/translations/src/main/resources/de.json b/translations/src/main/resources/de.json index 90a55aaf..00cc7b21 100644 --- a/translations/src/main/resources/de.json +++ b/translations/src/main/resources/de.json @@ -305,6 +305,7 @@ "saved": "gespeichert", "save_object": "{object} speichern", "search": "Suche", + "searching…": "suche…", "select_company" : "Wählen Sie eine ihrer Firmen:", "select_customer": "Kunde auswählen", "select_property": "Eigenschaft auswählen", diff --git a/translations/src/main/resources/en.json b/translations/src/main/resources/en.json index 5db18341..1925432e 100644 --- a/translations/src/main/resources/en.json +++ b/translations/src/main/resources/en.json @@ -305,6 +305,7 @@ "saved": "saved", "save_object": "save {object}", "search": "search", + "searching…": "searhcing…", "select_company" : "select on of you companies:", "select_customer": "select customer", "select_property": "select property", 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 3603899b..7243134f 100644 --- a/wiki/src/main/java/de/srsoftware/umbrella/wiki/SqliteDb.java +++ b/wiki/src/main/java/de/srsoftware/umbrella/wiki/SqliteDb.java @@ -152,15 +152,27 @@ public class SqliteDb extends BaseDb implements WikiDb { @Override public Map find(long userId, List keys, boolean fulltext) { try { - var query = select(ALL).from(TABLE_PAGES).leftJoin(ID,TABLE_PAGES_USERS,PAGE_ID).where(USER_ID,equal(userId)); - for (var key : keys) query.where(TITLE,like("%"+key+"%")); - var rs = query.exec(db); var map = new HashMap(); - while (rs.next()) { - var page = WikiPage.of(rs); - map.put(page.id(),page); + { + var query = select(ALL).from(TABLE_PAGES).leftJoin(ID, TABLE_PAGES_USERS, PAGE_ID).where(USER_ID, equal(userId)); + for (var key : keys) query.where(TITLE, like("%" + key.replaceAll("[ÄäÖöÜüß]", "%") + "%")); + var rs = query.exec(db); + while (rs.next()) { + var page = WikiPage.of(rs); + map.put(page.id(), page); + } + rs.close(); + } + if (fulltext) { + var query = select(ALL).from(TABLE_PAGES).leftJoin(ID, TABLE_PAGES_USERS, PAGE_ID).where(USER_ID, equal(userId)); + for (var key : keys) query.where(CONTENT, like("%" + key.replaceAll("[ÄäÖöÜüß]", "%") + "%")); + var rs = query.exec(db); + while (rs.next()) { + var page = WikiPage.of(rs); + map.put(page.id(), page); + } + rs.close(); } - rs.close(); return map; } catch (SQLException e) { throw failedToSearchDb(t(WIKI_PAGES)).causedBy(e);