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; } } }