implemented loading of bookmarks and bookmark list
This commit is contained in:
@@ -3,10 +3,12 @@ package de.srsoftware.umbrella.bookmarks;
|
||||
|
||||
import static de.srsoftware.umbrella.bookmarks.Constants.*;
|
||||
import static de.srsoftware.umbrella.core.ConnectionProvider.connect;
|
||||
import static de.srsoftware.umbrella.core.Constants.COMMENT;
|
||||
import static de.srsoftware.umbrella.core.Constants.URL;
|
||||
import static de.srsoftware.umbrella.core.Paths.LIST;
|
||||
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;
|
||||
import static java.net.HttpURLConnection.HTTP_NOT_IMPLEMENTED;
|
||||
|
||||
import com.sun.net.httpserver.HttpExchange;
|
||||
import de.srsoftware.configuration.Configuration;
|
||||
@@ -30,6 +32,25 @@ public class BookmarkApi extends BaseHandler {
|
||||
users = userService;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean doGet(Path path, HttpExchange ex) throws IOException {
|
||||
addCors(ex);
|
||||
try {
|
||||
Optional<Token> token = SessionToken.from(ex).map(Token::of);
|
||||
var user = users.loadUser(token);
|
||||
if (user.isEmpty()) return unauthorized(ex);
|
||||
var head = path.pop();
|
||||
return switch (head) {
|
||||
case LIST -> getUserBookmarks(user.get(),ex);
|
||||
case null, default -> super.doPost(path,ex);
|
||||
};
|
||||
} catch (NumberFormatException e){
|
||||
return sendContent(ex,HTTP_BAD_REQUEST,"Invalid project id");
|
||||
} catch (UmbrellaException e){
|
||||
return send(ex,e);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean doPost(Path path, HttpExchange ex) throws IOException {
|
||||
addCors(ex);
|
||||
@@ -49,11 +70,16 @@ public class BookmarkApi extends BaseHandler {
|
||||
}
|
||||
}
|
||||
|
||||
private boolean getUserBookmarks(UmbrellaUser user, HttpExchange ex) throws IOException {
|
||||
var bookmarks = db.list(user.id());
|
||||
return sendContent(ex,mapValues(bookmarks));
|
||||
}
|
||||
|
||||
private boolean postBookmark(UmbrellaUser user, HttpExchange ex) throws IOException {
|
||||
var json = json(ex);
|
||||
if (!(json.has(URL) && json.get(URL) instanceof String url)) throw missingFieldException(URL);
|
||||
if (!(json.has(COMMENT) && json.get(COMMENT) instanceof String comment)) throw missingFieldException(COMMENT);
|
||||
var urlHash = db.save(url,comment, user.id());
|
||||
return sendContent(ex,urlHash);
|
||||
var bookmark = db.save(url,comment, user.id());
|
||||
return sendContent(ex,bookmark);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,12 @@
|
||||
/* © SRSoftware 2025 */
|
||||
package de.srsoftware.umbrella.bookmarks;
|
||||
|
||||
import de.srsoftware.umbrella.core.model.Bookmark;
|
||||
import de.srsoftware.umbrella.core.model.Hash;
|
||||
import java.util.Map;
|
||||
|
||||
public interface BookmarkDb {
|
||||
String save(String url, String comment, long userId);
|
||||
Bookmark save(String url, String comment, long userId);
|
||||
|
||||
Map<Hash, Bookmark> list(long id);
|
||||
}
|
||||
|
||||
@@ -2,9 +2,7 @@
|
||||
package de.srsoftware.umbrella.bookmarks;
|
||||
|
||||
public class Constants {
|
||||
public static final String COMMENT = "comment";
|
||||
public static final String CONFIG_DATABASE = "umbrella.modules.bookmark.database";
|
||||
public static final String HASH = "hash";
|
||||
public static final String SAVE = "save";
|
||||
public static final String TABLE_URLS = "urls";
|
||||
public static final String TABLE_URL_COMMENTS = "url_comments";
|
||||
|
||||
@@ -1,18 +1,26 @@
|
||||
/* © SRSoftware 2025 */
|
||||
package de.srsoftware.umbrella.bookmarks;
|
||||
|
||||
import static de.srsoftware.tools.jdbc.Query.insertInto;
|
||||
import static de.srsoftware.tools.jdbc.Query.replaceInto;
|
||||
import static de.srsoftware.tools.jdbc.Query.*;
|
||||
import static de.srsoftware.tools.jdbc.Query.SelectQuery.ALL;
|
||||
import static de.srsoftware.umbrella.bookmarks.Constants.*;
|
||||
import static de.srsoftware.umbrella.core.Constants.*;
|
||||
import static de.srsoftware.umbrella.core.Constants.ERROR_FAILED_CREATE_TABLE;
|
||||
import static de.srsoftware.umbrella.core.Util.sha1;
|
||||
import static java.lang.System.Logger.Level.ERROR;
|
||||
import static java.text.MessageFormat.format;
|
||||
import static java.time.ZoneOffset.UTC;
|
||||
|
||||
import de.srsoftware.tools.jdbc.Condition;
|
||||
import de.srsoftware.umbrella.core.BaseDb;
|
||||
import de.srsoftware.umbrella.core.exceptions.UmbrellaException;
|
||||
import de.srsoftware.umbrella.core.model.Bookmark;
|
||||
import de.srsoftware.umbrella.core.model.Hash;
|
||||
import java.sql.Connection;
|
||||
import java.sql.SQLException;
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
public class SqliteDb extends BaseDb implements BookmarkDb {
|
||||
public SqliteDb(Connection conn) {
|
||||
@@ -32,14 +40,15 @@ public class SqliteDb extends BaseDb implements BookmarkDb {
|
||||
|
||||
private void createUrlCommentsTable() {
|
||||
var sql = """
|
||||
CREATE TABLE IF NOT EXISTS "url_comments" (
|
||||
`hash` VARCHAR ( 255 ) NOT NULL,
|
||||
`user_id` LONG NOT NULL,
|
||||
`comment` TEXT NOT NULL,
|
||||
PRIMARY KEY (`hash`,`user_id`)
|
||||
CREATE TABLE IF NOT EXISTS {0} (
|
||||
`{1}` VARCHAR ( 255 ) NOT NULL,
|
||||
`{2}` LONG NOT NULL,
|
||||
`{3}` TEXT NOT NULL,
|
||||
`{4}` DATETIME NOT NULL,
|
||||
PRIMARY KEY (`{1}`,`{2}`)
|
||||
)""";
|
||||
try {
|
||||
var stmt = db.prepareStatement(sql);
|
||||
var stmt = db.prepareStatement(format(sql,TABLE_URL_COMMENTS,HASH,USER_ID,COMMENT,TIMESTAMP));
|
||||
stmt.execute();
|
||||
stmt.close();
|
||||
} catch (SQLException e) {
|
||||
@@ -61,15 +70,33 @@ CREATE TABLE IF NOT EXISTS "url_comments" (
|
||||
}
|
||||
|
||||
@Override
|
||||
public String save(String url, String comment, long userId) {
|
||||
public Map<Hash, Bookmark> list(long userId) {
|
||||
|
||||
try {
|
||||
var map = new HashMap<Hash,Bookmark>();
|
||||
var rs = select(ALL).from(TABLE_URL_COMMENTS).leftJoin(HASH,TABLE_URLS,HASH).where(USER_ID, Condition.equal(userId)).exec(db);
|
||||
while (rs.next()){
|
||||
var bookmark = Bookmark.of(rs);
|
||||
map.put(bookmark.hash(),bookmark);
|
||||
}
|
||||
rs.close();;
|
||||
return map;
|
||||
} catch (SQLException e) {
|
||||
throw new UmbrellaException("Failed to load bookmark list");
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Bookmark save(String url, String comment, long userId) {
|
||||
var hash = sha1(url);
|
||||
try {
|
||||
var timestamp = LocalDateTime.now();
|
||||
replaceInto(TABLE_URLS,HASH,URL)
|
||||
.values(hash,url).execute(db).close();
|
||||
replaceInto(TABLE_URL_COMMENTS,HASH,USER_ID,COMMENT)
|
||||
.values(hash,userId,comment)
|
||||
replaceInto(TABLE_URL_COMMENTS,HASH,USER_ID,COMMENT, TIMESTAMP)
|
||||
.values(hash,userId,comment,timestamp.toEpochSecond(UTC))
|
||||
.execute(db).close();
|
||||
return hash;
|
||||
return Bookmark.of(url,comment,timestamp);
|
||||
} catch (SQLException e) {
|
||||
throw new UmbrellaException("Failed to store url");
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user