using System; using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; using Kavita.Models.DTOs; using Kavita.Models.DTOs.Account; using Kavita.Models.DTOs.Dashboard; using Kavita.Models.DTOs.Filtering.v2; using Kavita.Models.DTOs.KavitaPlus.Account; using Kavita.Models.DTOs.Reader; using Kavita.Models.DTOs.Scrobbling; using Kavita.Models.DTOs.SeriesDetail; using Kavita.Models.DTOs.SideNav; using Kavita.Models.Entities.Enums.UserPreferences; using Kavita.Models.Entities.User; namespace Kavita.API.Repositories; [Flags] public enum AppUserIncludes { None = 1, Progress = 1 << 1, Bookmarks = 1 << 2, ReadingLists = 1 << 3, Ratings = 1 << 4, UserPreferences = 1 << 5, WantToRead = 1 << 6, ReadingListsWithItems = 1 << 7, Devices = 1 << 8, ScrobbleHolds = 1 << 9, SmartFilters = 1 << 10, DashboardStreams = 1 << 11, SideNavStreams = 1 << 12, ExternalSources = 1 << 13, Collections = 1 << 14, ChapterRatings = 1 << 15, AuthKeys = 1 << 16 } public interface IUserRepository { #region Synchronous CRUD void Add(AppUserAuthKey key); void Add(AppUserBookmark bookmark); void Add(AppUser bookmark); void Update(AppUser user); void Update(AppUserPreferences preferences); void Update(AppUserBookmark bookmark); void Update(AppUserDashboardStream stream); void Update(AppUserSideNavStream stream); void Delete(AppUser? user); void Delete(AppUserAuthKey? key); void Delete(AppUserBookmark bookmark); void Delete(IEnumerable streams); void Delete(AppUserDashboardStream stream); void Delete(IEnumerable streams); void Delete(AppUserSideNavStream stream); #endregion #region User Retrieval Task> GetEmailConfirmedMemberDtosAsync(bool emailConfirmed = true, CancellationToken ct = default); Task> GetAdminUsersAsync(CancellationToken ct = default); Task IsUserAdminAsync(AppUser? user, CancellationToken ct = default); Task> GetRoles(int userId, CancellationToken ct = default); Task> GetRolesByAuthKey(string? apiKey, CancellationToken ct = default); Task GetUserDtoByAuthKeyAsync(string authKey, CancellationToken ct = default); Task GetUserIdByAuthKeyAsync(string authKey, CancellationToken ct = default); Task GetUserDtoById(int userId, CancellationToken ct = default); Task GetUserByUsernameAsync(string username, AppUserIncludes includeFlags = AppUserIncludes.None, CancellationToken ct = default); Task GetUserByIdAsync(int userId, AppUserIncludes includeFlags = AppUserIncludes.None, CancellationToken ct = default); Task GetUserByAuthKey(string authKey, AppUserIncludes includeFlags = AppUserIncludes.None, CancellationToken ct = default); Task GetUserIdByUsernameAsync(string username, CancellationToken ct = default); Task GetUserByEmailAsync(string email, AppUserIncludes includes = AppUserIncludes.None, CancellationToken ct = default); Task> GetAllUsersAsync(AppUserIncludes includeFlags = AppUserIncludes.None, bool track = true, CancellationToken ct = default); Task GetUserByConfirmationToken(string token, CancellationToken ct = default); Task GetDefaultAdminUser(AppUserIncludes includes = AppUserIncludes.None, CancellationToken ct = default); Task> GetUserTokenInfo(CancellationToken ct = default); Task GetUserByDeviceEmail(string deviceEmail, CancellationToken ct = default); Task GetByOidcId(string? oidcId, AppUserIncludes includes = AppUserIncludes.None, CancellationToken ct = default); Task UpdateUserAsActive(int userId, CancellationToken ct = default); #endregion #region Ratings & Reviews Task GetUserRatingAsync(int seriesId, int userId, CancellationToken ct = default); Task GetUserChapterRatingAsync(int userId, int chapterId, CancellationToken ct = default); Task> GetUserRatingDtosForSeriesAsync(int seriesId, int userId, CancellationToken ct = default); Task> GetUserRatingDtosForChapterAsync(int chapterId, int userId, CancellationToken ct = default); Task> GetSeriesWithRatings(int userId, CancellationToken ct = default); Task> GetSeriesWithReviews(int userId, CancellationToken ct = default); Task> GetAllReviewsForUser(int userId, int requestingUserId, string? query = null, float? ratingFilter = null, CancellationToken ct = default); #endregion #region Bookmarks Task> GetBookmarkDtosForSeries(int userId, int seriesId, CancellationToken ct = default); Task> GetBookmarkDtosForVolume(int userId, int volumeId, CancellationToken ct = default); Task> GetBookmarkDtosForChapter(int userId, int chapterId, CancellationToken ct = default); Task> GetAllBookmarkDtos(int userId, FilterV2Dto filter, CancellationToken ct = default); Task> GetAllBookmarksAsync(CancellationToken ct = default); Task GetBookmarkForPage(int page, int chapterId, int imageOffset, int userId, CancellationToken ct = default); Task GetBookmarkAsync(int bookmarkId, CancellationToken ct = default); Task> GetAllBookmarksByIds(IList bookmarkIds, CancellationToken ct = default); #endregion #region Preferences & Settings Task GetPreferencesAsync(string username, CancellationToken ct = default); Task> GetAllPreferencesByThemeAsync(int themeId, CancellationToken ct = default); Task> GetAllPreferencesByFontAsync(string fontName, CancellationToken ct = default); Task GetLocale(int userId, CancellationToken ct = default); Task GetSocialPreferencesForUser(int userId, CancellationToken ct = default); Task GetPreferencesForUser(int userId, CancellationToken ct = default); Task GetOpdsPreferences(int userId, CancellationToken ct = default); #endregion #region Permissions Task HasAccessToLibrary(int libraryId, int userId, CancellationToken ct = default); Task HasAccessToSeries(int userId, int seriesId, CancellationToken ct = default); Task HasAccessToVolume(int userId, int volumeId, CancellationToken ct = default); Task HasAccessToChapter(int userId, int chapterId, CancellationToken ct = default); Task HasAccessToPerson(int userId, int personId, CancellationToken ct = default); Task HasAccessToReadingList(int userId, int readingListId, CancellationToken ct = default); #endregion #region Scrobbling & Holds Task HasHoldOnSeries(int userId, int seriesId, CancellationToken ct = default); Task> GetHolds(int userId, CancellationToken ct = default); #endregion #region Streams (Dashboard & SideNav) Task> GetDashboardStreams(int userId, bool visibleOnly = false, CancellationToken ct = default); Task> GetAllDashboardStreams(CancellationToken ct = default); Task GetDashboardStream(int streamId, CancellationToken ct = default); Task> GetDashboardStreamWithFilter(int filterId, CancellationToken ct = default); Task> GetSideNavStreams(int userId, bool visibleOnly = false, CancellationToken ct = default); Task GetSideNavStream(int streamId, CancellationToken ct = default); Task GetSideNavStreamWithUser(int streamId, CancellationToken ct = default); Task> GetSideNavStreamWithFilter(int filterId, CancellationToken ct = default); Task> GetSideNavStreamsByLibraryId(int libraryId, CancellationToken ct = default); Task> GetSideNavStreamWithExternalSource(int externalSourceId, CancellationToken ct = default); Task> GetDashboardStreamsByIds(IList streamIds, CancellationToken ct = default); #endregion #region Annotations Task> GetAnnotations(int userId, int chapterId, CancellationToken ct = default); Task> GetAnnotationsByPage(int userId, int chapterId, int pageNum, CancellationToken ct = default); Task GetAnnotationDtoById(int userId, int annotationId, CancellationToken ct = default); Task> GetAnnotationDtosBySeries(int userId, int seriesId, CancellationToken ct = default); #endregion #region Images & Media Task GetCoverImageAsync(int userId, CancellationToken ct = default); Task GetPersonCoverImageAsync(int personId, CancellationToken ct = default); #endregion #region Auth Keys Task> GetAuthKeysForUserId(int userId, CancellationToken ct = default); Task> GetAllAuthKeysDtosWithExpiration(CancellationToken ct = default); Task GetAuthKeyById(int authKeyId, CancellationToken ct = default); Task GetAuthKeyExpiration(string authKey, int userId, CancellationToken ct = default); #endregion }