mirror of
https://github.com/zoriya/Kyoo.git
synced 2025-05-24 02:02:36 -04:00
Fix reverse sorting
This commit is contained in:
parent
253e256458
commit
067eafbbe4
@ -106,23 +106,23 @@ namespace Kyoo.Core.Controllers
|
|||||||
return $"coalesce({string.Join(", ", keys)})";
|
return $"coalesce({string.Join(", ", keys)})";
|
||||||
}
|
}
|
||||||
|
|
||||||
public static string ProcessSort<T>(Sort<T>? sort, Dictionary<string, Type> config, bool recurse = false)
|
public static string ProcessSort<T>(Sort<T>? sort, bool reverse, Dictionary<string, Type> config, bool recurse = false)
|
||||||
where T : IQuery
|
where T : IQuery
|
||||||
{
|
{
|
||||||
sort ??= new Sort<T>.Default();
|
sort ??= new Sort<T>.Default();
|
||||||
|
|
||||||
string ret = sort switch
|
string ret = sort switch
|
||||||
{
|
{
|
||||||
Sort<T>.Default(var value) => ProcessSort(value, config, true),
|
Sort<T>.Default(var value) => ProcessSort(value, reverse, config, true),
|
||||||
Sort<T>.By(string key, bool desc) => $"{_Property(key, config)} {(desc ? "desc" : "asc")}",
|
Sort<T>.By(string key, bool desc) => $"{_Property(key, config)} {(desc ^ reverse ? "desc" : "asc")}",
|
||||||
Sort<T>.Random(var seed) => $"md5('{seed}' || {_Property("id", config)})",
|
Sort<T>.Random(var seed) => $"md5('{seed}' || {_Property("id", config)}) {(reverse ? "desc" : "asc")}",
|
||||||
Sort<T>.Conglomerate(var list) => string.Join(", ", list.Select(x => ProcessSort(x, config, true))),
|
Sort<T>.Conglomerate(var list) => string.Join(", ", list.Select(x => ProcessSort(x, reverse, config, true))),
|
||||||
_ => throw new SwitchExpressionException(),
|
_ => throw new SwitchExpressionException(),
|
||||||
};
|
};
|
||||||
if (recurse)
|
if (recurse)
|
||||||
return ret;
|
return ret;
|
||||||
// always end query by an id sort.
|
// always end query by an id sort.
|
||||||
return $"{ret}, {_Property("id", config)} asc";
|
return $"{ret}, {_Property("id", config)} {(reverse ? "desc" : "asc")}";
|
||||||
}
|
}
|
||||||
|
|
||||||
public static (
|
public static (
|
||||||
@ -278,7 +278,7 @@ namespace Kyoo.Core.Controllers
|
|||||||
}
|
}
|
||||||
if (filter != null)
|
if (filter != null)
|
||||||
query += ProcessFilter(filter, config);
|
query += ProcessFilter(filter, config);
|
||||||
query += $"order by {ProcessSort(sort, config):raw}";
|
query += $"order by {ProcessSort(sort, limit.Reverse, config):raw}";
|
||||||
query += $"limit {limit.Limit}";
|
query += $"limit {limit.Limit}";
|
||||||
|
|
||||||
Type[] types = config.Select(x => x.Value)
|
Type[] types = config.Select(x => x.Value)
|
||||||
@ -294,6 +294,8 @@ namespace Kyoo.Core.Controllers
|
|||||||
return mapIncludes(collection, items.Skip(3));
|
return mapIncludes(collection, items.Skip(3));
|
||||||
throw new InvalidDataException();
|
throw new InvalidDataException();
|
||||||
});
|
});
|
||||||
|
if (limit.Reverse)
|
||||||
|
data = data.Reverse();
|
||||||
return data.ToList();
|
return data.ToList();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -302,6 +302,8 @@ namespace Kyoo.Core.Controllers
|
|||||||
query = query.Reverse();
|
query = query.Reverse();
|
||||||
if (limit.Limit > 0)
|
if (limit.Limit > 0)
|
||||||
query = query.Take(limit.Limit);
|
query = query.Take(limit.Limit);
|
||||||
|
if (limit.Reverse)
|
||||||
|
query = query.Reverse();
|
||||||
|
|
||||||
return await query.ToListAsync();
|
return await query.ToListAsync();
|
||||||
}
|
}
|
||||||
|
@ -34,7 +34,6 @@ namespace Kyoo.Core.Api
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
/// <typeparam name="T">The type of resource to make CRUD apis for.</typeparam>
|
/// <typeparam name="T">The type of resource to make CRUD apis for.</typeparam>
|
||||||
[ApiController]
|
[ApiController]
|
||||||
[ResourceView]
|
|
||||||
public class CrudApi<T> : BaseApi
|
public class CrudApi<T> : BaseApi
|
||||||
where T : class, IResource, IQuery
|
where T : class, IResource, IQuery
|
||||||
{
|
{
|
||||||
|
@ -34,7 +34,6 @@ namespace Kyoo.Core.Api
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
/// <typeparam name="T">The type of resource to make CRUD and thumbnails apis for.</typeparam>
|
/// <typeparam name="T">The type of resource to make CRUD and thumbnails apis for.</typeparam>
|
||||||
[ApiController]
|
[ApiController]
|
||||||
[ResourceView]
|
|
||||||
public class CrudThumbsApi<T> : CrudApi<T>
|
public class CrudThumbsApi<T> : CrudApi<T>
|
||||||
where T : class, IResource, IThumbnails, IQuery
|
where T : class, IResource, IThumbnails, IQuery
|
||||||
{
|
{
|
||||||
|
@ -1,49 +0,0 @@
|
|||||||
// Kyoo - A portable and vast media library solution.
|
|
||||||
// Copyright (c) Kyoo.
|
|
||||||
//
|
|
||||||
// See AUTHORS.md and LICENSE file in the project root for full license information.
|
|
||||||
//
|
|
||||||
// Kyoo is free software: you can redistribute it and/or modify
|
|
||||||
// it under the terms of the GNU General Public License as published by
|
|
||||||
// the Free Software Foundation, either version 3 of the License, or
|
|
||||||
// any later version.
|
|
||||||
//
|
|
||||||
// Kyoo is distributed in the hope that it will be useful,
|
|
||||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
// GNU General Public License for more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License
|
|
||||||
// along with Kyoo. If not, see <https://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using Microsoft.AspNetCore.Mvc.Filters;
|
|
||||||
|
|
||||||
namespace Kyoo.Core.Api
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// An attribute to put on most controllers. It handle fields loading (only retuning fields requested and if they
|
|
||||||
/// are requested, load them) and help for the <c>where</c> query parameter.
|
|
||||||
/// </summary>
|
|
||||||
public class ResourceViewAttribute : ActionFilterAttribute
|
|
||||||
{
|
|
||||||
/// <inheritdoc />
|
|
||||||
public override void OnActionExecuting(ActionExecutingContext context)
|
|
||||||
{
|
|
||||||
if (context.ActionArguments.TryGetValue("where", out object? dic) && dic is Dictionary<string, string> where)
|
|
||||||
{
|
|
||||||
Dictionary<string, string> nWhere = new(where, StringComparer.InvariantCultureIgnoreCase);
|
|
||||||
nWhere.Remove("fields");
|
|
||||||
nWhere.Remove("afterID");
|
|
||||||
nWhere.Remove("limit");
|
|
||||||
nWhere.Remove("reverse");
|
|
||||||
foreach ((string key, _) in context.ActionArguments)
|
|
||||||
nWhere.Remove(key);
|
|
||||||
context.ActionArguments["where"] = nWhere;
|
|
||||||
}
|
|
||||||
|
|
||||||
base.OnActionExecuting(context);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -16,16 +16,10 @@
|
|||||||
// You should have received a copy of the GNU General Public License
|
// You should have received a copy of the GNU General Public License
|
||||||
// along with Kyoo. If not, see <https://www.gnu.org/licenses/>.
|
// along with Kyoo. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq.Expressions;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using Kyoo.Abstractions.Controllers;
|
using Kyoo.Abstractions.Controllers;
|
||||||
using Kyoo.Abstractions.Models;
|
using Kyoo.Abstractions.Models;
|
||||||
using Kyoo.Abstractions.Models.Attributes;
|
using Kyoo.Abstractions.Models.Attributes;
|
||||||
using Kyoo.Abstractions.Models.Permissions;
|
using Kyoo.Abstractions.Models.Permissions;
|
||||||
using Kyoo.Abstractions.Models.Utils;
|
|
||||||
using Microsoft.AspNetCore.Http;
|
|
||||||
using Microsoft.AspNetCore.Mvc;
|
using Microsoft.AspNetCore.Mvc;
|
||||||
using static Kyoo.Abstractions.Models.Utils.Constants;
|
using static Kyoo.Abstractions.Models.Utils.Constants;
|
||||||
|
|
||||||
@ -37,7 +31,6 @@ namespace Kyoo.Core.Api
|
|||||||
[Route("staff")]
|
[Route("staff")]
|
||||||
[Route("people", Order = AlternativeRoute)]
|
[Route("people", Order = AlternativeRoute)]
|
||||||
[ApiController]
|
[ApiController]
|
||||||
[ResourceView]
|
|
||||||
[PartialPermission(nameof(People))]
|
[PartialPermission(nameof(People))]
|
||||||
[ApiDefinition("Staff", Group = MetadataGroup)]
|
[ApiDefinition("Staff", Group = MetadataGroup)]
|
||||||
public class StaffApi : CrudThumbsApi<People>
|
public class StaffApi : CrudThumbsApi<People>
|
||||||
|
@ -34,7 +34,6 @@ namespace Kyoo.Core.Api
|
|||||||
[Route("episodes")]
|
[Route("episodes")]
|
||||||
[Route("episode", Order = AlternativeRoute)]
|
[Route("episode", Order = AlternativeRoute)]
|
||||||
[ApiController]
|
[ApiController]
|
||||||
[ResourceView]
|
|
||||||
[PartialPermission(nameof(Episode))]
|
[PartialPermission(nameof(Episode))]
|
||||||
[ApiDefinition("Episodes", Group = ResourcesGroup)]
|
[ApiDefinition("Episodes", Group = ResourcesGroup)]
|
||||||
public class EpisodeApi : CrudThumbsApi<Episode>
|
public class EpisodeApi : CrudThumbsApi<Episode>
|
||||||
|
@ -32,7 +32,6 @@ namespace Kyoo.Core.Api
|
|||||||
[Route("items")]
|
[Route("items")]
|
||||||
[Route("item", Order = AlternativeRoute)]
|
[Route("item", Order = AlternativeRoute)]
|
||||||
[ApiController]
|
[ApiController]
|
||||||
[ResourceView]
|
|
||||||
[PartialPermission("LibraryItem")]
|
[PartialPermission("LibraryItem")]
|
||||||
[ApiDefinition("Items", Group = ResourcesGroup)]
|
[ApiDefinition("Items", Group = ResourcesGroup)]
|
||||||
public class LibraryItemApi : CrudThumbsApi<ILibraryItem>
|
public class LibraryItemApi : CrudThumbsApi<ILibraryItem>
|
||||||
|
@ -31,7 +31,6 @@ namespace Kyoo.Core.Api
|
|||||||
[Route("news")]
|
[Route("news")]
|
||||||
[Route("new", Order = AlternativeRoute)]
|
[Route("new", Order = AlternativeRoute)]
|
||||||
[ApiController]
|
[ApiController]
|
||||||
[ResourceView]
|
|
||||||
[PartialPermission("LibraryItem")]
|
[PartialPermission("LibraryItem")]
|
||||||
[ApiDefinition("News", Group = ResourcesGroup)]
|
[ApiDefinition("News", Group = ResourcesGroup)]
|
||||||
public class NewsApi : CrudThumbsApi<News>
|
public class NewsApi : CrudThumbsApi<News>
|
||||||
|
@ -34,7 +34,6 @@ namespace Kyoo.Core.Api
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
[Route("search")]
|
[Route("search")]
|
||||||
[ApiController]
|
[ApiController]
|
||||||
[ResourceView]
|
|
||||||
[ApiDefinition("Search", Group = ResourcesGroup)]
|
[ApiDefinition("Search", Group = ResourcesGroup)]
|
||||||
public class SearchApi : BaseApi
|
public class SearchApi : BaseApi
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user