Files

94 lines
3.8 KiB
C#
Raw Permalink Normal View History

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<Person>, IPeopleRepository
{
#region CONSTRUCTORS
public PeopleRepository(DatabaseContext database) : base(database) {}
#endregion
#region PUBLIC METHODS
#region Main
public async Task<bool> ExistsAsync(long id) =>
await DefaultSet.AnyAsync(x => x.Id == id);
public async Task<Person?> GetAsync(long id, Func<IQueryable<Person>, IQueryable<Person>>? additionalIncludes = null) =>
await DefaultSet.Include(additionalIncludes)
.FirstOrDefaultAsync(x => x.Id == id);
public async Task<IEnumerable<Person>> GetAllAsync(PersonFilterQuery filterQuery, OrderQuery orderQuery, PagingQuery pagingQuery, Func<IQueryable<Person>, IQueryable<Person>>? additionalIncludes = null) =>
await DefaultSet.ApplyFilter(filterQuery)
.ApplyOrder(orderQuery, PersonOrderKeys.Base)
.ApplyPaging(pagingQuery)
.Include(additionalIncludes)
.ToListAsync();
public async Task<bool> UpdateAsync(long id, Action<Person> updateFunc, Func<IQueryable<Person>, IQueryable<Person>>? 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<Person>(new Person { Id = id });
#endregion
#region View count
public async Task<PersonViewCount> UpdateOrAddPersonViewCountAsync(long personId, DateOnly date, Func<PersonViewCount> addFunc, Action<PersonViewCount> updateFunc) =>
await UpdateOrAddAsync(await Database.PersonViewCounts
.FirstOrDefaultAsync(x => x.PersonId == personId && x.Date == date), addFunc, updateFunc);
#endregion
#region Picture
public async Task<PersonPicture?> GetPersonPictureAsync(long id, Func<IQueryable<PersonPicture>, IQueryable<PersonPicture>>? additionalIncludes = null) =>
await Database.PersonPictures
.Include(additionalIncludes)
.FirstOrDefaultAsync(x => x.PersonId == id);
public async Task<PersonPicture> UpdateOrAddPersonPictureAsync(long id, Func<PersonPicture> addFunc, Action<PersonPicture> 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<IEnumerable<Person>> GetAllRatedByAccountAsync(long accountId, PersonFilterQuery filterQuery, PersonUserRatedFilterQuery userRatedFilterQuery, OrderQuery orderQuery, PagingQuery pagingQuery, Func<IQueryable<Person>, IQueryable<Person>>? 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
}