diff --git a/frontend/src/Components/Menu.svelte b/frontend/src/Components/Menu.svelte index 2199c78..fc7a5b1 100644 --- a/frontend/src/Components/Menu.svelte +++ b/frontend/src/Components/Menu.svelte @@ -1,13 +1,12 @@ diff --git a/frontend/src/routes/search/Search.svelte b/frontend/src/routes/search/Search.svelte index c53379d..1bccced 100644 --- a/frontend/src/routes/search/Search.svelte +++ b/frontend/src/routes/search/Search.svelte @@ -1,4 +1,5 @@ diff --git a/legacy/src/main/java/de/srsoftware/umbrella/legacy/LegacyApi.java b/legacy/src/main/java/de/srsoftware/umbrella/legacy/LegacyApi.java index 4029eca..86f4aae 100644 --- a/legacy/src/main/java/de/srsoftware/umbrella/legacy/LegacyApi.java +++ b/legacy/src/main/java/de/srsoftware/umbrella/legacy/LegacyApi.java @@ -57,13 +57,7 @@ public class LegacyApi extends BaseHandler { } case LOGIN -> getLogin(ex); case LOGOUT-> logout(ex); - case SEARCH -> { - try { - yield search(ex); - } catch (UmbrellaException e){ - yield send(ex,e); - } - } + case SEARCH -> sendRedirect(ex,url(ex).replaceAll("/legacy/","/")); default -> super.doGet(path,ex); }; } @@ -74,6 +68,7 @@ public class LegacyApi extends BaseHandler { return switch (path.pop()) { case JSON -> jsonUser(ex); case NOTIFY -> legacyNotify(ex); + case SEARCH -> postSearch(ex); case VALIDATE_TOKEN -> validateToken(ex); default -> super.doPost(path,ex); }; @@ -225,7 +220,7 @@ public class LegacyApi extends BaseHandler { return session; } - private boolean search(HttpExchange ex) throws IOException, UmbrellaException { + private boolean getSearch(HttpExchange ex) throws IOException, UmbrellaException { var optToken = SessionToken.from(ex).map(Token::of); if (optToken.isEmpty()) return sendEmptyResponse(HTTP_UNAUTHORIZED,ex); var token = optToken.get(); @@ -255,6 +250,35 @@ public class LegacyApi extends BaseHandler { return sendContent(ex,searchResult.toString()); }; + private boolean postSearch(HttpExchange ex) throws IOException, UmbrellaException { + var optToken = SessionToken.from(ex).map(Token::of); + if (optToken.isEmpty()) return sendEmptyResponse(HTTP_UNAUTHORIZED,ex); + var token = optToken.get(); + var json = json(ex); + if (!(json.has(KEY) && json.get(KEY) instanceof String key) || key.isBlank()) return sendContent(ex,HTTP_BAD_REQUEST,"No search key given"); + var fulltext = key.contains("+") || (json.has("fulltext") && "on".equals(json.get("fulltext"))); + StringBuilder searchResult = new StringBuilder(); + if (fulltext){ + for (var module : config.keys()){ + var baseUrl = config.get(module + ".baseUrl"); + if (baseUrl.isEmpty()) continue; + + var res = request(baseUrl.get()+"/search",token.asMap().plus(KEY,key),MIME_FORM_URL,token.asBearer()); + if (!(res instanceof String content) || content.isBlank()) continue; + searchResult.append("").append(module).append(""); + searchResult.append(content).append("\n"); + } + } else { + var bookmark = config.get("bookmark.baseUrl"); + if (bookmark.isEmpty()) throw new UmbrellaException(500,"Tag search not available: Bookmark module not configured!"); + var res = request(bookmark.get()+"/search",token.asMap().plus(KEY,key),MIME_FORM_URL,null); + if (!(res instanceof String content)) throw new UmbrellaException(500,"Search did not return html content!"); + searchResult.append(content); + } + addCors(ex); + return sendContent(ex,searchResult.toString()); + }; + private static String stripTrailingSlash(Object o){ String url = o.toString(); if (url.endsWith("/")) return url.substring(0,url.length()-1);