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.Filtering.v2.Requests; 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, 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 DoesSeriesNameExistInLibraryAsync(string name, int libraryId, MangaFormat format, CancellationToken ct = default); /// /// Does not add user information like progress, ratings, etc. /// /// /// /// /// /// Includes Files in the Search /// /// Task SearchSeriesAsync(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 GetFilesizeAsync(int seriesId, CancellationToken ct = default); Task> GetFilesizesAsync(IList seriesIds, CancellationToken ct = default); Task GetSeriesCoverImageAsync(int seriesId, CancellationToken ct = default); Task> GetOnDeckAsync(int userId, int libraryId, UserParams userParams, CancellationToken ct = default); Task> GetRecentlyAddedAsync(int userId, UserParams userParams, SeriesFilterV2Dto seriesFilter, CancellationToken ct = default); Task GetSeriesMetadataAsync(int seriesId, CancellationToken ct = default); Task> GetSeriesDtoForCollectionAsync(int collectionId, int userId, UserParams userParams, CancellationToken ct = default); Task> GetFilesForSeriesAsync(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 GetChunkInfoAsync(int libraryId = 0, CancellationToken ct = default); Task> GetRecentlyUpdatedSeriesAsync(int userId, UserParams? userParams, CancellationToken ct = default); Task GetRelatedSeriesAsync(int userId, int seriesId, CancellationToken ct = default); Task> GetSeriesForRelationKindAsync(int userId, int seriesId, RelationKind kind, CancellationToken ct = default); Task GetSeriesForMangaFileAsync(int mangaFileId, int userId, CancellationToken ct = default); Task GetSeriesForChapterAsync(int chapterId, int userId, CancellationToken ct = default); Task> GetWantToReadDtosForUserAsync(int userId, UserParams userParams, SeriesFilterV2Dto seriesFilter, CancellationToken ct = default); Task> GetWantToReadForUserAsync(int userId, CancellationToken ct = default); Task IsSeriesInWantToRead(int userId, int seriesId, CancellationToken ct = default); Task GetSeriesByFolderPathAsync(string folder, SeriesIncludes includes = SeriesIncludes.None, CancellationToken ct = default); Task GetSeriesThatContainsLowestFolderPathAsync(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 GetSeriesByAnyNameAsync(IList names, IList formats, int userId, int? aniListId = null, SeriesIncludes includes = SeriesIncludes.None, CancellationToken ct = default); Task GetSeriesByAnyNameAsync(string seriesName, string localizedName, IList formats, int userId, int? aniListId = null, SeriesIncludes includes = SeriesIncludes.None, CancellationToken ct = default); public Task> GetAllSeriesByAnyNameAsync(string seriesName, string localizedName, int libraryId, MangaFormat format, CancellationToken ct = default); Task> RemoveSeriesNotInListAsync(IList seenSeries, int libraryId, CancellationToken ct = default); Task>> GetFolderPathMapAsync(int libraryId, CancellationToken ct = default); Task GetMaxAgeRatingFromSeriesAsyncAsync(IEnumerable seriesIds, CancellationToken ct = default); Task> GetSeriesMetadataForIdsAsync(IEnumerable seriesIds, CancellationToken ct = default); Task> GetAllWithCoversInDifferentEncodingAsync(EncodeFormat encodeFormat, bool customOnly = true, CancellationToken ct = default); Task GetSeriesDtoByNamesAndMetadataIdsAsync(IEnumerable names, LibraryType libraryType, string aniListUrl, string malUrl, CancellationToken ct = default); Task GetAverageUserRatingAsync(int seriesId, int userId, CancellationToken ct = default); Task RemoveFromOnDeckAsync(int seriesId, int userId, CancellationToken ct = default); Task ClearOnDeckRemovalAsync(int seriesId, int userId, CancellationToken ct = default); Task> GetSeriesDtoForLibraryIdAsync(int userId, UserParams userParams, SeriesFilterV2Dto seriesFilterDto, QueryContext queryContext = QueryContext.None, CancellationToken ct = default); Task GetPlusSeriesDtoAsync(int seriesId, CancellationToken ct = default); Task MatchSeriesAsync(ExternalSeriesDetailDto externalSeries, CancellationToken ct = default); }