From 07728d1048f34e1d048da63684b341ab30bc1d06 Mon Sep 17 00:00:00 2001 From: Jake Mannens Date: Mon, 16 Oct 2023 02:01:27 +1100 Subject: FeedService and AclDialog --- Services/FeedService.cs | 78 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 Services/FeedService.cs (limited to 'Services/FeedService.cs') 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 Feed { get; } + + public void InitializeFeed( + FeedOrder order = FeedOrder.Chronological, + bool descending = true, + bool randomPosition = false); +} + +public class FeedService : IFeedService { + private FeedConfiguration? feedConfig; + + private IDbContextFactory dbFactory; + + public FeedService(IDbContextFactory dbFactory) => + this.dbFactory = dbFactory; + + public void InitializeFeed( + FeedOrder order, + bool descending, + bool randomPosition) { + + feedConfig = new() { + Order = order, + Descending = descending, + RandomPosition = randomPosition + }; + } + + public IEnumerable Feed { + get { + if(feedConfig is null) + throw new InvalidOperationException("Feed must be initialized first"); + + while(true) { + var db = dbFactory.CreateDbContext(); + + IOrderedQueryable 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; } + } +} -- cgit v1.3