summaryrefslogtreecommitdiff
path: root/Services/FeedService.cs
diff options
context:
space:
mode:
authorJake Mannens <jake@asger.xyz>2023-10-16 02:01:27 +1100
committerJake Mannens <jake@asger.xyz>2023-10-16 02:01:27 +1100
commit07728d1048f34e1d048da63684b341ab30bc1d06 (patch)
tree9c92b30be5f3cd060827edc2ff5836b6122a9cdd /Services/FeedService.cs
parentea89ec0c1b05ac246f2ffd5907daace27564100b (diff)
FeedService and AclDialog
Diffstat (limited to 'Services/FeedService.cs')
-rw-r--r--Services/FeedService.cs78
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; }
+ }
+}