diff --git a/back/src/Kyoo.Abstractions/Models/Utils/Sort.cs b/back/src/Kyoo.Abstractions/Models/Utils/Sort.cs index 702e6240..ddae48ed 100644 --- a/back/src/Kyoo.Abstractions/Models/Utils/Sort.cs +++ b/back/src/Kyoo.Abstractions/Models/Utils/Sort.cs @@ -56,6 +56,9 @@ namespace Kyoo.Abstractions.Controllers /// The list of keys to sort by. public record Conglomerate(params Sort[] List) : Sort; + /// Sort randomly items + public record Random() : Sort; + /// The default sort method for the given type. public record Default : Sort; @@ -69,6 +72,8 @@ namespace Kyoo.Abstractions.Controllers { if (string.IsNullOrEmpty(sortBy) || sortBy == "default") return new Default(); + if (sortBy == "random") + return new Random(); if (sortBy.Contains(',')) return new Conglomerate(sortBy.Split(',').Select(From).ToArray()); diff --git a/back/src/Kyoo.Core/Controllers/Repositories/LibraryItemRepository.cs b/back/src/Kyoo.Core/Controllers/Repositories/LibraryItemRepository.cs index 1bc010f0..045de09d 100644 --- a/back/src/Kyoo.Core/Controllers/Repositories/LibraryItemRepository.cs +++ b/back/src/Kyoo.Core/Controllers/Repositories/LibraryItemRepository.cs @@ -19,12 +19,10 @@ using System; using System.Collections.Generic; using System.Linq; -using System.Linq.Expressions; using System.Threading.Tasks; using Kyoo.Abstractions.Controllers; using Kyoo.Abstractions.Models; using Kyoo.Postgresql; -using Kyoo.Utils; using Microsoft.EntityFrameworkCore; namespace Kyoo.Core.Controllers @@ -53,42 +51,6 @@ namespace Kyoo.Core.Controllers _database = database; } - /// - public override async Task GetOrDefault(int id) - { - return await _database.LibraryItems.SingleOrDefaultAsync(x => x.Id == id).Then(SetBackingImage); - } - - /// - public override async Task GetOrDefault(string slug) - { - return await _database.LibraryItems.SingleOrDefaultAsync(x => x.Slug == slug).Then(SetBackingImage); - } - - /// - public override async Task GetOrDefault(Expression> where, Sort sortBy = default) - { - return await Sort(_database.LibraryItems, sortBy).FirstOrDefaultAsync(where).Then(SetBackingImage); - } - - /// - public override async Task> GetAll(Expression> where = null, - Sort sort = default, - Pagination limit = default) - { - return (await ApplyFilters(_database.LibraryItems, where, sort, limit)) - .Select(SetBackingImageSelf).ToList(); - } - - /// - public override Task GetCount(Expression> where = null) - { - IQueryable query = _database.LibraryItems; - if (where != null) - query = query.Where(where); - return query.CountAsync(); - } - /// public override async Task> Search(string query) { diff --git a/back/src/Kyoo.Core/Controllers/Repositories/LocalRepository.cs b/back/src/Kyoo.Core/Controllers/Repositories/LocalRepository.cs index 1af459b4..e11c7816 100644 --- a/back/src/Kyoo.Core/Controllers/Repositories/LocalRepository.cs +++ b/back/src/Kyoo.Core/Controllers/Repositories/LocalRepository.cs @@ -109,6 +109,8 @@ namespace Kyoo.Core.Controllers return _Sort(query, DefaultSort, then); case Sort.By(var key, var desc): return _SortBy(query, x => EF.Property(x, key), desc, then); + case Sort.Random: + return _SortBy(query, x => EF.Functions.Random(), false, then); case Sort.Conglomerate(var sorts): IOrderedQueryable nQuery = _Sort(query, sorts.First(), false); foreach (Sort sort in sorts.Skip(1)) @@ -169,6 +171,7 @@ namespace Kyoo.Core.Controllers Sort.Default => GetSortsBy(DefaultSort), Sort.By @sortBy => new[] { sortBy }, Sort.Conglomerate(var list) => list.SelectMany(GetSortsBy), + Sort.Random => throw new ArgumentException("Impossible to paginate randomly sorted items."), _ => Array.Empty.By>(), }; } @@ -306,6 +309,8 @@ namespace Kyoo.Core.Controllers /// public virtual Task GetOrDefault(string slug) { + if (slug == "random") + return Database.Set().OrderBy(x => EF.Functions.Random()).FirstOrDefaultAsync().Then(SetBackingImage); return Database.Set().FirstOrDefaultAsync(x => x.Slug == slug).Then(SetBackingImage); } diff --git a/back/src/Kyoo.Core/Controllers/ThumbnailsManager.cs b/back/src/Kyoo.Core/Controllers/ThumbnailsManager.cs index f2ecf5a2..a46a0e67 100644 --- a/back/src/Kyoo.Core/Controllers/ThumbnailsManager.cs +++ b/back/src/Kyoo.Core/Controllers/ThumbnailsManager.cs @@ -113,6 +113,7 @@ namespace Kyoo.Core.Controllers { string directory = item switch { + LibraryItem litem => Path.Combine("./metadata", litem.Kind.ToString().ToLowerInvariant(), litem.Slug), IResource res => Path.Combine("./metadata", item.GetType().Name.ToLowerInvariant(), res.Slug), _ => Path.Combine("./metadata", typeof(T).Name.ToLowerInvariant()) }; diff --git a/back/src/Kyoo.Core/Views/Resources/LibraryItemApi.cs b/back/src/Kyoo.Core/Views/Resources/LibraryItemApi.cs index 3c5459b5..13ff93e1 100644 --- a/back/src/Kyoo.Core/Views/Resources/LibraryItemApi.cs +++ b/back/src/Kyoo.Core/Views/Resources/LibraryItemApi.cs @@ -39,7 +39,7 @@ namespace Kyoo.Core.Api [ResourceView] [PartialPermission("LibraryItem")] [ApiDefinition("Items", Group = ResourcesGroup)] - public class LibraryItemApi : BaseApi + public class LibraryItemApi : CrudThumbsApi { /// /// The library item repository used to modify or retrieve information in the data store. @@ -52,7 +52,8 @@ namespace Kyoo.Core.Api /// /// The library item repository used to modify or retrieve information in the data store. /// - public LibraryItemApi(ILibraryItemRepository libraryItems) + public LibraryItemApi(ILibraryItemRepository libraryItems, IThumbnailsManager thumbs) + : base(libraryItems, thumbs) { _libraryItems = libraryItems; }