diff options
Diffstat (limited to 'Services/FeedService.cs')
| -rw-r--r-- | Services/FeedService.cs | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/Services/FeedService.cs b/Services/FeedService.cs new file mode 100644 index 0000000..c66b9ee --- /dev/null +++ b/Services/FeedService.cs @@ -0,0 +1,78 @@ +using Microsoft.EntityFrameworkCore; +using System.Data.Common; + +namespace HyperBooru.Services; + +public enum FeedOrder { + Chronological, + Rating +} + +public interface IFeedService { + public IEnumerable<Media> Feed { get; } + + public void InitializeFeed( + FeedOrder order = FeedOrder.Chronological, + bool descending = true, + bool randomPosition = false); +} + +public class FeedService : IFeedService { + private FeedConfiguration? feedConfig; + + private IDbContextFactory<HBContext> dbFactory; + + public FeedService(IDbContextFactory<HBContext> dbFactory) => + this.dbFactory = dbFactory; + + public void InitializeFeed( + FeedOrder order, + bool descending, + bool randomPosition) { + + feedConfig = new() { + Order = order, + Descending = descending, + RandomPosition = randomPosition + }; + } + + public IEnumerable<Media> Feed { + get { + if(feedConfig is null) + throw new InvalidOperationException("Feed must be initialized first"); + + while(true) { + var db = dbFactory.CreateDbContext(); + + IOrderedQueryable<Media> media; + + switch(feedConfig.Order) { + default: + case FeedOrder.Chronological: + if(feedConfig.Descending) + media = db.Media.OrderByDescending(m => m.ObjectId); + else + media = db.Media.OrderBy(m => m.ObjectId); + break; + } + + Media[] mediaArray = media.Take(50).ToArray(); + + db.Dispose(); + + if(mediaArray.Count() == 0) + break; + + foreach(var m in mediaArray) + yield return m; + } + } + } + + private record FeedConfiguration { + public FeedOrder Order { get; set; } + public bool Descending { get; set; } + public bool RandomPosition { get; set; } + } +} |
