diff --git a/src/main/java/me/kavin/piped/ServerLauncher.java b/src/main/java/me/kavin/piped/ServerLauncher.java index 120bc44..45f6ea4 100644 --- a/src/main/java/me/kavin/piped/ServerLauncher.java +++ b/src/main/java/me/kavin/piped/ServerLauncher.java @@ -17,6 +17,7 @@ import me.kavin.piped.utils.*; import me.kavin.piped.utils.resp.ErrorResponse; import me.kavin.piped.utils.resp.LoginRequest; import me.kavin.piped.utils.resp.SubscriptionUpdateRequest; +import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.exception.ExceptionUtils; import org.hibernate.Session; import org.jetbrains.annotations.NotNull; @@ -129,8 +130,10 @@ public class ServerLauncher extends MultithreadedHttpServerLauncher { } })).map(GET, "/playlists/:playlistId", AsyncServlet.ofBlocking(executor, request -> { try { - return getJsonResponse(ResponseHelper.playlistResponse(request.getPathParameter("playlistId")), - "public, max-age=600", true); + var playlistId = request.getPathParameter("playlistId"); + var cache = StringUtils.isBlank(playlistId) || playlistId.length() != 36 ? + "public, max-age=600" : "private"; + return getJsonResponse(ResponseHelper.playlistResponse(playlistId), cache, true); } catch (Exception e) { return getErrorResponse(e, request.getPath()); } @@ -278,6 +281,45 @@ public class ServerLauncher extends MultithreadedHttpServerLauncher { } catch (Exception e) { return getErrorResponse(e, request.getPath()); } + })).map(POST, "/user/playlists/create", AsyncServlet.ofBlocking(executor, request -> { + try { + var name = Constants.mapper.readTree(request.loadBody().getResult().asArray()).get("name").asText(); + return getJsonResponse(ResponseHelper.createPlaylist(request.getHeader(AUTHORIZATION), name), "private"); + } catch (Exception e) { + return getErrorResponse(e, request.getPath()); + } + })).map(GET, "/user/playlists", AsyncServlet.ofBlocking(executor, request -> { + try { + return getJsonResponse(ResponseHelper.playlistsResponse(request.getHeader(AUTHORIZATION)), "private"); + } catch (Exception e) { + return getErrorResponse(e, request.getPath()); + } + })).map(POST, "/user/playlists/add", AsyncServlet.ofBlocking(executor, request -> { + try { + var json = Constants.mapper.readTree(request.loadBody().getResult().asArray()); + var playlistId = json.get("playlistId").asText(); + var videoId = json.get("videoId").asText(); + return getJsonResponse(ResponseHelper.addToPlaylistResponse(request.getHeader(AUTHORIZATION), playlistId, videoId), "private"); + } catch (Exception e) { + return getErrorResponse(e, request.getPath()); + } + })).map(POST, "/user/playlists/remove", AsyncServlet.ofBlocking(executor, request -> { + try { + var json = Constants.mapper.readTree(request.loadBody().getResult().asArray()); + var playlistId = json.get("playlistId").asText(); + var index = json.get("index").asInt(); + return getJsonResponse(ResponseHelper.removeFromPlaylistResponse(request.getHeader(AUTHORIZATION), playlistId, index), "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()); + var playlistId = json.get("playlistId").asText(); + return getJsonResponse(ResponseHelper.deletePlaylistResponse(request.getHeader(AUTHORIZATION), playlistId), "private"); + } catch (Exception e) { + return getErrorResponse(e, request.getPath()); + } })).map(GET, "/registered/badge", AsyncServlet.ofBlocking(executor, request -> { try { return HttpResponse.ofCode(302).withHeader(LOCATION, ResponseHelper.registeredBadgeRedirect()) diff --git a/src/main/java/me/kavin/piped/utils/DatabaseHelper.java b/src/main/java/me/kavin/piped/utils/DatabaseHelper.java index ce1fbae..9dce955 100644 --- a/src/main/java/me/kavin/piped/utils/DatabaseHelper.java +++ b/src/main/java/me/kavin/piped/utils/DatabaseHelper.java @@ -1,19 +1,17 @@ package me.kavin.piped.utils; -import me.kavin.piped.utils.obj.db.Channel; -import me.kavin.piped.utils.obj.db.PubSub; -import me.kavin.piped.utils.obj.db.User; -import me.kavin.piped.utils.obj.db.Video; +import me.kavin.piped.utils.obj.db.*; import org.hibernate.Session; import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.JoinType; import javax.persistence.criteria.Root; +import java.util.UUID; public class DatabaseHelper { - public static final User getUserFromSession(String session) { + public static User getUserFromSession(String session) { try (Session s = DatabaseSessionFactory.createSession()) { CriteriaBuilder cb = s.getCriteriaBuilder(); CriteriaQuery cr = cb.createQuery(User.class); @@ -24,7 +22,7 @@ public class DatabaseHelper { } } - public static final User getUserFromSessionWithSubscribed(String session) { + public static User getUserFromSessionWithSubscribed(String session) { try (Session s = DatabaseSessionFactory.createSession()) { CriteriaBuilder cb = s.getCriteriaBuilder(); CriteriaQuery cr = cb.createQuery(User.class); @@ -36,7 +34,7 @@ public class DatabaseHelper { } } - public static final Channel getChannelFromId(Session s, String id) { + public static Channel getChannelFromId(Session s, String id) { CriteriaBuilder cb = s.getCriteriaBuilder(); CriteriaQuery cr = cb.createQuery(Channel.class); Root root = cr.from(Channel.class); @@ -45,7 +43,7 @@ public class DatabaseHelper { return s.createQuery(cr).uniqueResult(); } - public static final Video getVideoFromId(Session s, String id) { + public static Video getVideoFromId(Session s, String id) { CriteriaBuilder cb = s.getCriteriaBuilder(); CriteriaQuery