using Microsoft.EntityFrameworkCore; using WatchIt.Database; using WatchIt.Database.Model.People; using WatchIt.Database.Model.Roles; using WatchIt.DTO.Models.Controllers.People.Person; using WatchIt.DTO.Models.Controllers.People.Person.Query; using WatchIt.DTO.Query; namespace WatchIt.WebAPI.Repositories.People; public class PeopleRepository : Repository, IPeopleRepository { #region CONSTRUCTORS public PeopleRepository(DatabaseContext database) : base(database) {} #endregion #region PUBLIC METHODS #region Main public async Task ExistsAsync(long id) => await DefaultSet.AnyAsync(x => x.Id == id); public async Task GetAsync(long id, Func, IQueryable>? additionalIncludes = null) => await DefaultSet.Include(additionalIncludes) .FirstOrDefaultAsync(x => x.Id == id); public async Task> GetAllAsync(PersonFilterQuery filterQuery, OrderQuery orderQuery, PagingQuery pagingQuery, Func, IQueryable>? additionalIncludes = null) => await DefaultSet.ApplyFilter(filterQuery) .ApplyOrder(orderQuery, PersonOrderKeys.Base) .ApplyPaging(pagingQuery) .Include(additionalIncludes) .ToListAsync(); public async Task UpdateAsync(long id, Action updateFunc, Func, IQueryable>? additionalIncludes = null) { Person? person = await GetAsync(id, additionalIncludes); if (person is null) { return false; } await UpdateAsync(person, updateFunc); return true; } public async Task DeleteAsync(long id) => await DeleteAsync(new Person { Id = id }); #endregion #region View count public async Task UpdateOrAddPersonViewCountAsync(long personId, DateOnly date, Func addFunc, Action updateFunc) => await UpdateOrAddAsync(await Database.PersonViewCounts .FirstOrDefaultAsync(x => x.PersonId == personId && x.Date == date), addFunc, updateFunc); #endregion #region Picture public async Task GetPersonPictureAsync(long id, Func, IQueryable>? additionalIncludes = null) => await Database.PersonPictures .Include(additionalIncludes) .FirstOrDefaultAsync(x => x.PersonId == id); public async Task UpdateOrAddPersonPictureAsync(long id, Func addFunc, Action updateFunc) => await UpdateOrAddAsync(await GetPersonPictureAsync(id), addFunc, updateFunc); public async Task DeletePersonPictureAsync(long id) => await DeleteAsync(new PersonPicture { PersonId = id }); #endregion #region Rating public async Task> GetAllRatedByAccountAsync(long accountId, PersonFilterQuery filterQuery, PersonUserRatedFilterQuery userRatedFilterQuery, OrderQuery orderQuery, PagingQuery pagingQuery, Func, IQueryable>? additionalIncludes = null) => await DefaultSet.Where(x => x.Roles .SelectMany(y => y.Ratings) .Any(y => y.AccountId == accountId)) .ApplyFilter(filterQuery) .ApplyFilter(userRatedFilterQuery) .ApplyOrder(orderQuery, PersonOrderKeys.Base, PersonOrderKeys.UserRated(accountId)) .ApplyPaging(pagingQuery) .Include(additionalIncludes) .ToListAsync(); #endregion #endregion }