From 0d517e182dcf97e9fe46f6524f1d116ca5a94929 Mon Sep 17 00:00:00 2001 From: Jake Mannens Date: Wed, 1 Apr 2026 06:00:33 +1100 Subject: v0.6a --- Enum.cs | 6 ++++++ Pages/Gallery.razor | 17 ++++++++++++++--- Server.csproj | 4 ++-- Services/FeedService.cs | 37 +++++++++++++++++++++++++++++-------- 4 files changed, 51 insertions(+), 13 deletions(-) diff --git a/Enum.cs b/Enum.cs index 6d68f96..bc49691 100644 --- a/Enum.cs +++ b/Enum.cs @@ -1,5 +1,11 @@ namespace HyperBooru; +public enum SortOrder { + ObjectId, + LastWriteTime, + Random, +} + public enum PathType { Windows, Unix diff --git a/Pages/Gallery.razor b/Pages/Gallery.razor index 704b73d..1464c13 100644 --- a/Pages/Gallery.razor +++ b/Pages/Gallery.razor @@ -58,6 +58,10 @@ [SupplyParameterFromQuery(Name = "q")] public string? Query { get; set; } + [Parameter] + [SupplyParameterFromQuery(Name = "s")] + public string? SortOrder { get; set; } + [Parameter] [SupplyParameterFromQuery] public bool Ingest { get; set; } = false; @@ -94,26 +98,33 @@ if(initial) displayMedia = new(); + SortOrder? sortOrder = null; + if(Enum.TryParse(SortOrder, true, out var so)) + sortOrder = so; + if(TagId is not null && Query is null) { displayMedia!.AddRange(feedService.LoadChunk( selectIngest: Ingest, includeNsfw: userService.UserSessionState.ShowNsfw, tagId: (Guid) TagId!, key: key, - count: PageSize)); + count: PageSize, + sortOrder: sortOrder ?? default)); } else if(Query is not null && TagId is null) { displayMedia!.AddRange(feedService.LoadChunk( selectIngest: Ingest, includeNsfw: userService.UserSessionState.ShowNsfw, query: string.IsNullOrWhiteSpace(Query) ? null : Query, key: key, - count: PageSize)); + count: PageSize, + sortOrder: sortOrder ?? default)); } else { displayMedia!.AddRange(feedService.LoadChunk( selectIngest: Ingest, includeNsfw: userService.UserSessionState.ShowNsfw, key: key, - count: PageSize)); + count: PageSize, + sortOrder: sortOrder ?? default)); } StateHasChanged(); diff --git a/Server.csproj b/Server.csproj index 1a48326..46a9ffd 100644 --- a/Server.csproj +++ b/Server.csproj @@ -6,9 +6,9 @@ enable HyperBooru HyperBooru - 0.5.0.0 + 0.6.0.0 $(AssemblyVersion) - 0.5-alpha + 0.6-alpha 2907567f-4640-4581-8f4d-0977952d26bd diff --git a/Services/FeedService.cs b/Services/FeedService.cs index 864a751..77f92b5 100644 --- a/Services/FeedService.cs +++ b/Services/FeedService.cs @@ -7,21 +7,24 @@ public interface IFeedService { bool selectIngest, bool includeNsfw, Media? key = null, - int count = 50); + int count = 50, + SortOrder sortOrder = SortOrder.ObjectId); public Media[] LoadChunk( bool selectIngest, bool includeNsfw, string query, Media? key = null, - int count = 50); + int count = 50, + SortOrder sortOrder = SortOrder.ObjectId); public Media[] LoadChunk( bool selectIngest, bool includeNsfw, Guid tagId, Media? key = null, - int count = 50); + int count = 50, + SortOrder sortOrder = SortOrder.ObjectId); } public class FeedService : IFeedService { @@ -34,21 +37,27 @@ public class FeedService : IFeedService { bool selectIngest, bool includeNsfw, Media? key, - int count) => LoadChunkInternal(selectIngest, includeNsfw, null, null, key, count); + int count, + SortOrder sortOrder) => LoadChunkInternal( + selectIngest, includeNsfw, null, null, key, count, sortOrder); public Media[] LoadChunk( bool selectIngest, bool includeNsfw, string query, Media? key, - int count) => LoadChunkInternal(selectIngest, includeNsfw, query, null, key, count); + int count, + SortOrder sortOrder) => LoadChunkInternal( + selectIngest, includeNsfw, query, null, key, count, sortOrder); public Media[] LoadChunk( bool selectIngest, bool includeNsfw, Guid tagId, Media? key, - int count) => LoadChunkInternal(selectIngest, includeNsfw, null, tagId, key, count); + int count, + SortOrder sortOrder) => LoadChunkInternal( + selectIngest, includeNsfw, null, tagId, key, count, sortOrder); private Media[] LoadChunkInternal( bool selectIngest, @@ -56,7 +65,8 @@ public class FeedService : IFeedService { string? query, Guid? tagId, Media? key, - int count) { + int count, + SortOrder sortOrder) { if(selectIngest && !includeNsfw) return Array.Empty(); @@ -99,8 +109,19 @@ public class FeedService : IFeedService { if(key is not null) media = media.Where(m => m.ObjectId > key.ObjectId); + switch(sortOrder) { + case SortOrder.ObjectId: + media = media.OrderBy(m => m.ObjectId); + break; + case SortOrder.LastWriteTime: + media = media.OrderBy(m => m.CurrentUploadedFile!.LastWriteTime); + break; + case SortOrder.Random: + media = media.OrderBy(m => EF.Functions.Random()); + break; + } + return media - .OrderBy(m => m.ObjectId) .Take(count) .ToArray(); } -- cgit v1.3