You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
94 lines
3.4 KiB
94 lines
3.4 KiB
/* © SRSoftware 2025 */ |
|
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.*; |
|
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 com.sun.net.httpserver.HttpExchange; |
|
import de.srsoftware.configuration.Configuration; |
|
import de.srsoftware.tools.Path; |
|
import de.srsoftware.tools.SessionToken; |
|
import de.srsoftware.umbrella.core.BaseHandler; |
|
import de.srsoftware.umbrella.core.api.TagService; |
|
import de.srsoftware.umbrella.core.api.UserService; |
|
import de.srsoftware.umbrella.core.exceptions.UmbrellaException; |
|
import de.srsoftware.umbrella.core.model.Token; |
|
import de.srsoftware.umbrella.core.model.UmbrellaUser; |
|
import org.json.JSONArray; |
|
|
|
import java.io.IOException; |
|
import java.util.List; |
|
import java.util.Optional; |
|
|
|
public class BookmarkApi extends BaseHandler { |
|
private final BookmarkDb db; |
|
private final UserService users; |
|
private final TagService tags; |
|
|
|
public BookmarkApi(Configuration config, TagService tagService) { |
|
var dbFile = config.get(CONFIG_DATABASE).orElseThrow(() -> missingFieldException(CONFIG_DATABASE)); |
|
db = new SqliteDb(connect(dbFile)); |
|
tags = tagService; |
|
users = tagService.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); |
|
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 SAVE -> postBookmark(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); |
|
} |
|
} |
|
|
|
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 bookmark = db.save(url,comment, user.id()); |
|
if (json.has(TAGS) && json.get(TAGS) instanceof JSONArray tagList){ |
|
var list = tagList.toList().stream().map(Object::toString).toList(); |
|
tags.save(BOOKMARK,bookmark.id(), List.of(user.id()),list); |
|
} |
|
return sendContent(ex,bookmark); |
|
} |
|
}
|
|
|