using Microsoft.EntityFrameworkCore; using WatchIt.Database; using WatchIt.Database.Model.Roles; using WatchIt.DTO.Models.Controllers.Roles.Role; using WatchIt.DTO.Models.Controllers.Roles.Role.Query; using WatchIt.DTO.Models.Controllers.Roles.RoleActorType; using WatchIt.DTO.Models.Controllers.Roles.RoleCreatorType; using WatchIt.DTO.Query; namespace WatchIt.WebAPI.Repositories.Roles; public class RolesRepository : Repository, IRolesRepository { #region CONSTRUCTORS public RolesRepository(DatabaseContext database) : base(database) {} #endregion #region PUBLIC METHODS #region Main public async Task ExistsAsync(Guid id) => await DefaultSet.AnyAsync(x => x.Id == id); public async Task GetAsync(Guid id, Func, IQueryable>? additionalIncludes = null) => await DefaultSet.Include(additionalIncludes) .FirstOrDefaultAsync(x => x.Id == id); public async Task GetAsync(Guid id, Func, IQueryable>? additionalIncludes = null) where T : Role => await DefaultSet.OfType() .Include(additionalIncludes) .FirstOrDefaultAsync(x => x.Id == id); public async Task> GetAllActorsAsync(RoleActorFilterQuery filterQuery, OrderQuery orderQuery, PagingQuery pagingQuery, Func, IQueryable>? additionalIncludes = null) => await DefaultSet.OfType() .ApplyFilter(filterQuery) .ApplyOrder(orderQuery, RoleOrderKeys.Base(), RoleOrderKeys.RoleActor) .ApplyPaging(pagingQuery) .Include(additionalIncludes) .ToListAsync(); public async Task> GetAllCreatorsAsync(RoleCreatorFilterQuery filterQuery, OrderQuery orderQuery, PagingQuery pagingQuery, Func, IQueryable>? additionalIncludes = null) => await DefaultSet.OfType() .ApplyFilter(filterQuery) .ApplyOrder(orderQuery, RoleOrderKeys.Base(), RoleOrderKeys.RoleCreator) .ApplyPaging(pagingQuery) .Include(additionalIncludes) .ToListAsync(); public async Task UpdateAsync(Guid id, Action updateFunc) where T : Role { T? entity = await GetAsync(id); if (entity is null) { return false; } updateFunc(entity); DefaultSet.Update(entity); await Database.SaveChangesAsync(); return true; } public async Task DeleteAsync(Guid id) => await DeleteAsync(x => x.Id == id); #endregion #region Rating public async Task> GetRoleRatingsAsync(Guid roleId, Func, IQueryable>? additionalIncludes = null) => await Database.RoleRatings .Where(x => x.RoleId == roleId) .Include(additionalIncludes) .ToListAsync(); public async Task GetRoleRatingByUserAsync(Guid roleId, long accountId, Func, IQueryable>? additionalIncludes = null) => await Database.RoleRatings .Include(additionalIncludes) .FirstOrDefaultAsync(x => x.RoleId == roleId && x.AccountId == accountId); public async Task> GetPersonRoleRatingsAsync(long personId, Func, IQueryable>? additionalIncludes = null) => await Database.RoleRatings .Where(x => x.Role.PersonId == personId) .Include(additionalIncludes) .ToListAsync(); public async Task> GetPersonRoleRatingsByAccountIdAsync(long personId, long accountId, Func, IQueryable>? additionalIncludes = null) => await Database.RoleRatings .Where(x => x.Role.PersonId == personId && x.AccountId == accountId) .Include(additionalIncludes) .ToListAsync(); public async Task UpdateOrAddRoleRatingAsync(Guid roleId, long accountId, Func addFunc, Action updateFunc) => await UpdateOrAddAsync(await GetRoleRatingByUserAsync(roleId, accountId), addFunc, updateFunc); public async Task DeleteRoleUserRatingAsync(Guid roleId, long accountId) => await DeleteAsync(x => x.RoleId == roleId && x.AccountId == accountId); #endregion #region ActorTypes public async Task ExistsActorTypeAsync(short id) => await Database.RoleActorTypes .AnyAsync(x => x.Id == id); public async Task GetActorTypeAsync(short id, Func, IQueryable>? additionalIncludes = null) => await Database.RoleActorTypes .Include(additionalIncludes) .FirstOrDefaultAsync(x => x.Id == id); public async Task> GetAllActorTypesAsync(RoleActorTypeFilterQuery filterQuery, OrderQuery orderQuery, PagingQuery pagingQuery, Func, IQueryable>? additionalIncludes = null) => await Database.RoleActorTypes .ApplyFilter(filterQuery) .ApplyOrder(orderQuery, RoleActorTypeOrderKeys.Base) .ApplyPaging(pagingQuery) .Include(additionalIncludes) .ToListAsync(); public async Task AddActorTypeAsync(RoleActorType actorType) => await AddAsync(actorType); public async Task DeleteActorTypeAsync(short id) => await DeleteAsync(new RoleActorType { Id = id }); #endregion #region CreatorTypes public async Task ExistsCreatorTypeAsync(short id) => await Database.RoleCreatorTypes .AnyAsync(x => x.Id == id); public async Task GetCreatorTypeAsync(short id, Func, IQueryable>? additionalIncludes = null) => await Database.RoleCreatorTypes .Include(additionalIncludes) .FirstOrDefaultAsync(x => x.Id == id); public async Task> GetAllCreatorTypesAsync(RoleCreatorTypeFilterQuery filterQuery, OrderQuery orderQuery, PagingQuery pagingQuery, Func, IQueryable>? additionalIncludes = null) => await Database.RoleCreatorTypes .ApplyFilter(filterQuery) .ApplyOrder(orderQuery, RoleCreatorTypeOrderKeys.Base) .ApplyPaging(pagingQuery) .Include(additionalIncludes) .ToListAsync(); public async Task AddCreatorTypeAsync(RoleCreatorType creatorType) => await AddAsync(creatorType); public async Task DeleteCreatorTypeAsync(short id) => await DeleteAsync(new RoleCreatorType { Id = id }); #endregion #endregion }