mirror of
https://github.com/TeamPiped/Piped-Backend.git
synced 2024-08-14 23:51:41 +00:00
Merge ac0ffefa33
into 32f8c9b6c4
This commit is contained in:
commit
a45bb52be2
2 changed files with 62 additions and 11 deletions
|
@ -308,7 +308,19 @@ public class ServerLauncher extends MultithreadedHttpServerLauncher {
|
||||||
}
|
}
|
||||||
})).map(GET, "/feed", AsyncServlet.ofBlocking(executor, request -> {
|
})).map(GET, "/feed", AsyncServlet.ofBlocking(executor, request -> {
|
||||||
try {
|
try {
|
||||||
return getJsonResponse(FeedHandlers.feedResponse(request.getQueryParameter("authToken")),
|
|
||||||
|
int limit;
|
||||||
|
try {
|
||||||
|
var limitStr = request.getQueryParameter("limit");
|
||||||
|
if (!StringUtils.isEmpty(limitStr))
|
||||||
|
limit = Math.min(Integer.parseInt(limitStr), 100);
|
||||||
|
else
|
||||||
|
limit = 100;
|
||||||
|
} catch (NumberFormatException e) {
|
||||||
|
limit = 100;
|
||||||
|
}
|
||||||
|
|
||||||
|
return getJsonResponse(FeedHandlers.feedResponse(request.getQueryParameter("authToken"), request.getQueryParameter("start"), limit),
|
||||||
"private");
|
"private");
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
return getErrorResponse(e, request.getPath());
|
return getErrorResponse(e, request.getPath());
|
||||||
|
@ -322,8 +334,20 @@ public class ServerLauncher extends MultithreadedHttpServerLauncher {
|
||||||
}
|
}
|
||||||
})).map(GET, "/feed/unauthenticated", AsyncServlet.ofBlocking(executor, request -> {
|
})).map(GET, "/feed/unauthenticated", AsyncServlet.ofBlocking(executor, request -> {
|
||||||
try {
|
try {
|
||||||
|
|
||||||
|
int limit;
|
||||||
|
try {
|
||||||
|
var limitStr = request.getQueryParameter("limit");
|
||||||
|
if (!StringUtils.isEmpty(limitStr))
|
||||||
|
limit = Math.min(Integer.parseInt(limitStr), 100);
|
||||||
|
else
|
||||||
|
limit = 100;
|
||||||
|
} catch (NumberFormatException e) {
|
||||||
|
limit = 100;
|
||||||
|
}
|
||||||
|
|
||||||
return getJsonResponse(FeedHandlers.unauthenticatedFeedResponse(
|
return getJsonResponse(FeedHandlers.unauthenticatedFeedResponse(
|
||||||
getArray(request.getQueryParameter("channels"))
|
getArray(request.getQueryParameter("channels")), request.getQueryParameter("start"), limit
|
||||||
), "public, s-maxage=120");
|
), "public, s-maxage=120");
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
return getErrorResponse(e, request.getPath());
|
return getErrorResponse(e, request.getPath());
|
||||||
|
@ -332,7 +356,19 @@ public class ServerLauncher extends MultithreadedHttpServerLauncher {
|
||||||
try {
|
try {
|
||||||
String[] subscriptions = mapper.readValue(request.loadBody().getResult().asArray(),
|
String[] subscriptions = mapper.readValue(request.loadBody().getResult().asArray(),
|
||||||
String[].class);
|
String[].class);
|
||||||
return getJsonResponse(FeedHandlers.unauthenticatedFeedResponse(subscriptions), "public, s-maxage=120");
|
|
||||||
|
int limit;
|
||||||
|
try {
|
||||||
|
var limitStr = request.getQueryParameter("limit");
|
||||||
|
if (!StringUtils.isEmpty(limitStr))
|
||||||
|
limit = Math.min(Integer.parseInt(limitStr), 100);
|
||||||
|
else
|
||||||
|
limit = 100;
|
||||||
|
} catch (NumberFormatException e) {
|
||||||
|
limit = 100;
|
||||||
|
}
|
||||||
|
|
||||||
|
return getJsonResponse(FeedHandlers.unauthenticatedFeedResponse(subscriptions, request.getQueryParameter("start"), limit), "public, s-maxage=120");
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
return getErrorResponse(e, request.getPath());
|
return getErrorResponse(e, request.getPath());
|
||||||
}
|
}
|
||||||
|
|
|
@ -93,7 +93,7 @@ public class FeedHandlers {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static byte[] feedResponse(String session) throws IOException {
|
public static byte[] feedResponse(String session, String start, int limit) throws IOException {
|
||||||
|
|
||||||
if (StringUtils.isBlank(session))
|
if (StringUtils.isBlank(session))
|
||||||
ExceptionHandler.throwErrorResponse(new InvalidRequestResponse("session is a required parameter"));
|
ExceptionHandler.throwErrorResponse(new InvalidRequestResponse("session is a required parameter"));
|
||||||
|
@ -114,13 +114,20 @@ public class FeedHandlers {
|
||||||
subquery.select(subroot.get("subscribed_ids"))
|
subquery.select(subroot.get("subscribed_ids"))
|
||||||
.where(cb.equal(subroot.get("id"), user.getId()));
|
.where(cb.equal(subroot.get("id"), user.getId()));
|
||||||
|
|
||||||
|
var channelPredicate = root.get("channel").get("uploader_id").in(subquery);
|
||||||
|
|
||||||
criteria.select(root)
|
criteria.select(root)
|
||||||
.where(
|
.where(
|
||||||
root.get("channel").get("uploader_id").in(subquery)
|
start == null ? channelPredicate : cb.and(
|
||||||
|
channelPredicate,
|
||||||
|
cb.lessThan(root.get("uploaded"), Long.parseLong(start))
|
||||||
|
)
|
||||||
)
|
)
|
||||||
.orderBy(cb.desc(root.get("uploaded")));
|
.orderBy(cb.desc(root.get("uploaded")));
|
||||||
|
|
||||||
List<StreamItem> feedItems = s.createQuery(criteria).setTimeout(20).stream()
|
List<StreamItem> feedItems = s.createQuery(criteria)
|
||||||
|
.setMaxResults(limit)
|
||||||
|
.setTimeout(20).stream()
|
||||||
.parallel().map(video -> {
|
.parallel().map(video -> {
|
||||||
var channel = video.getChannel();
|
var channel = video.getChannel();
|
||||||
|
|
||||||
|
@ -193,7 +200,7 @@ public class FeedHandlers {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static byte[] unauthenticatedFeedResponse(String[] channelIds) throws Exception {
|
public static byte[] unauthenticatedFeedResponse(String[] channelIds, String start, int limit) throws Exception {
|
||||||
|
|
||||||
Set<String> filtered = Arrays.stream(channelIds)
|
Set<String> filtered = Arrays.stream(channelIds)
|
||||||
.filter(ChannelHelpers::isValidId)
|
.filter(ChannelHelpers::isValidId)
|
||||||
|
@ -211,13 +218,20 @@ public class FeedHandlers {
|
||||||
var root = criteria.from(Video.class);
|
var root = criteria.from(Video.class);
|
||||||
root.fetch("channel", JoinType.RIGHT);
|
root.fetch("channel", JoinType.RIGHT);
|
||||||
|
|
||||||
|
var channelPredicate = root.get("channel").get("id").in(filtered);
|
||||||
|
|
||||||
criteria.select(root)
|
criteria.select(root)
|
||||||
.where(cb.and(
|
.where(
|
||||||
root.get("channel").get("id").in(filtered)
|
start == null ? channelPredicate : cb.and(
|
||||||
))
|
channelPredicate,
|
||||||
|
cb.lessThan(root.get("uploaded"), Long.parseLong(start))
|
||||||
|
)
|
||||||
|
)
|
||||||
.orderBy(cb.desc(root.get("uploaded")));
|
.orderBy(cb.desc(root.get("uploaded")));
|
||||||
|
|
||||||
List<StreamItem> feedItems = s.createQuery(criteria).setTimeout(20).stream()
|
List<StreamItem> feedItems = s.createQuery(criteria)
|
||||||
|
.setMaxResults(limit)
|
||||||
|
.setTimeout(20).stream()
|
||||||
.parallel().map(video -> {
|
.parallel().map(video -> {
|
||||||
var channel = video.getChannel();
|
var channel = video.getChannel();
|
||||||
|
|
||||||
|
@ -334,6 +348,7 @@ public class FeedHandlers {
|
||||||
|
|
||||||
var tr = s.beginTransaction();
|
var tr = s.beginTransaction();
|
||||||
channelIds.stream()
|
channelIds.stream()
|
||||||
|
.filter(ChannelHelpers::isValidId)
|
||||||
.filter(id -> !existing.contains(id))
|
.filter(id -> !existing.contains(id))
|
||||||
.map(UnauthenticatedSubscription::new)
|
.map(UnauthenticatedSubscription::new)
|
||||||
.forEach(s::insert);
|
.forEach(s::insert);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue