From 077fa89717957f871b172ca4b2dc4a178efd3bc5 Mon Sep 17 00:00:00 2001 From: Shadowghost Date: Sat, 7 Mar 2026 20:12:42 +0100 Subject: Split BaseItemRepository and IItemRepository --- .../Persistence/IItemQueryHelpers.cs | 94 ++++++++++++++++++++++ 1 file changed, 94 insertions(+) create mode 100644 MediaBrowser.Controller/Persistence/IItemQueryHelpers.cs (limited to 'MediaBrowser.Controller/Persistence/IItemQueryHelpers.cs') diff --git a/MediaBrowser.Controller/Persistence/IItemQueryHelpers.cs b/MediaBrowser.Controller/Persistence/IItemQueryHelpers.cs new file mode 100644 index 0000000000..45fa92c90b --- /dev/null +++ b/MediaBrowser.Controller/Persistence/IItemQueryHelpers.cs @@ -0,0 +1,94 @@ +using System; +using System.Linq; +using Jellyfin.Database.Implementations; +using Jellyfin.Database.Implementations.Entities; +using MediaBrowser.Controller.Entities; + +namespace MediaBrowser.Controller.Persistence; + +/// +/// Provides shared query-building methods used by extracted item services. +/// Implemented by BaseItemRepository. +/// +public interface IItemQueryHelpers +{ + /// + /// Translates an into EF Core filter expressions. + /// + /// The base queryable to filter. + /// The database context. + /// The query filter. + /// The filtered queryable. + IQueryable TranslateQuery( + IQueryable baseQuery, + JellyfinDbContext context, + InternalItemsQuery filter); + + /// + /// Prepares a base query for items from the context. + /// + /// The database context. + /// The query filter. + /// The prepared queryable. + IQueryable PrepareItemQuery(JellyfinDbContext context, InternalItemsQuery filter); + + /// + /// Applies user access filtering (library access, parental controls, tags) to a query. + /// + /// The database context. + /// The base queryable to filter. + /// The query filter containing access settings. + /// The access-filtered queryable. + IQueryable ApplyAccessFiltering( + JellyfinDbContext context, + IQueryable baseQuery, + InternalItemsQuery filter); + + /// + /// Applies navigation property includes to a query based on filter options. + /// + /// The queryable to apply navigations to. + /// The query filter. + /// The queryable with navigation includes. + IQueryable ApplyNavigations( + IQueryable dbQuery, + InternalItemsQuery filter); + + /// + /// Applies ordering to a query based on filter options. + /// + /// The queryable to order. + /// The query filter. + /// The database context. + /// The ordered queryable. + IQueryable ApplyOrder( + IQueryable query, + InternalItemsQuery filter, + JellyfinDbContext context); + + /// + /// Builds a query for descendants of an ancestor with user access filtering applied. + /// + /// The database context. + /// The query filter. + /// The ancestor item ID. + /// The filtered descendant queryable. + IQueryable BuildAccessFilteredDescendantsQuery( + JellyfinDbContext context, + InternalItemsQuery filter, + Guid ancestorId); + + /// + /// Deserializes a into a . + /// + /// The database entity. + /// Whether to skip JSON deserialization. + /// The deserialized item, or null. + BaseItem? DeserializeBaseItem(BaseItemEntity entity, bool skipDeserialization = false); + + /// + /// Prepares a filter query by adjusting limits and virtual item settings. + /// + /// The query to prepare. + void PrepareFilterQuery(InternalItemsQuery query); +} -- cgit v1.2.3