diff options
| author | Jake Mannens <jake@asger.xyz> | 2023-10-16 02:01:27 +1100 |
|---|---|---|
| committer | Jake Mannens <jake@asger.xyz> | 2023-10-16 02:01:27 +1100 |
| commit | 07728d1048f34e1d048da63684b341ab30bc1d06 (patch) | |
| tree | 9c92b30be5f3cd060827edc2ff5836b6122a9cdd /Services/FeedService.cs | |
| parent | ea89ec0c1b05ac246f2ffd5907daace27564100b (diff) | |
FeedService and AclDialog
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; } + } +} |
