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:
@@ -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));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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";
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
Reference in New Issue
Block a user