summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJake Mannens <jake@asger.xyz>2026-05-13 00:48:51 +1000
committerJake Mannens <jake@asger.xyz>2026-05-13 00:48:51 +1000
commitc2b3c05f027d315f4e553ff656d1f06e99a82488 (patch)
treeaefdc66bb705241807f4365cebe4c4964192d3a4
parenta565ebb08901e9d1854f8bcfc669063ddea49bce (diff)
v0.16av0.16a
-rw-r--r--Controllers/ApiFeedController.cs25
-rw-r--r--Server.csproj4
-rw-r--r--Services/FeedService.cs53
3 files changed, 71 insertions, 11 deletions
diff --git a/Controllers/ApiFeedController.cs b/Controllers/ApiFeedController.cs
new file mode 100644
index 0000000..382169e
--- /dev/null
+++ b/Controllers/ApiFeedController.cs
@@ -0,0 +1,25 @@
+using HyperBooru.ApiModels;
+using HyperBooru.Services;
+using Microsoft.AspNetCore.Authorization;
+using Microsoft.AspNetCore.Mvc;
+using Microsoft.EntityFrameworkCore;
+
+namespace HyperBooru.Controllers;
+
+[ApiController]
+[Authorize]
+[Route("/api/feed")]
+public class ApiFeedController : Controller {
+ private IFeedService feedService;
+
+ public ApiFeedController(IDbContextFactory<HBContext> dbFactory, IFeedService feedService) =>
+ this.feedService = feedService;
+
+ [HttpPost]
+ public IActionResult FetchChunkAsync([FromBody] FeedRequest feedRequest) {
+ if(feedRequest.Count > 1000)
+ return BadRequest("Total number of requested items exceeds maximum");
+
+ return Ok(feedService.LoadChunk(feedRequest).Select(m => m.Guid).ToArray());
+ }
+}
diff --git a/Server.csproj b/Server.csproj
index 61c9b6b..aeccae2 100644
--- a/Server.csproj
+++ b/Server.csproj
@@ -6,9 +6,9 @@
<ImplicitUsings>enable</ImplicitUsings>
<AssemblyName>HyperBooru</AssemblyName>
<RootNamespace>HyperBooru</RootNamespace>
- <AssemblyVersion>0.15.0.0</AssemblyVersion>
+ <AssemblyVersion>0.16.0.0</AssemblyVersion>
<FileVersion>$(AssemblyVersion)</FileVersion>
- <Version>0.15-alpha</Version>
+ <Version>0.16-alpha</Version>
<UserSecretsId>2907567f-4640-4581-8f4d-0977952d26bd</UserSecretsId>
</PropertyGroup>
diff --git a/Services/FeedService.cs b/Services/FeedService.cs
index 067bff7..3744e73 100644
--- a/Services/FeedService.cs
+++ b/Services/FeedService.cs
@@ -26,6 +26,8 @@ public interface IFeedService {
Media? key = null,
int count = 50,
SortOrder sortOrder = SortOrder.ObjectId);
+
+ public Media[] LoadChunk(FeedRequest feedRequest);
}
public class FeedService : IFeedService {
@@ -37,35 +39,67 @@ public class FeedService : IFeedService {
public Media[] LoadChunk(
bool selectIngest,
bool includeNsfw,
- Media? key,
+ Media? continuationToken,
int count,
SortOrder sortOrder) => LoadChunkInternal(
- selectIngest, includeNsfw, null, null, key, count, sortOrder);
+ selectIngest, includeNsfw, null, null, continuationToken?.Guid, count, sortOrder);
public Media[] LoadChunk(
bool selectIngest,
bool includeNsfw,
string query,
- Media? key,
+ Media? continuationToken,
int count,
SortOrder sortOrder) => LoadChunkInternal(
- selectIngest, includeNsfw, query, null, key, count, sortOrder);
+ selectIngest, includeNsfw, query, null, continuationToken?.Guid, count, sortOrder);
public Media[] LoadChunk(
bool selectIngest,
bool includeNsfw,
Guid tagId,
- Media? key,
+ Media? continuationToken,
int count,
SortOrder sortOrder) => LoadChunkInternal(
- selectIngest, includeNsfw, null, tagId, key, count, sortOrder);
+ selectIngest, includeNsfw, null, tagId, continuationToken?.Guid, count, sortOrder);
+
+ public Media[] LoadChunk(FeedRequest feedRequest) {
+ switch(feedRequest) {
+ case FeedSearchRequest searchRequest:
+ return LoadChunkInternal(
+ selectIngest: searchRequest.SelectIngest,
+ includeNsfw: searchRequest.IncludeNsfw,
+ query: searchRequest.Query,
+ tagId: null,
+ continuationToken: searchRequest.ContinuationToken,
+ count: searchRequest.Count,
+ sortOrder: searchRequest.SortOrder);
+ case FeedTagRequest tagRequest:
+ return LoadChunkInternal(
+ selectIngest: tagRequest.SelectIngest,
+ includeNsfw: tagRequest.IncludeNsfw,
+ query: null,
+ tagId: tagRequest.TagId,
+ continuationToken: tagRequest.ContinuationToken,
+ count: tagRequest.Count,
+ sortOrder: tagRequest.SortOrder);
+ default:
+ return LoadChunkInternal(
+ selectIngest: feedRequest.SelectIngest,
+ includeNsfw: feedRequest.IncludeNsfw,
+ query: null,
+ tagId: null,
+ continuationToken: feedRequest.ContinuationToken,
+ count: feedRequest.Count,
+ sortOrder: feedRequest.SortOrder);
+ }
+ }
private Media[] LoadChunkInternal(
bool selectIngest,
bool includeNsfw,
string? query,
Guid? tagId,
- Media? key,
+ Guid? continuationToken,
int count,
SortOrder sortOrder) {
@@ -107,8 +141,9 @@ public class FeedService : IFeedService {
.Any());
}
- if(key is not null)
- media = media.Where(m => m.ObjectId > key.ObjectId);
+ if(continuationToken is not null)
+ media = media
+ .Where(m => m.ObjectId > db.Media.First(m => m.Guid == continuationToken).ObjectId);
switch(sortOrder) {
case SortOrder.ObjectId: