improvemnts:

- ordering of bookmarks
- limitation of bookmarks on index page
- date for bookmarks that did not have a date before the transition
This commit is contained in:
2025-08-06 01:55:59 +02:00
parent 6f1fdc1f95
commit a450ef97b8
6 changed files with 35 additions and 20 deletions

View File

@@ -1,6 +1,7 @@
/* © SRSoftware 2025 */ /* © SRSoftware 2025 */
package de.srsoftware.umbrella.bookmarks; package de.srsoftware.umbrella.bookmarks;
import static de.srsoftware.tools.Optionals.nullable;
import static de.srsoftware.umbrella.bookmarks.Constants.*; import static de.srsoftware.umbrella.bookmarks.Constants.*;
import static de.srsoftware.umbrella.core.ConnectionProvider.connect; import static de.srsoftware.umbrella.core.ConnectionProvider.connect;
import static de.srsoftware.umbrella.core.Constants.*; import static de.srsoftware.umbrella.core.Constants.*;
@@ -85,7 +86,19 @@ public class BookmarkApi extends BaseHandler {
} }
private boolean getUserBookmarks(UmbrellaUser user, HttpExchange ex) throws IOException { private boolean getUserBookmarks(UmbrellaUser user, HttpExchange ex) throws IOException {
var bookmarks = db.list(user.id()); var param = queryParam(ex);
long offset = switch (param.get(OFFSET)){
case String s -> Long.parseLong(s);
case Number n -> n.longValue();
case null, default -> 0;
};
long limit = switch (param.get(LIMIT)){
case String s -> Long.parseLong(s);
case Number n -> n.longValue();
case null, default -> 100;
};
var bookmarks = db.list(user.id(),offset,limit);
return sendContent(ex,mapValues(bookmarks)); return sendContent(ex,mapValues(bookmarks));
} }

View File

@@ -8,7 +8,7 @@ import java.util.Collection;
import java.util.Map; import java.util.Map;
public interface BookmarkDb { public interface BookmarkDb {
Map<Long, Bookmark> list(long userId); Map<Long, Bookmark> list(long userId, long offset, long limit);
Bookmark load(long id, long userId); Bookmark load(long id, long userId);

View File

@@ -69,10 +69,10 @@ CREATE TABLE IF NOT EXISTS {0} (
} }
@Override @Override
public Map<Long, Bookmark> list(long userId) { public Map<Long, Bookmark> list(long userId, long offset, long limit) {
try { try {
var map = new HashMap<Long,Bookmark>(); var map = new HashMap<Long,Bookmark>();
var rs = select(ALL).from(TABLE_URL_COMMENTS).leftJoin(URL_ID,TABLE_URLS,ID).where(USER_ID, equal(userId)).exec(db); 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);
while (rs.next()){ while (rs.next()){
var bookmark = Bookmark.of(rs); var bookmark = Bookmark.of(rs);
map.put(bookmark.urlId(),bookmark); map.put(bookmark.urlId(),bookmark);

View File

@@ -69,6 +69,7 @@ public class Constants {
public static final String LANGUAGE = "language"; public static final String LANGUAGE = "language";
public static final String LAST_CUSTOMER_NUMBER = "last_customer_number"; public static final String LAST_CUSTOMER_NUMBER = "last_customer_number";
public static final String LIMIT = "limit";
public static final String LOGIN = "login"; public static final String LOGIN = "login";
public static final String MEMBERS = "members"; public static final String MEMBERS = "members";
@@ -82,7 +83,9 @@ public class Constants {
public static final String NOTE = "note"; public static final String NOTE = "note";
public static final String NUMBER = "number"; public static final String NUMBER = "number";
public static final String OFFSET = "offset";
public static final String OPTIONAL = "optional"; public static final String OPTIONAL = "optional";
public static final String PARENT_TASK_ID = "parent_task_id"; public static final String PARENT_TASK_ID = "parent_task_id";
public static final String PASS = "pass"; public static final String PASS = "pass";
public static final String PASSWORD = "password"; public static final String PASSWORD = "password";

View File

@@ -40,8 +40,8 @@
} }
} }
async function loadBookmarks(){ async function loadBookmarks(offset=0,limit=100){
const url = api('bookmark/list'); const url = api(`bookmark/list?offset=${offset}&limit=${limit}`);
const resp = await fetch(url,{credentials:'include'}); const resp = await fetch(url,{credentials:'include'});
if (resp.ok){ if (resp.ok){
const raw = await resp.json(); const raw = await resp.json();

View File

@@ -3,8 +3,7 @@ package de.srsoftware.umbrella.tags;
import static de.srsoftware.tools.Optionals.is0; import static de.srsoftware.tools.Optionals.is0;
import static de.srsoftware.tools.Optionals.isSet; import static de.srsoftware.tools.Optionals.isSet;
import static de.srsoftware.tools.jdbc.Condition.equal; import static de.srsoftware.tools.jdbc.Condition.*;
import static de.srsoftware.tools.jdbc.Condition.isNull;
import static de.srsoftware.tools.jdbc.Query.*; import static de.srsoftware.tools.jdbc.Query.*;
import static de.srsoftware.tools.jdbc.Query.Dialect.SQLITE; import static de.srsoftware.tools.jdbc.Query.Dialect.SQLITE;
import static de.srsoftware.tools.jdbc.Query.SelectQuery.ALL; import static de.srsoftware.tools.jdbc.Query.SelectQuery.ALL;
@@ -17,6 +16,7 @@ import static java.lang.System.Logger.Level.*;
import static java.text.MessageFormat.format; import static java.text.MessageFormat.format;
import static java.time.ZoneOffset.UTC; import static java.time.ZoneOffset.UTC;
import de.srsoftware.tools.jdbc.Condition;
import de.srsoftware.tools.jdbc.Query; import de.srsoftware.tools.jdbc.Query;
import de.srsoftware.umbrella.bookmarks.BookmarkDb; import de.srsoftware.umbrella.bookmarks.BookmarkDb;
import de.srsoftware.umbrella.core.BaseDb; import de.srsoftware.umbrella.core.BaseDb;
@@ -28,10 +28,8 @@ import java.util.*;
import java.util.regex.Pattern; import java.util.regex.Pattern;
public class SqliteDb extends BaseDb implements TagDB{ public class SqliteDb extends BaseDb implements TagDB{
private static final System.Logger LOG = System.getLogger("TagDB");
private final BookmarkDb bookmarks; private final BookmarkDb bookmarks;
public SqliteDb(Connection tagDb, Connection bmDb) { public SqliteDb(Connection tagDb, Connection bmDb) {
super(tagDb); super(tagDb);
bookmarks = new de.srsoftware.umbrella.bookmarks.SqliteDb(bmDb); bookmarks = new de.srsoftware.umbrella.bookmarks.SqliteDb(bmDb);
@@ -54,13 +52,19 @@ public class SqliteDb extends BaseDb implements TagDB{
dropOldTables(); dropOldTables();
renameNewTagTable(); renameNewTagTable();
} }
version = setCurrentVersion(2);
return setCurrentVersion(2); LOG.log(INFO,"Updated db to version {0}",version);
return version;
} }
private void splitContentToBookmarks() { private void splitContentToBookmarks() {
var pattern = Pattern.compile("/([^/]+)/(\\d+)/view"); var pattern = Pattern.compile("/([^/]+)/(\\d+)/view");
try { try {
LocalDateTime earliestDate = LocalDateTime.of(2000,1,1,0,0);
var rs = select(ALL).from(TABLE_URLS).leftJoin(HASH,TABLE_URL_COMMENTS,URL_HASH).leftJoin(COMMENT_HASH,TABLE_COMMENTS,HASH).where(TIMESTAMP,moreThan(0)).limit(1).exec(db);
if (rs.next()) earliestDate = LocalDateTime.ofEpochSecond(rs.getLong(1),0,UTC);
rs.close();
var sql = "CREATE TABLE IF NOT EXISTS tags_new (TAG)"; var sql = "CREATE TABLE IF NOT EXISTS tags_new (TAG)";
db.prepareStatement(sql).execute(); db.prepareStatement(sql).execute();
// IMPORT BOOKMARKS // IMPORT BOOKMARKS
@@ -75,7 +79,7 @@ public class SqliteDb extends BaseDb implements TagDB{
var timestamp = commentedURLS.getLong(TIMESTAMP); var timestamp = commentedURLS.getLong(TIMESTAMP);
var comment = commentedURLS.getString(COMMENT); var comment = commentedURLS.getString(COMMENT);
if (!isSet(comment)) comment = ""; if (!isSet(comment)) comment = "";
var dt = is0(timestamp) ? LocalDateTime.now() : LocalDateTime.ofEpochSecond(timestamp,0,UTC); var dt = is0(timestamp) ? earliestDate : LocalDateTime.ofEpochSecond(timestamp,0,UTC);
var bm = bookmarks.save(url,comment,List.of(userId),dt.withNano(0)); var bm = bookmarks.save(url,comment,List.of(userId),dt.withNano(0));
String module = null; String module = null;
@@ -245,11 +249,6 @@ CREATE TABLE IF NOT EXISTS {0} (
} }
} }
private void init(){
var version = createTables();
LOG.log(INFO,"Updated task db to version {0}",version);
}
@Override @Override
public Set<String> list(long userId, String module, long entityId) { public Set<String> list(long userId, String module, long entityId) {
try { try {