diff options
| -rw-r--r-- | Controllers/ApiFeedController.cs | 25 | ||||
| -rw-r--r-- | Server.csproj | 4 | ||||
| -rw-r--r-- | Services/FeedService.cs | 53 |
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: |
