From a145ad4e77b87229df8afe7b775db17eec303ff6 Mon Sep 17 00:00:00 2001 From: frajibe Date: Sat, 7 Jan 2023 13:01:27 +0100 Subject: [PATCH] introduce a dedicated method to clear a playlist --- .../me/kavin/piped/server/ServerLauncher.java | 2 +- .../handlers/auth/AuthPlaylistHandlers.java | 44 +++++++++++++++---- 2 files changed, 36 insertions(+), 10 deletions(-) diff --git a/src/main/java/me/kavin/piped/server/ServerLauncher.java b/src/main/java/me/kavin/piped/server/ServerLauncher.java index c571506..1963b2b 100644 --- a/src/main/java/me/kavin/piped/server/ServerLauncher.java +++ b/src/main/java/me/kavin/piped/server/ServerLauncher.java @@ -416,7 +416,7 @@ public class ServerLauncher extends MultithreadedHttpServerLauncher { try { var json = Constants.mapper.readTree(request.loadBody().getResult().asArray()); var playlistId = json.get("playlistId").textValue(); - return getJsonResponse(AuthPlaylistHandlers.removeFromPlaylistResponse(request.getHeader(AUTHORIZATION), playlistId, null), "private"); + return getJsonResponse(AuthPlaylistHandlers.clearPlaylistResponse(request.getHeader(AUTHORIZATION), playlistId), "private"); } catch (Exception e) { return getErrorResponse(e, request.getPath()); } diff --git a/src/main/java/me/kavin/piped/server/handlers/auth/AuthPlaylistHandlers.java b/src/main/java/me/kavin/piped/server/handlers/auth/AuthPlaylistHandlers.java index 3bd8942..7c23ce8 100644 --- a/src/main/java/me/kavin/piped/server/handlers/auth/AuthPlaylistHandlers.java +++ b/src/main/java/me/kavin/piped/server/handlers/auth/AuthPlaylistHandlers.java @@ -283,7 +283,7 @@ public class AuthPlaylistHandlers { } } - public static byte[] removeFromPlaylistResponse(String session, String playlistId, Integer index) throws IOException { + public static byte[] removeFromPlaylistResponse(String session, String playlistId, int index) throws IOException { if (StringUtils.isBlank(session) || StringUtils.isBlank(playlistId)) ExceptionHandler.throwErrorResponse(new InvalidRequestResponse("session and playlistId are required parameters")); @@ -303,15 +303,41 @@ public class AuthPlaylistHandlers { return mapper.writeValueAsBytes(mapper.createObjectNode() .put("error", "You are not the owner this playlist")); - if (index != null) { - if (index < 0 || index >= playlist.getVideos().size()) - return mapper.writeValueAsBytes(mapper.createObjectNode() - .put("error", "Video Index out of bounds")); + if (index < 0 || index >= playlist.getVideos().size()) + return mapper.writeValueAsBytes(mapper.createObjectNode() + .put("error", "Video Index out of bounds")); - playlist.getVideos().remove((int) index); - } else { - playlist.getVideos().clear(); - } + playlist.getVideos().remove(index); + + var tr = s.beginTransaction(); + s.merge(playlist); + tr.commit(); + + return mapper.writeValueAsBytes(new AcceptedResponse()); + } + } + + public static byte[] clearPlaylistResponse(String session, String playlistId) throws IOException { + if (StringUtils.isBlank(session) || StringUtils.isBlank(playlistId)) + ExceptionHandler.throwErrorResponse(new InvalidRequestResponse("session and playlistId are required parameters")); + + try (Session s = DatabaseSessionFactory.createSession()) { + var cb = s.getCriteriaBuilder(); + var query = cb.createQuery(me.kavin.piped.utils.obj.db.Playlist.class); + var root = query.from(me.kavin.piped.utils.obj.db.Playlist.class); + root.fetch("videos", JoinType.RIGHT); + query.where(cb.equal(root.get("playlist_id"), UUID.fromString(playlistId))); + var playlist = s.createQuery(query).uniqueResult(); + + if (playlist == null) + return mapper.writeValueAsBytes(mapper.createObjectNode() + .put("error", "Playlist not found")); + + if (playlist.getOwner().getId() != DatabaseHelper.getUserFromSession(session).getId()) + return mapper.writeValueAsBytes(mapper.createObjectNode() + .put("error", "You are not the owner this playlist")); + + playlist.getVideos().clear(); var tr = s.beginTransaction(); s.merge(playlist);