using System; using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; using Kavita.Common.Helpers; using Kavita.Models.DTOs; using Kavita.Models.DTOs.Dashboard; using Kavita.Models.DTOs.Filtering; using Kavita.Models.DTOs.Filtering.v2; using Kavita.Models.DTOs.KavitaPlus.Metadata; using Kavita.Models.DTOs.Scrobbling; using Kavita.Models.DTOs.Search; using Kavita.Models.DTOs.SeriesDetail; using Kavita.Models.Entities; using Kavita.Models.Entities.Enums; using Kavita.Models.Entities.Metadata; using Kavita.Models.Entities.User; using Kavita.Models.Misc; using Kavita.Models.Parser; namespace Kavita.API.Repositories; [Flags] public enum SeriesIncludes { None = 1 << 0, Volumes = 1 << 1, /// /// This will include all necessary includes /// Metadata = 1 << 2, Related = 1 << 3, Library = 1 << 4, Chapters = 1 << 5, ExternalReviews = 1 << 6, ExternalRatings = 1 << 7, ExternalRecommendations = 1 << 8, ExternalMetadata = 1 << 9, ExternalData = ExternalMetadata | ExternalReviews | ExternalRatings | ExternalRecommendations, } /// /// For complex queries, Library has certain restrictions where the library should not be included in results. /// This enum dictates which field to use for the lookup. /// public enum QueryContext { None = 1, Search = 2, [Obsolete("Use Dashboard")] Recommended = 3, Dashboard = 4, } public interface ISeriesRepository { void Add(Series series); void Attach(SeriesRelation relation); void Update(Series series); void Update(SeriesMetadata seriesMetadata); void Remove(Series series); void Remove(IEnumerable series); Task DoesSeriesNameExistInLibrary(string name, int libraryId, MangaFormat format, CancellationToken ct = default); /// /// Adds user information like progress, ratings, etc /// /// /// /// Pagination info /// Filtering/Sorting to apply /// /// Task> GetSeriesDtoForLibraryIdAsync(int libraryId, int userId, UserParams userParams, FilterDto filter, CancellationToken ct = default); /// /// Does not add user information like progress, ratings, etc. /// /// /// /// /// /// Includes Files in the Search /// /// Task SearchSeries(int userId, bool isAdmin, IList libraryIds, string searchQuery, bool includeChapterAndFiles = true, CancellationToken ct = default); Task> GetSeriesForLibraryIdAsync(int libraryId, SeriesIncludes includes = SeriesIncludes.None, CancellationToken ct = default); Task GetSeriesDtoByIdAsync(int seriesId, int userId, CancellationToken ct = default); Task GetSeriesByIdAsync(int seriesId, SeriesIncludes includes = SeriesIncludes.Volumes | SeriesIncludes.Metadata, CancellationToken ct = default); Task> GetSeriesDtoByIdsAsync(IEnumerable seriesIds, AppUser user, CancellationToken ct = default); Task> GetSeriesByIdsAsync(IList seriesIds, bool fullSeries = true, CancellationToken ct = default); Task GetChapterIdsForSeriesAsync(IList seriesIds, CancellationToken ct = default); Task>> GetChapterIdWithSeriesIdForSeriesAsync(int[] seriesIds, CancellationToken ct = default); Task GetFilesizeForSeriesAsync(int seriesId, CancellationToken ct = default); Task> GetFilesizeForMultipleSeriesAsync(IList seriesIds, CancellationToken ct = default); Task GetSeriesCoverImageAsync(int seriesId, CancellationToken ct = default); Task> GetOnDeck(int userId, int libraryId, UserParams userParams, FilterDto? filter, CancellationToken ct = default); Task> GetRecentlyAdded(int libraryId, int userId, UserParams userParams, FilterDto filter, CancellationToken ct = default); Task> GetRecentlyAddedV2(int userId, UserParams userParams, FilterV2Dto filter, CancellationToken ct = default); Task GetSeriesMetadata(int seriesId, CancellationToken ct = default); Task> GetSeriesDtoForCollectionAsync(int collectionId, int userId, UserParams userParams, CancellationToken ct = default); Task> GetFilesForSeries(int seriesId, CancellationToken ct = default); Task> GetSeriesDtoForIdsAsync(IEnumerable seriesIds, int userId, CancellationToken ct = default); Task> GetAllCoverImagesAsync(CancellationToken ct = default); Task> GetLockedCoverImagesAsync(CancellationToken ct = default); Task> GetFullSeriesForLibraryIdAsync(int libraryId, UserParams userParams, CancellationToken ct = default); Task GetFullSeriesForSeriesIdAsync(int seriesId, CancellationToken ct = default); Task GetChunkInfo(int libraryId = 0, CancellationToken ct = default); Task> GetRecentlyUpdatedSeries(int userId, UserParams? userParams, CancellationToken ct = default); Task GetRelatedSeries(int userId, int seriesId, CancellationToken ct = default); Task> GetSeriesForRelationKind(int userId, int seriesId, RelationKind kind, CancellationToken ct = default); Task> GetQuickReads(int userId, int libraryId, UserParams userParams, CancellationToken ct = default); Task> GetQuickCatchupReads(int userId, int libraryId, UserParams userParams, CancellationToken ct = default); Task> GetHighlyRated(int userId, int libraryId, UserParams userParams, CancellationToken ct = default); Task> GetMoreIn(int userId, int libraryId, int genreId, UserParams userParams, CancellationToken ct = default); Task> GetRediscover(int userId, int libraryId, UserParams userParams, CancellationToken ct = default); Task GetSeriesForMangaFile(int mangaFileId, int userId, CancellationToken ct = default); Task GetSeriesForChapter(int chapterId, int userId, CancellationToken ct = default); Task> GetWantToReadForUserAsync(int userId, UserParams userParams, FilterDto filter, CancellationToken ct = default); Task> GetWantToReadForUserV2Async(int userId, UserParams userParams, FilterV2Dto filter, CancellationToken ct = default); Task> GetWantToReadForUserAsync(int userId, CancellationToken ct = default); Task IsSeriesInWantToRead(int userId, int seriesId, CancellationToken ct = default); Task GetSeriesByFolderPath(string folder, SeriesIncludes includes = SeriesIncludes.None, CancellationToken ct = default); Task GetSeriesThatContainsLowestFolderPath(string path, SeriesIncludes includes = SeriesIncludes.None, CancellationToken ct = default); Task> GetAllSeriesByNameAsync(IList normalizedNames, int userId, SeriesIncludes includes = SeriesIncludes.None, CancellationToken ct = default); Task GetFullSeriesByAnyName(string seriesName, string localizedName, int libraryId, MangaFormat format, bool withFullIncludes = true, CancellationToken ct = default); Task GetSeriesByAnyName(IList names, IList formats, int userId, int? aniListId = null, SeriesIncludes includes = SeriesIncludes.None, CancellationToken ct = default); Task GetSeriesByAnyName(string seriesName, string localizedName, IList formats, int userId, int? aniListId = null, SeriesIncludes includes = SeriesIncludes.None, CancellationToken ct = default); public Task> GetAllSeriesByAnyName(string seriesName, string localizedName, int libraryId, MangaFormat format, CancellationToken ct = default); Task> RemoveSeriesNotInList(IList seenSeries, int libraryId, CancellationToken ct = default); Task>> GetFolderPathMap(int libraryId, CancellationToken ct = default); Task GetMaxAgeRatingFromSeriesAsync(IEnumerable seriesIds, CancellationToken ct = default); Task> GetSeriesMetadataForIds(IEnumerable seriesIds, CancellationToken ct = default); Task> GetAllWithCoversInDifferentEncoding(EncodeFormat encodeFormat, bool customOnly = true, CancellationToken ct = default); Task GetSeriesDtoByNamesAndMetadataIds(IEnumerable names, LibraryType libraryType, string aniListUrl, string malUrl, CancellationToken ct = default); Task GetAverageUserRating(int seriesId, int userId, CancellationToken ct = default); Task RemoveFromOnDeck(int seriesId, int userId, CancellationToken ct = default); Task ClearOnDeckRemoval(int seriesId, int userId, CancellationToken ct = default); Task> GetSeriesDtoForLibraryIdV2Async(int userId, UserParams userParams, FilterV2Dto filterDto, QueryContext queryContext = QueryContext.None, CancellationToken ct = default); Task GetPlusSeriesDto(int seriesId, CancellationToken ct = default); Task MatchSeries(ExternalSeriesDetailDto externalSeries, CancellationToken ct = default); }