diff --git a/src/main/java/me/kavin/piped/ServerLauncher.java b/src/main/java/me/kavin/piped/ServerLauncher.java index 6af8613..c2200cf 100644 --- a/src/main/java/me/kavin/piped/ServerLauncher.java +++ b/src/main/java/me/kavin/piped/ServerLauncher.java @@ -345,6 +345,15 @@ public class ServerLauncher extends MultithreadedHttpServerLauncher { } catch (Exception e) { return getErrorResponse(e, request.getPath()); } + })).map(POST, "/user/playlists/rename", AsyncServlet.ofBlocking(executor, request -> { + try { + var json = Constants.mapper.readTree(request.loadBody().getResult().asArray()); + var playlistId = json.get("playlistId").textValue(); + var newName = json.get("newName").textValue(); + return getJsonResponse(ResponseHelper.renamePlaylistResponse(request.getHeader(AUTHORIZATION), playlistId, newName), "private"); + } catch (Exception e) { + return getErrorResponse(e, request.getPath()); + } })).map(POST, "/user/playlists/delete", AsyncServlet.ofBlocking(executor, request -> { try { var json = Constants.mapper.readTree(request.loadBody().getResult().asArray()); diff --git a/src/main/java/me/kavin/piped/utils/ResponseHelper.java b/src/main/java/me/kavin/piped/utils/ResponseHelper.java index 7f76311..5d5e12a 100644 --- a/src/main/java/me/kavin/piped/utils/ResponseHelper.java +++ b/src/main/java/me/kavin/piped/utils/ResponseHelper.java @@ -1260,6 +1260,38 @@ public class ResponseHelper { } } + public static byte[] renamePlaylistResponse(String session, String playlistId, String newName) throws IOException { + + if (StringUtils.isBlank(playlistId)) + return mapper.writeValueAsBytes(new InvalidRequestResponse()); + + User user = DatabaseHelper.getUserFromSession(session); + + if (user == null) + return mapper.writeValueAsBytes(new AuthenticationFailureResponse()); + + try (Session s = DatabaseSessionFactory.createSession()) { + var playlist = DatabaseHelper.getPlaylistFromId(s, playlistId); + + if (playlist == null) + return mapper.writeValueAsBytes(mapper.createObjectNode() + .put("error", "Playlist not found")); + + if (playlist.getOwner().getId() != user.getId()) + return mapper.writeValueAsBytes(mapper.createObjectNode() + .put("error", "You do not own this playlist")); + + playlist.setName(newName); + + var tr = s.beginTransaction(); + s.merge(playlist); + tr.commit(); + + } + + return mapper.writeValueAsBytes(new AcceptedResponse()); + } + public static byte[] deletePlaylistResponse(String session, String playlistId) throws IOException { if (StringUtils.isBlank(playlistId)) diff --git a/testing/api-test.sh b/testing/api-test.sh index c546f54..a66ac26 100755 --- a/testing/api-test.sh +++ b/testing/api-test.sh @@ -99,6 +99,7 @@ sleep 2 curl ${CURLOPTS[@]} $HOST/feed -G --data-urlencode "authToken=$AUTH_TOKEN" || exit 1 PLAYLIST_NAME=$(openssl rand -hex 6) +RENAMED_PLAYLIST_NAME=$(openssl rand --hex 6) # Create a Playlist curl ${CURLOPTS[@]} $HOST/user/playlists/create -X POST -H "Content-Type: application/json" -H "Authorization: $AUTH_TOKEN" -d $(jq -n --compact-output --arg name "$PLAYLIST_NAME" '{"name": $name}') || exit 1 @@ -118,6 +119,9 @@ curl ${CURLOPTS[@]} $HOST/user/playlists/add -X POST -H "Content-Type: applicati # Remove from Playlist Test curl ${CURLOPTS[@]} $HOST/user/playlists/remove -X POST -H "Content-Type: application/json" -H "Authorization: $AUTH_TOKEN" -d $(jq -n --compact-output --arg index "0" --arg playlistId $PLAYLIST_ID '{"index": $index, "playlistId": $playlistId}') || exit 1 +# Rename Playlist Test +curl ${CURLOPTS[@]} $HOST/user/playlists/delete -X POST -H "Content-Type: application/json" -H "Authorization: $AUTH_TOKEN" -d $(jq -n --compact-output --arg playlistId $PLAYLIST_ID --arg newName $RENAMED_PLAYLIST_NAME '{"playlistId": $playlistId, "newName": $newName}') || exit 1 + # Delete Playlist Test curl ${CURLOPTS[@]} $HOST/user/playlists/delete -X POST -H "Content-Type: application/json" -H "Authorization: $AUTH_TOKEN" -d $(jq -n --compact-output --arg playlistId $PLAYLIST_ID '{"playlistId": $playlistId}') || exit 1