diff --git a/bookmark/src/main/java/de/srsoftware/umbrella/bookmarks/BookmarkApi.java b/bookmark/src/main/java/de/srsoftware/umbrella/bookmarks/BookmarkApi.java index f31033e..311d58f 100644 --- a/bookmark/src/main/java/de/srsoftware/umbrella/bookmarks/BookmarkApi.java +++ b/bookmark/src/main/java/de/srsoftware/umbrella/bookmarks/BookmarkApi.java @@ -5,6 +5,7 @@ import static de.srsoftware.umbrella.bookmarks.Constants.*; import static de.srsoftware.umbrella.core.ConnectionProvider.connect; import static de.srsoftware.umbrella.core.Constants.*; import static de.srsoftware.umbrella.core.Paths.LIST; +import static de.srsoftware.umbrella.core.Paths.SEARCH; import static de.srsoftware.umbrella.core.Util.mapValues; import static de.srsoftware.umbrella.core.exceptions.UmbrellaException.missingFieldException; import static java.net.HttpURLConnection.HTTP_BAD_REQUEST; @@ -21,6 +22,7 @@ import de.srsoftware.umbrella.core.model.Token; import de.srsoftware.umbrella.core.model.UmbrellaUser; import java.io.IOException; import java.util.ArrayList; +import java.util.Arrays; import java.util.Optional; import org.json.JSONArray; @@ -71,6 +73,7 @@ public class BookmarkApi extends BaseHandler implements BookmarkService { if (user.isEmpty()) return unauthorized(ex); var head = path.pop(); return switch (head) { + case SEARCH -> postSearch(user.get(),ex); case null -> postBookmark(user.get(),ex); default -> super.doPost(path,ex); }; @@ -118,4 +121,13 @@ public class BookmarkApi extends BaseHandler implements BookmarkService { } return sendContent(ex,bookmark); } + + private boolean postSearch(UmbrellaUser user, HttpExchange ex) throws IOException { + var json = json(ex); + if (!(json.has(KEY) && json.get(KEY) instanceof String key)) throw missingFieldException(KEY); + var keys = Arrays.asList(key.split(" ")); + var fulltext = json.has(FULLTEXT) && json.get(FULLTEXT) instanceof Boolean val && val; + var bookmarks = db.find(user.id(),keys); + return sendContent(ex,mapValues(bookmarks)); + } } diff --git a/bookmark/src/main/java/de/srsoftware/umbrella/bookmarks/BookmarkDb.java b/bookmark/src/main/java/de/srsoftware/umbrella/bookmarks/BookmarkDb.java index 1a0f29d..b6d331a 100644 --- a/bookmark/src/main/java/de/srsoftware/umbrella/bookmarks/BookmarkDb.java +++ b/bookmark/src/main/java/de/srsoftware/umbrella/bookmarks/BookmarkDb.java @@ -7,7 +7,9 @@ import java.util.Collection; import java.util.Map; public interface BookmarkDb { - Map list(long userId, long offset, long limit); + Map find(long userId, Collection key); + + Map list(long userId, Long offset, Long limit); Bookmark load(long id, long userId); diff --git a/bookmark/src/main/java/de/srsoftware/umbrella/bookmarks/Constants.java b/bookmark/src/main/java/de/srsoftware/umbrella/bookmarks/Constants.java index cb5311a..5c44a71 100644 --- a/bookmark/src/main/java/de/srsoftware/umbrella/bookmarks/Constants.java +++ b/bookmark/src/main/java/de/srsoftware/umbrella/bookmarks/Constants.java @@ -3,6 +3,7 @@ package de.srsoftware.umbrella.bookmarks; public class Constants { public static final String CONFIG_DATABASE = "umbrella.modules.bookmark.database"; + public static final String FULLTEXT = "fulltext"; public static final String SHARE = "share"; public static final String TABLE_TOKENS = "tokens"; public static final String TABLE_URLS = "urls"; diff --git a/bookmark/src/main/java/de/srsoftware/umbrella/bookmarks/SqliteDb.java b/bookmark/src/main/java/de/srsoftware/umbrella/bookmarks/SqliteDb.java index acc7fd1..dbf6a1a 100644 --- a/bookmark/src/main/java/de/srsoftware/umbrella/bookmarks/SqliteDb.java +++ b/bookmark/src/main/java/de/srsoftware/umbrella/bookmarks/SqliteDb.java @@ -2,6 +2,7 @@ package de.srsoftware.umbrella.bookmarks; import static de.srsoftware.tools.jdbc.Condition.equal; +import static de.srsoftware.tools.jdbc.Condition.like; import static de.srsoftware.tools.jdbc.Query.*; import static de.srsoftware.tools.jdbc.Query.SelectQuery.ALL; import static de.srsoftware.umbrella.bookmarks.Constants.*; @@ -69,7 +70,26 @@ CREATE TABLE IF NOT EXISTS {0} ( } @Override - public Map list(long userId, long offset, long limit) { + public Map find(long userId, Collection keys) { + try { + var map = new HashMap(); + var query = select(ALL).from(TABLE_URL_COMMENTS).leftJoin(URL_ID,TABLE_URLS,ID) + .where(USER_ID, equal(userId)); + for (var key : keys) query.where(COMMENT,like("%"+key+"%")); + var rs = query.sort(format("{0} DESC",TIMESTAMP)).exec(db); + while (rs.next()){ + var bookmark = Bookmark.of(rs); + map.put(bookmark.urlId(),bookmark); + } + rs.close();; + return map; + } catch (SQLException e) { + throw new UmbrellaException("Failed to load bookmark list"); + } + } + + @Override + public Map list(long userId, Long offset, Long limit) { try { var map = new HashMap(); var rs = select(ALL).from(TABLE_URL_COMMENTS).leftJoin(URL_ID,TABLE_URLS,ID).where(USER_ID, equal(userId)).sort(format("{0} DESC",TIMESTAMP)).skip(offset).limit(limit).exec(db); diff --git a/frontend/src/routes/search/Search.svelte b/frontend/src/routes/search/Search.svelte index fb82be3..8f5b323 100644 --- a/frontend/src/routes/search/Search.svelte +++ b/frontend/src/routes/search/Search.svelte @@ -4,8 +4,11 @@ import { api } from '../../urls.svelte.js'; import { t } from '../../translations.svelte.js'; + import Bookmark from '../bookmark/Template.svelte'; + const router = useTinyRouter(); console.log(router); + let bookmarks = $state(null); let fulltext = false; let key = $state(router.getQueryParam('key')); let input = $state(router.getQueryParam('key')); @@ -37,6 +40,8 @@ async function handleBookmarks(resp){ if (resp.ok){ + bookmarks = await resp.json(); + console.log(bookmarks); } else { error = await resp.text(); } @@ -63,11 +68,17 @@ -{#if key} +{#if bookmarks}
- {t('results')} + {t('bookmarks')} - {key} +
{/if} \ No newline at end of file diff --git a/web/src/main/resources/web/css/default.css b/web/src/main/resources/web/css/default.css index 3b5b6dc..d432834 100644 --- a/web/src/main/resources/web/css/default.css +++ b/web/src/main/resources/web/css/default.css @@ -285,4 +285,8 @@ legend{ nav > form{ display:inline; +} + +li > a > p:nth-child(1){ + display: inline; } \ No newline at end of file