summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Enum.cs6
-rw-r--r--Pages/Gallery.razor17
-rw-r--r--Server.csproj4
-rw-r--r--Services/FeedService.cs37
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
@@ -59,6 +59,10 @@
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>(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 @@
<ImplicitUsings>enable</ImplicitUsings>
<AssemblyName>HyperBooru</AssemblyName>
<RootNamespace>HyperBooru</RootNamespace>
- <AssemblyVersion>0.5.0.0</AssemblyVersion>
+ <AssemblyVersion>0.6.0.0</AssemblyVersion>
<FileVersion>$(AssemblyVersion)</FileVersion>
- <Version>0.5-alpha</Version>
+ <Version>0.6-alpha</Version>
<UserSecretsId>2907567f-4640-4581-8f4d-0977952d26bd</UserSecretsId>
</PropertyGroup>
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<Media>();
@@ -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();
}