Refactoring, database structure changed

This commit is contained in:
2025-03-03 00:56:32 +01:00
Unverified
parent d3805ef3db
commit c603c41c0b
913 changed files with 21764 additions and 32775 deletions

View File

@@ -0,0 +1,130 @@
using Microsoft.EntityFrameworkCore;
using WatchIt.Database;
using WatchIt.Database.Model.Accounts;
using WatchIt.DTO.Models.Controllers.Accounts.Account;
using WatchIt.DTO.Query;
namespace WatchIt.WebAPI.Repositories.Accounts;
public class AccountsRepository : Repository<Account>, IAccountsRepository
{
#region CONSTRUCTORS
public AccountsRepository(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<Account?> GetAsync(long id, Func<IQueryable<Account>, IQueryable<Account>>? additionalIncludes = null) =>
await DefaultSet.Include(additionalIncludes)
.FirstOrDefaultAsync(x => x.Id == id);
public async Task<Account?> GetByUsernameOrEmailAsync(string usernameOrEmail, Func<IQueryable<Account>, IQueryable<Account>>? additionalIncludes = null) =>
await DefaultSet.Include(additionalIncludes)
.FirstOrDefaultAsync(x => x.Username == usernameOrEmail || x.Email == usernameOrEmail);
public async Task<IEnumerable<Account>> GetAllAsync(AccountFilterQuery filterQuery, OrderQuery orderQuery, PagingQuery pagingQuery, Func<IQueryable<Account>, IQueryable<Account>>? additionalIncludes = null) =>
await DefaultSet.ApplyFilter(filterQuery)
.ApplyOrder(orderQuery, AccountOrderKeys.Base)
.ApplyPaging(pagingQuery)
.Include(additionalIncludes)
.ToListAsync();
#endregion
#region Profile picture
public async Task<AccountProfilePicture?> GetProfilePictureAsync(long id, Func<IQueryable<AccountProfilePicture>, IQueryable<AccountProfilePicture>>? additionalIncludes = null) =>
await Database.AccountProfilePictures
.Include(additionalIncludes)
.FirstOrDefaultAsync(x => x.AccountId == id);
public async Task<AccountProfilePicture> UpdateOrAddProfilePictureAsync(long id, Func<AccountProfilePicture> addFunc, Action<AccountProfilePicture> updateFunc) =>
await UpdateOrAddAsync(await GetProfilePictureAsync(id), addFunc, updateFunc);
public async Task DeleteProfilePictureAsync(long id) =>
await DeleteAsync<AccountProfilePicture>(x => x.AccountId == id);
#endregion
#region Background picture
public async Task<AccountBackgroundPicture?> GetBackgroundPictureAsync(long id, Func<IQueryable<AccountBackgroundPicture>, IQueryable<AccountBackgroundPicture>>? additionalIncludes = null) =>
await Database.AccountBackgroundPictures
.Include(additionalIncludes)
.FirstOrDefaultAsync(x => x.AccountId == id);
public async Task<AccountBackgroundPicture> UpdateOrAddBackgroundPictureAsync(long id, Func<AccountBackgroundPicture> addFunc, Action<AccountBackgroundPicture> updateFunc) =>
await UpdateOrAddAsync(await GetBackgroundPictureAsync(id, x => x.Include(y => y.Background)
.ThenInclude(y => y.Photo)), addFunc, updateFunc);
public async Task DeleteBackgroundPictureAsync(long id) =>
await DeleteAsync<AccountBackgroundPicture>(x => x.AccountId == id);
#endregion
#region Follow
public async Task<bool> FollowExistsAsync(long followerId, long followedId) =>
await Database.AccountFollows
.AnyAsync(x => x.FollowerId == followerId && x.FollowedId == followedId);
public async Task<IEnumerable<Account>> GetFollowsAsync(long id, AccountFilterQuery filterQuery, OrderQuery orderQuery, PagingQuery pagingQuery, Func<IQueryable<Account>, IQueryable<Account>>? additionalIncludes = null) =>
await Database.Accounts
.Where(x => x.Followers
.Any(y => y.Id == id))
.ApplyFilter(filterQuery)
.ApplyOrder(orderQuery, AccountOrderKeys.Base)
.ApplyPaging(pagingQuery)
.Include(additionalIncludes)
.ToListAsync();
public async Task<IEnumerable<Account>> GetFollowersAsync(long id, AccountFilterQuery filterQuery, OrderQuery orderQuery, PagingQuery pagingQuery, Func<IQueryable<Account>, IQueryable<Account>>? additionalIncludes = null) =>
await Database.Accounts
.Where(x => x.Follows
.Any(y => y.Id == id))
.ApplyFilter(filterQuery)
.ApplyOrder(orderQuery, AccountOrderKeys.Base)
.ApplyPaging(pagingQuery)
.Include(additionalIncludes)
.ToListAsync();
public async Task AddFollowAsync(AccountFollow entity) =>
await AddAsync(entity);
public async Task DeleteFollowAsync(long followerId, long followedId) =>
await DeleteAsync<AccountFollow>(x => x.FollowerId == followerId && x.FollowedId == followedId);
#endregion
#region Refresh token
public async Task UpdateRefreshTokenAsync(AccountRefreshToken refreshToken, Action<AccountRefreshToken> updateFunc) =>
await UpdateAsync(refreshToken, updateFunc);
public async Task AddRefreshTokenAsync(AccountRefreshToken refreshToken) =>
await AddAsync(refreshToken);
public async Task DeleteRefreshTokenAsync(Guid refreshTokenId) =>
await DeleteAsync<AccountRefreshToken>(x => x.Token == refreshTokenId);
public async Task DeleteUserRefreshTokensAsync(long id)
{
IQueryable<AccountRefreshToken> tokens = Database.AccountRefreshTokens.Where(x => x.AccountId == id);
Database.AccountRefreshTokens.AttachRange(tokens);
Database.AccountRefreshTokens.RemoveRange(tokens);
await Database.SaveChangesAsync();
}
#endregion
#endregion
}

View File

@@ -0,0 +1,33 @@
using Microsoft.EntityFrameworkCore;
using WatchIt.Database.Model.Accounts;
using WatchIt.DTO.Models.Controllers.Accounts.Account;
using WatchIt.DTO.Query;
namespace WatchIt.WebAPI.Repositories.Accounts;
public interface IAccountsRepository : IRepository<Account>
{
Task<bool> ExistsAsync(long id);
Task<Account?> GetAsync(long id, Func<IQueryable<Account>, IQueryable<Account>>? additionalIncludes = null);
Task<Account?> GetByUsernameOrEmailAsync(string usernameOrEmail, Func<IQueryable<Account>, IQueryable<Account>>? additionalIncludes = null);
Task<IEnumerable<Account>> GetAllAsync(AccountFilterQuery filterQuery, OrderQuery orderQuery, PagingQuery pagingQuery, Func<IQueryable<Account>, IQueryable<Account>>? additionalIncludes = null);
Task<AccountProfilePicture?> GetProfilePictureAsync(long id, Func<IQueryable<AccountProfilePicture>, IQueryable<AccountProfilePicture>>? additionalIncludes = null);
Task<AccountProfilePicture> UpdateOrAddProfilePictureAsync(long id, Func<AccountProfilePicture> addFunc, Action<AccountProfilePicture> updateFunc);
Task DeleteProfilePictureAsync(long id);
Task<bool> FollowExistsAsync(long followerId, long followedId);
Task<IEnumerable<Account>> GetFollowsAsync(long id, AccountFilterQuery filterQuery, OrderQuery orderQuery, PagingQuery pagingQuery, Func<IQueryable<Account>, IQueryable<Account>>? additionalIncludes = null);
Task<IEnumerable<Account>> GetFollowersAsync(long id, AccountFilterQuery filterQuery, OrderQuery orderQuery, PagingQuery pagingQuery, Func<IQueryable<Account>, IQueryable<Account>>? additionalIncludes = null);
Task AddFollowAsync(AccountFollow entity);
Task DeleteFollowAsync(long followerId, long followedId);
Task<AccountBackgroundPicture?> GetBackgroundPictureAsync(long id, Func<IQueryable<AccountBackgroundPicture>, IQueryable<AccountBackgroundPicture>>? additionalIncludes = null);
Task<AccountBackgroundPicture> UpdateOrAddBackgroundPictureAsync(long id, Func<AccountBackgroundPicture> addFunc, Action<AccountBackgroundPicture> updateFunc);
Task DeleteBackgroundPictureAsync(long id);
Task UpdateRefreshTokenAsync(AccountRefreshToken refreshToken, Action<AccountRefreshToken> updateFunc);
Task AddRefreshTokenAsync(AccountRefreshToken refreshToken);
Task DeleteRefreshTokenAsync(Guid refreshTokenId);
Task DeleteUserRefreshTokensAsync(long id);
}

View File

@@ -0,0 +1,36 @@
using Microsoft.EntityFrameworkCore;
using WatchIt.Database;
using WatchIt.Database.Model.Genders;
using WatchIt.DTO.Models.Controllers.Genders.Gender;
using WatchIt.DTO.Query;
namespace WatchIt.WebAPI.Repositories.Genders;
public class GendersRepository : Repository<Gender>, IGendersRepository
{
#region CONSTRUCTORS
public GendersRepository(DatabaseContext database) : base(database) {}
#endregion
#region PUBLIC METHODS
public async Task<bool> ExistsAsync(short id) =>
await DefaultSet.AnyAsync(x => x.Id == id);
public async Task<Gender?> GetAsync(short id, Func<IQueryable<Gender>, IQueryable<Gender>>? additionalIncludes = null) =>
await DefaultSet.Include(additionalIncludes)
.FirstOrDefaultAsync(x => x.Id == id);
public async Task<IEnumerable<Gender>> GetAllAsync(GenderFilterQuery filterQuery, OrderQuery orderQuery, PagingQuery pagingQuery, Func<IQueryable<Gender>, IQueryable<Gender>>? additionalIncludes = null) =>
await DefaultSet.ApplyFilter(filterQuery)
.ApplyOrder(orderQuery, GenderOrderKeys.Base)
.ApplyPaging(pagingQuery)
.Include(additionalIncludes)
.ToListAsync();
#endregion
}

View File

@@ -0,0 +1,12 @@
using WatchIt.Database.Model.Genders;
using WatchIt.DTO.Models.Controllers.Genders.Gender;
using WatchIt.DTO.Query;
namespace WatchIt.WebAPI.Repositories.Genders;
public interface IGendersRepository : IRepository<Gender>
{
Task<bool> ExistsAsync(short id);
Task<Gender?> GetAsync(short id, Func<IQueryable<Gender>, IQueryable<Gender>>? additionalIncludes = null);
Task<IEnumerable<Gender>> GetAllAsync(GenderFilterQuery filterQuery, OrderQuery orderQuery, PagingQuery pagingQuery, Func<IQueryable<Gender>, IQueryable<Gender>>? additionalIncludes = null);
}

View File

@@ -0,0 +1,36 @@
using Microsoft.EntityFrameworkCore;
using WatchIt.Database;
using WatchIt.Database.Model.Genres;
using WatchIt.DTO.Models.Controllers.Genres.Genre;
using WatchIt.DTO.Query;
namespace WatchIt.WebAPI.Repositories.Genres;
public class GenresRepository : Repository<Genre>, IGenresRepository
{
#region CONSTRUCTORS
public GenresRepository(DatabaseContext database) : base(database) {}
#endregion
#region PUBLIC METHODS
public async Task<bool> ExistsAsync(short id) =>
await DefaultSet.AnyAsync(x => x.Id == id);
public async Task<Genre?> GetAsync(short id, Func<IQueryable<Genre>, IQueryable<Genre>>? additionalIncludes = null) =>
await DefaultSet.Include(additionalIncludes)
.FirstOrDefaultAsync(x => x.Id == id);
public async Task<IEnumerable<Genre>> GetAllAsync(GenreFilterQuery filterQuery, OrderQuery orderQuery, PagingQuery pagingQuery, Func<IQueryable<Genre>, IQueryable<Genre>>? additionalIncludes = null) =>
await DefaultSet.ApplyFilter(filterQuery)
.ApplyOrder(orderQuery, GenreOrderKeys.Base)
.ApplyPaging(pagingQuery)
.Include(additionalIncludes)
.ToListAsync();
#endregion
}

View File

@@ -0,0 +1,12 @@
using WatchIt.Database.Model.Genres;
using WatchIt.DTO.Models.Controllers.Genres.Genre;
using WatchIt.DTO.Query;
namespace WatchIt.WebAPI.Repositories.Genres;
public interface IGenresRepository : IRepository<Genre>
{
Task<bool> ExistsAsync(short id);
Task<Genre?> GetAsync(short id, Func<IQueryable<Genre>, IQueryable<Genre>>? additionalIncludes = null);
Task<IEnumerable<Genre>> GetAllAsync(GenreFilterQuery filterQuery, OrderQuery orderQuery, PagingQuery pagingQuery, Func<IQueryable<Genre>, IQueryable<Genre>>? additionalIncludes = null);
}

View File

@@ -0,0 +1,15 @@
using System.Linq.Expressions;
using Microsoft.EntityFrameworkCore;
using WatchIt.DTO.Query;
namespace WatchIt.WebAPI.Repositories;
public interface IRepository<T> where T : class
{
public Task<IEnumerable<T>> GetAllAsync(Func<IQueryable<T>, IQueryable<T>>? additionalIncludes = null);
public Task UpdateAsync(T entity, Action<T> updateFunc);
public Task AddAsync(T entity);
public Task<T> UpdateOrAddAsync(T? entity, Func<T> addFunc, Action<T> updateFunc);
public Task DeleteAsync(T entity);
public Task DeleteAsync(Expression<Func<T, bool>> predicate);
}

View File

@@ -0,0 +1,35 @@
using WatchIt.Database.Model.Genres;
using WatchIt.Database.Model.Media;
using WatchIt.DTO.Models.Controllers.Genres.Genre;
using WatchIt.DTO.Models.Controllers.Media.Medium.Query;
using WatchIt.DTO.Query;
namespace WatchIt.WebAPI.Repositories.Media;
public interface IMediaRepository : IRepository<Medium>
{
Task<bool> ExistsAsync(long id);
Task<Medium?> GetAsync(long id, Func<IQueryable<Medium>, IQueryable<Medium>>? additionalIncludes = null);
Task<T?> GetAsync<T>(long id, Func<IQueryable<T>, IQueryable<T>>? additionalIncludes = null) where T : Medium;
Task<IEnumerable<Medium>> GetAllAsync(MediumFilterQuery filterQuery, OrderQuery orderQuery, PagingQuery pagingQuery, Func<IQueryable<Medium>, IQueryable<Medium>>? additionalIncludes = null);
Task<IEnumerable<MediumMovie>> GetAllMoviesAsync(MediumMovieFilterQuery filterQuery, OrderQuery orderQuery, PagingQuery pagingQuery, Func<IQueryable<MediumMovie>, IQueryable<MediumMovie>>? additionalIncludes = null);
Task<IEnumerable<MediumSeries>> GetAllSeriesAsync(MediumSeriesFilterQuery filterQuery, OrderQuery orderQuery, PagingQuery pagingQuery, Func<IQueryable<MediumSeries>, IQueryable<MediumSeries>>? additionalIncludes = null);
Task<bool> UpdateAsync<T>(long id, Action<T> updateFunc) where T : Medium;
Task<IEnumerable<Genre>> GetMediumGenresAsync(long id, GenreFilterQuery filterQuery, OrderQuery orderQuery, PagingQuery pagingQuery, Func<IQueryable<Genre>, IQueryable<Genre>>? additionalIncludes = null);
Task AddMediumGenreAsync(long mediumId, short genreId);
Task DeleteMediumGenreAsync(long mediumId, short genreId);
Task<IEnumerable<Medium>> GetAllRatedByAccountAsync(long accountId, MediumFilterQuery filterQuery, MediumUserRatedFilterQuery<Medium> userRatedFilterQuery, OrderQuery orderQuery, PagingQuery pagingQuery, Func<IQueryable<Medium>, IQueryable<Medium>>? additionalIncludes = null);
Task<IEnumerable<MediumMovie>> GetAllMoviesRatedByAccountAsync(long accountId, MediumMovieFilterQuery filterQuery, MediumUserRatedFilterQuery<MediumMovie> userRatedFilterQuery, OrderQuery orderQuery, PagingQuery pagingQuery, Func<IQueryable<MediumMovie>, IQueryable<MediumMovie>>? additionalIncludes = null);
Task<IEnumerable<MediumSeries>> GetAllSeriesRatedByAccountAsync(long accountId, MediumSeriesFilterQuery filterQuery, MediumUserRatedFilterQuery<MediumSeries> userRatedFilterQuery, OrderQuery orderQuery, PagingQuery pagingQuery, Func<IQueryable<MediumSeries>, IQueryable<MediumSeries>>? additionalIncludes = null);
Task<MediumRating?> GetMediumUserRatingAsync(long mediumId, long accountId, Func<IQueryable<MediumRating>, IQueryable<MediumRating>>? additionalIncludes = null);
Task<MediumRating> UpdateOrAddMediumRatingAsync(long mediumId, long accountId, Func<MediumRating> addFunc, Action<MediumRating> updateFunc);
Task DeleteMediumUserRatingAsync(long mediumId, long accountId);
Task<MediumViewCount> UpdateOrAddMediumViewCountAsync(long mediumId, DateOnly date, Func<MediumViewCount> addFunc, Action<MediumViewCount> updateFunc);
Task<MediumPicture?> GetMediumPictureAsync(long id, Func<IQueryable<MediumPicture>, IQueryable<MediumPicture>>? additionalIncludes = null);
Task<MediumPicture> UpdateOrAddMediumPictureAsync(long id, Func<MediumPicture> addFunc, Action<MediumPicture> updateFunc);
Task DeleteMediumPictureAsync(long id);
}

View File

@@ -0,0 +1,175 @@
using Microsoft.EntityFrameworkCore;
using WatchIt.Database;
using WatchIt.Database.Model.Genres;
using WatchIt.Database.Model.Media;
using WatchIt.Database.Model.Photos;
using WatchIt.DTO.Models.Controllers.Genres.Genre;
using WatchIt.DTO.Models.Controllers.Media.Medium;
using WatchIt.DTO.Models.Controllers.Media.Medium.Query;
using WatchIt.DTO.Query;
namespace WatchIt.WebAPI.Repositories.Media;
public class MediaRepository : Repository<Medium>, IMediaRepository
{
#region CONSTRUCTORS
public MediaRepository(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<Medium?> GetAsync(long id, Func<IQueryable<Medium>, IQueryable<Medium>>? additionalIncludes = null) =>
await DefaultSet.Include(additionalIncludes)
.FirstOrDefaultAsync(x => x.Id == id);
public async Task<T?> GetAsync<T>(long id, Func<IQueryable<T>, IQueryable<T>>? additionalIncludes = null) where T : Medium =>
await DefaultSet.OfType<T>()
.Include(additionalIncludes)
.FirstOrDefaultAsync(x => x.Id == id);
public async Task<IEnumerable<Medium>> GetAllAsync(MediumFilterQuery filterQuery, OrderQuery orderQuery, PagingQuery pagingQuery, Func<IQueryable<Medium>, IQueryable<Medium>>? additionalIncludes = null) =>
await DefaultSet.ApplyFilter(filterQuery)
.OrderByDescending(x => x.Id)
.ApplyOrder(orderQuery, MediumOrderKeys.Base<Medium>(), MediumOrderKeys.Medium)
.ApplyPaging(pagingQuery)
.Include(additionalIncludes)
.ToListAsync();
public async Task<IEnumerable<MediumMovie>> GetAllMoviesAsync(MediumMovieFilterQuery filterQuery, OrderQuery orderQuery, PagingQuery pagingQuery, Func<IQueryable<MediumMovie>, IQueryable<MediumMovie>>? additionalIncludes = null) =>
await DefaultSet.OfType<MediumMovie>()
.ApplyFilter(filterQuery)
.ApplyOrder(orderQuery, MediumOrderKeys.Base<MediumMovie>(), MediumOrderKeys.MediumMovie)
.ApplyPaging(pagingQuery)
.Include(additionalIncludes)
.ToListAsync();
public async Task<IEnumerable<MediumSeries>> GetAllSeriesAsync(MediumSeriesFilterQuery filterQuery, OrderQuery orderQuery, PagingQuery pagingQuery, Func<IQueryable<MediumSeries>, IQueryable<MediumSeries>>? additionalIncludes = null) =>
await DefaultSet.OfType<MediumSeries>()
.ApplyFilter(filterQuery)
.ApplyOrder(orderQuery, MediumOrderKeys.Base<MediumSeries>(), MediumOrderKeys.MediumSeries)
.ApplyPaging(pagingQuery)
.Include(additionalIncludes)
.ToListAsync();
public async Task<bool> UpdateAsync<T>(long id, Action<T> updateFunc) where T : Medium
{
T? entity = await GetAsync<T>(id);
if (entity is null)
{
return false;
}
updateFunc(entity);
DefaultSet.Update(entity);
await Database.SaveChangesAsync();
return true;
}
#endregion
#region Genres
public async Task<IEnumerable<Genre>> GetMediumGenresAsync(long id, GenreFilterQuery filterQuery, OrderQuery orderQuery, PagingQuery pagingQuery, Func<IQueryable<Genre>, IQueryable<Genre>>? additionalIncludes = null) =>
await Database.Set<MediumGenre>()
.Where(x => x.MediumId == id)
.Select(x => x.Genre)
.ApplyFilter(filterQuery)
.ApplyOrder(orderQuery, GenreOrderKeys.Base)
.ApplyPaging(pagingQuery)
.Include(additionalIncludes)
.ToListAsync();
public async Task AddMediumGenreAsync(long mediumId, short genreId)
{
if (!Database.Set<MediumGenre>().Any(x => x.MediumId == mediumId && x.GenreId == genreId))
{
await AddAsync(new MediumGenre { MediumId = mediumId, GenreId = genreId });
}
}
public async Task DeleteMediumGenreAsync(long mediumId, short genreId) =>
await DeleteAsync(new MediumGenre { MediumId = mediumId, GenreId = genreId });
#endregion
#region Rating
public async Task<IEnumerable<Medium>> GetAllRatedByAccountAsync(long accountId, MediumFilterQuery filterQuery, MediumUserRatedFilterQuery<Medium> userRatedFilterQuery, OrderQuery orderQuery, PagingQuery pagingQuery, Func<IQueryable<Medium>, IQueryable<Medium>>? additionalIncludes = null) =>
await DefaultSet.Where(x => x.Ratings
.Any(y => y.AccountId == accountId))
.ApplyFilter(filterQuery)
.ApplyFilter(userRatedFilterQuery)
.ApplyOrder(orderQuery, MediumOrderKeys.Base<Medium>(), MediumOrderKeys.Medium, MediumOrderKeys.MediumUserRated<Medium>(accountId))
.ApplyPaging(pagingQuery)
.Include(additionalIncludes)
.ToListAsync();
public async Task<IEnumerable<MediumMovie>> GetAllMoviesRatedByAccountAsync(long accountId, MediumMovieFilterQuery filterQuery, MediumUserRatedFilterQuery<MediumMovie> userRatedFilterQuery, OrderQuery orderQuery, PagingQuery pagingQuery, Func<IQueryable<MediumMovie>, IQueryable<MediumMovie>>? additionalIncludes = null) =>
await DefaultSet.OfType<MediumMovie>()
.Where(x => x.Ratings
.Any(y => y.AccountId == accountId))
.ApplyFilter(filterQuery)
.ApplyFilter(userRatedFilterQuery)
.ApplyOrder(orderQuery, MediumOrderKeys.Base<MediumMovie>(), MediumOrderKeys.MediumMovie, MediumOrderKeys.MediumUserRated<MediumMovie>(accountId))
.ApplyPaging(pagingQuery)
.Include(additionalIncludes)
.ToListAsync();
public async Task<IEnumerable<MediumSeries>> GetAllSeriesRatedByAccountAsync(long accountId, MediumSeriesFilterQuery filterQuery, MediumUserRatedFilterQuery<MediumSeries> userRatedFilterQuery, OrderQuery orderQuery, PagingQuery pagingQuery, Func<IQueryable<MediumSeries>, IQueryable<MediumSeries>>? additionalIncludes = null) =>
await DefaultSet.OfType<MediumSeries>()
.Where(x => x.Ratings
.Any(y => y.AccountId == accountId))
.ApplyFilter(filterQuery)
.ApplyFilter(userRatedFilterQuery)
.ApplyOrder(orderQuery, MediumOrderKeys.Base<MediumSeries>(), MediumOrderKeys.MediumSeries, MediumOrderKeys.MediumUserRated<MediumSeries>(accountId))
.ApplyPaging(pagingQuery)
.Include(additionalIncludes)
.ToListAsync();
public async Task<MediumRating?> GetMediumUserRatingAsync(long mediumId, long accountId, Func<IQueryable<MediumRating>, IQueryable<MediumRating>>? additionalIncludes = null) =>
await Database.Set<MediumRating>()
.Include(additionalIncludes)
.FirstOrDefaultAsync(x => x.MediumId == mediumId && x.AccountId == accountId);
public async Task<MediumRating> UpdateOrAddMediumRatingAsync(long mediumId, long accountId, Func<MediumRating> addFunc, Action<MediumRating> updateFunc) =>
await UpdateOrAddAsync(await GetMediumUserRatingAsync(mediumId, accountId), addFunc, updateFunc);
public async Task DeleteMediumUserRatingAsync(long mediumId, long accountId) =>
await DeleteAsync<MediumRating>(x => x.MediumId == mediumId && x.AccountId == accountId);
#endregion
#region View count
public async Task<MediumViewCount> UpdateOrAddMediumViewCountAsync(long mediumId, DateOnly date, Func<MediumViewCount> addFunc, Action<MediumViewCount> updateFunc) =>
await UpdateOrAddAsync(await Database.Set<MediumViewCount>()
.FirstOrDefaultAsync(x => x.MediumId == mediumId && x.Date == date), addFunc, updateFunc);
#endregion
#region Picture
public async Task<MediumPicture?> GetMediumPictureAsync(long id, Func<IQueryable<MediumPicture>, IQueryable<MediumPicture>>? additionalIncludes = null) =>
await Database.MediumPictures
.Include(additionalIncludes)
.FirstOrDefaultAsync(x => x.MediumId == id);
public async Task<MediumPicture> UpdateOrAddMediumPictureAsync(long id, Func<MediumPicture> addFunc, Action<MediumPicture> updateFunc) =>
await UpdateOrAddAsync(await GetMediumPictureAsync(id), addFunc, updateFunc);
public async Task DeleteMediumPictureAsync(long id) =>
await DeleteAsync(new MediumPicture { MediumId = id });
#endregion
#endregion
}

View File

@@ -0,0 +1,22 @@
using WatchIt.Database.Model.People;
using WatchIt.DTO.Models.Controllers.People.Person.Query;
using WatchIt.DTO.Query;
namespace WatchIt.WebAPI.Repositories.People;
public interface IPeopleRepository : IRepository<Person>
{
Task<bool> ExistsAsync(long id);
Task<Person?> GetAsync(long id, Func<IQueryable<Person>, IQueryable<Person>>? additionalIncludes = null);
Task<IEnumerable<Person>> GetAllAsync(PersonFilterQuery filterQuery, OrderQuery orderQuery, PagingQuery pagingQuery, Func<IQueryable<Person>, IQueryable<Person>>? additionalIncludes = null);
Task<bool> UpdateAsync(long id, Action<Person> updateFunc, Func<IQueryable<Person>, IQueryable<Person>>? additionalIncludes = null);
Task DeleteAsync(long id);
Task<PersonViewCount> UpdateOrAddPersonViewCountAsync(long personId, DateOnly date, Func<PersonViewCount> addFunc, Action<PersonViewCount> updateFunc);
Task<PersonPicture?> GetPersonPictureAsync(long id, Func<IQueryable<PersonPicture>, IQueryable<PersonPicture>>? additionalIncludes = null);
Task<PersonPicture> UpdateOrAddPersonPictureAsync(long id, Func<PersonPicture> addFunc, Action<PersonPicture> updateFunc);
Task DeletePersonPictureAsync(long id);
Task<IEnumerable<Person>> GetAllRatedByAccountAsync(long accountId, PersonFilterQuery filterQuery, PersonUserRatedFilterQuery userRatedFilterQuery, OrderQuery orderQuery, PagingQuery pagingQuery, Func<IQueryable<Person>, IQueryable<Person>>? additionalIncludes = null);
}

View File

@@ -0,0 +1,94 @@
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
}

View File

@@ -0,0 +1,21 @@
using WatchIt.Database.Model.Photos;
using WatchIt.DTO.Models.Controllers.Photos.Photo;
using WatchIt.DTO.Query;
namespace WatchIt.WebAPI.Repositories.Photos;
public interface IPhotosRepository : IRepository<Photo>
{
Task<bool> ExistsAsync(Guid id);
Task<Photo?> GetAsync(Guid id, Func<IQueryable<Photo>, IQueryable<Photo>>? additionalIncludes = null);
Task<IEnumerable<Photo>> GetAllAsync(PhotoFilterQuery filterQuery, OrderQuery orderQuery, PagingQuery pagingQuery, Func<IQueryable<Photo>, IQueryable<Photo>>? additionalIncludes = null);
Task<Photo?> GetPhotoRandomBackgroundAsync(Func<IQueryable<Photo>, IQueryable<Photo>>? additionalIncludes = null);
Task<bool> UpdateAsync(Guid id, Action<Photo> updateFunc);
Task DeleteAsync(Guid id);
Task AddPhotoBackgroundAsync(PhotoBackground photoBackground);
Task<PhotoBackground> UpdateOrAddPhotoBackgroundAsync(Guid photoId, Func<PhotoBackground> addFunc, Action<PhotoBackground> updateFunc);
Task DeletePhotoBackgroundAsync(Guid photoId);
Task<Photo> GetPhotoRandomBackgroundByMediumAsync(long mediumId, Func<IQueryable<Photo>, IQueryable<Photo>>? additionalIncludes = null);
}

View File

@@ -0,0 +1,112 @@
using Microsoft.EntityFrameworkCore;
using WatchIt.Database;
using WatchIt.Database.Model.Photos;
using WatchIt.DTO.Models.Controllers.Photos.Photo;
using WatchIt.DTO.Query;
namespace WatchIt.WebAPI.Repositories.Photos;
public class PhotosRepository : Repository<Photo>, IPhotosRepository
{
#region CONSTRUCTORS
public PhotosRepository(DatabaseContext database) : base(database) {}
#endregion
#region PUBLIC METHODS
#region Main
public async Task<bool> ExistsAsync(Guid id) =>
await DefaultSet.AnyAsync(x => x.Id == id);
public async Task<Photo?> GetAsync(Guid id, Func<IQueryable<Photo>, IQueryable<Photo>>? additionalIncludes = null) =>
await DefaultSet.Include(additionalIncludes)
.FirstOrDefaultAsync(x => x.Id == id);
public async Task<IEnumerable<Photo>> GetAllAsync(PhotoFilterQuery filterQuery, OrderQuery orderQuery, PagingQuery pagingQuery, Func<IQueryable<Photo>, IQueryable<Photo>>? additionalIncludes = null) =>
await DefaultSet.ApplyFilter(filterQuery)
.ApplyOrder(orderQuery, PhotoOrderKeys.Base)
.ApplyPaging(pagingQuery)
.Include(additionalIncludes)
.ToListAsync();
public async Task<Photo?> GetPhotoRandomBackgroundAsync(Func<IQueryable<Photo>, IQueryable<Photo>>? additionalIncludes = null)
{
IQueryable<Photo> query = DefaultSet.Where(x => x.Background != null && x.Background.IsUniversal);
int count = await query.CountAsync();
int randomIndex = Random.Shared.Next(count);
return await query.Include(additionalIncludes)
.ElementAtAsync(randomIndex);
}
public async Task<bool> UpdateAsync(Guid id, Action<Photo> updateFunc)
{
Photo? 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<PhotoBackground>(x => x.PhotoId == id);
await DeleteAsync(x => x.Id == id);
}
#endregion
#region Background
public async Task AddPhotoBackgroundAsync(PhotoBackground photoBackground)
{
await Database.PhotoBackgrounds.AddAsync(photoBackground);
await Database.SaveChangesAsync();
}
public async Task<PhotoBackground> UpdateOrAddPhotoBackgroundAsync(Guid photoId, Func<PhotoBackground> addFunc, Action<PhotoBackground> updateFunc)
{
PhotoBackground? entity = await Database.PhotoBackgrounds.FirstOrDefaultAsync(x => x.PhotoId == photoId);
if (entity is null)
{
entity = addFunc();
await Database.PhotoBackgrounds.AddAsync(entity);
}
else
{
updateFunc(entity);
Database.PhotoBackgrounds.Update(entity);
}
await Database.SaveChangesAsync();
return entity;
}
public async Task DeletePhotoBackgroundAsync(Guid photoId) =>
await DeleteAsync<PhotoBackground>(x => x.PhotoId == photoId);
#endregion
#region Medium
public async Task<Photo> GetPhotoRandomBackgroundByMediumAsync(long mediumId, Func<IQueryable<Photo>, IQueryable<Photo>>? additionalIncludes = null)
{
IQueryable<Photo> query = DefaultSet.Where(x => x.MediumId == mediumId && x.Background != null);
int count = await query.CountAsync();
int randomIndex = Random.Shared.Next(count);
return await query.Include(additionalIncludes)
.ElementAtAsync(randomIndex);
}
#endregion
#endregion
}

View File

@@ -0,0 +1,16 @@
using Microsoft.EntityFrameworkCore.Metadata.Conventions;
using Microsoft.EntityFrameworkCore.Query;
namespace WatchIt.WebAPI.Repositories;
public static class QueryableExtensions
{
internal static IQueryable<T> Include<T>(this IQueryable<T> queryable, Func<IQueryable<T>, IQueryable<T>>? additionalIncludes = null)
{
if (additionalIncludes is not null)
{
queryable = additionalIncludes(queryable);
}
return queryable;
}
}

View File

@@ -0,0 +1,118 @@
using System.Collections.Immutable;
using System.Linq.Expressions;
using Microsoft.EntityFrameworkCore;
using WatchIt.Database;
using WatchIt.DTO.Query;
namespace WatchIt.WebAPI.Repositories;
public abstract class Repository<T> : IRepository<T> where T : class
{
#region SERVICES
protected readonly DatabaseContext Database;
#endregion
#region FIELDS
protected readonly DbSet<T> DefaultSet;
#endregion
#region CONSTRUCTORS
protected Repository(DatabaseContext database)
{
Database = database;
DefaultSet = database.Set<T>();
}
#endregion
#region PUBLIC METHODS
public async Task<IEnumerable<T>> GetAllAsync(Func<IQueryable<T>, IQueryable<T>>? additionalIncludes = null) =>
await GetAllAsync<T>(additionalIncludes);
public async Task UpdateAsync(T entity, Action<T> updateFunc) =>
await UpdateAsync<T>(entity, updateFunc);
public async Task AddAsync(T entity) =>
await AddAsync<T>(entity);
public async Task<T> UpdateOrAddAsync(T? entity, Func<T> addFunc, Action<T> updateFunc) =>
await UpdateOrAddAsync<T>(entity, addFunc, updateFunc);
public async Task DeleteAsync(T entity) =>
await DeleteAsync<T>(entity);
public async Task DeleteAsync(Expression<Func<T, bool>> predicate) =>
await DeleteAsync<T>(predicate);
#endregion
#region PRIVATE METHODS
protected async Task<IEnumerable<TEntity>> GetAllAsync<TEntity>(Func<IQueryable<TEntity>, IQueryable<TEntity>>? additionalIncludes = null) where TEntity : class =>
await Database.Set<TEntity>()
.Include(additionalIncludes)
.ToListAsync();
protected async Task UpdateAsync<TEntity>(TEntity entity, Action<TEntity> updateFunc) where TEntity : class
{
updateFunc(entity);
Database.Set<TEntity>().Update(entity);
await Database.SaveChangesAsync();
}
protected async Task AddAsync<TEntity>(TEntity entity) where TEntity : class
{
await Database.Set<TEntity>().AddAsync(entity);
await Database.SaveChangesAsync();
}
protected async Task<TEntity> UpdateOrAddAsync<TEntity>(TEntity? entity, Func<TEntity> addFunc, Action<TEntity> updateFunc) where TEntity : class
{
if (entity is null)
{
entity = addFunc();
await Database.Set<TEntity>().AddAsync(entity);
}
else
{
updateFunc(entity);
Database.Set<TEntity>().Update(entity);
}
await Database.SaveChangesAsync();
return entity;
}
protected async Task DeleteAsync<TEntity>(TEntity entity) where TEntity : class
{
DbSet<TEntity> dbSet = Database.Set<TEntity>();
dbSet.Attach(entity);
dbSet.Remove(entity);
await Database.SaveChangesAsync();
}
protected async Task DeleteAsync<TEntity>(Expression<Func<TEntity, bool>> predicate) where TEntity : class
{
DbSet<TEntity> dbSet = Database.Set<TEntity>();
IQueryable<TEntity> entities = dbSet.Where(predicate);
dbSet.AttachRange(entities);
dbSet.RemoveRange(entities);
await Database.SaveChangesAsync();
}
#endregion
}

View File

@@ -0,0 +1,38 @@
using System.Linq.Expressions;
using WatchIt.Database.Model.Roles;
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 interface IRolesRepository : IRepository<Role>
{
Task<bool> ExistsAsync(Guid id);
Task<Role?> GetAsync(Guid id, Func<IQueryable<Role>, IQueryable<Role>>? additionalIncludes = null);
Task<T?> GetAsync<T>(Guid id, Func<IQueryable<T>, IQueryable<T>>? additionalIncludes = null) where T : Role;
Task<IEnumerable<RoleActor>> GetAllActorsAsync(RoleActorFilterQuery filterQuery, OrderQuery orderQuery, PagingQuery pagingQuery, Func<IQueryable<RoleActor>, IQueryable<RoleActor>>? additionalIncludes = null);
Task<IEnumerable<RoleCreator>> GetAllCreatorsAsync(RoleCreatorFilterQuery filterQuery, OrderQuery orderQuery, PagingQuery pagingQuery, Func<IQueryable<RoleCreator>, IQueryable<RoleCreator>>? additionalIncludes = null);
Task<bool> UpdateAsync<T>(Guid id, Action<T> updateFunc) where T : Role;
Task DeleteAsync(Guid id);
Task<IEnumerable<RoleRating>> GetRoleRatingsAsync(Guid roleId, Func<IQueryable<RoleRating>, IQueryable<RoleRating>>? additionalIncludes = null);
Task<RoleRating?> GetRoleRatingByUserAsync(Guid roleId, long accountId, Func<IQueryable<RoleRating>, IQueryable<RoleRating>>? additionalIncludes = null);
Task<IEnumerable<RoleRating>> GetPersonRoleRatingsAsync(long personId, Func<IQueryable<RoleRating>, IQueryable<RoleRating>>? additionalIncludes = null);
Task<IEnumerable<RoleRating>> GetPersonRoleRatingsByAccountIdAsync(long personId, long accountId, Func<IQueryable<RoleRating>, IQueryable<RoleRating>>? additionalIncludes = null);
Task<RoleRating> UpdateOrAddRoleRatingAsync(Guid roleId, long accountId, Func<RoleRating> addFunc, Action<RoleRating> updateFunc);
Task DeleteRoleUserRatingAsync(Guid roleId, long accountId);
Task<bool> ExistsActorTypeAsync(short id);
Task<RoleActorType?> GetActorTypeAsync(short id, Func<IQueryable<RoleActorType>, IQueryable<RoleActorType>>? additionalIncludes = null);
Task<IEnumerable<RoleActorType>> GetAllActorTypesAsync(RoleActorTypeFilterQuery filterQuery, OrderQuery orderQuery, PagingQuery pagingQuery, Func<IQueryable<RoleActorType>, IQueryable<RoleActorType>>? additionalIncludes = null);
Task AddActorTypeAsync(RoleActorType actorType);
Task DeleteActorTypeAsync(short id);
Task<bool> ExistsCreatorTypeAsync(short id);
Task<RoleCreatorType?> GetCreatorTypeAsync(short id, Func<IQueryable<RoleCreatorType>, IQueryable<RoleCreatorType>>? additionalIncludes = null);
Task<IEnumerable<RoleCreatorType>> GetAllCreatorTypesAsync(RoleCreatorTypeFilterQuery filterQuery, OrderQuery orderQuery, PagingQuery pagingQuery, Func<IQueryable<RoleCreatorType>, IQueryable<RoleCreatorType>>? additionalIncludes = null);
Task AddCreatorTypeAsync(RoleCreatorType creatorType);
Task DeleteCreatorTypeAsync(short id);
}

View File

@@ -0,0 +1,161 @@
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<Role>, IRolesRepository
{
#region CONSTRUCTORS
public RolesRepository(DatabaseContext database) : base(database) {}
#endregion
#region PUBLIC METHODS
#region Main
public async Task<bool> ExistsAsync(Guid id) =>
await DefaultSet.AnyAsync(x => x.Id == id);
public async Task<Role?> GetAsync(Guid id, Func<IQueryable<Role>, IQueryable<Role>>? additionalIncludes = null) =>
await DefaultSet.Include(additionalIncludes)
.FirstOrDefaultAsync(x => x.Id == id);
public async Task<T?> GetAsync<T>(Guid id, Func<IQueryable<T>, IQueryable<T>>? additionalIncludes = null) where T : Role =>
await DefaultSet.OfType<T>()
.Include(additionalIncludes)
.FirstOrDefaultAsync(x => x.Id == id);
public async Task<IEnumerable<RoleActor>> GetAllActorsAsync(RoleActorFilterQuery filterQuery, OrderQuery orderQuery, PagingQuery pagingQuery, Func<IQueryable<RoleActor>, IQueryable<RoleActor>>? additionalIncludes = null) =>
await DefaultSet.OfType<RoleActor>()
.ApplyFilter(filterQuery)
.ApplyOrder(orderQuery, RoleOrderKeys.Base<RoleActor>(), RoleOrderKeys.RoleActor)
.ApplyPaging(pagingQuery)
.Include(additionalIncludes)
.ToListAsync();
public async Task<IEnumerable<RoleCreator>> GetAllCreatorsAsync(RoleCreatorFilterQuery filterQuery, OrderQuery orderQuery, PagingQuery pagingQuery, Func<IQueryable<RoleCreator>, IQueryable<RoleCreator>>? additionalIncludes = null) =>
await DefaultSet.OfType<RoleCreator>()
.ApplyFilter(filterQuery)
.ApplyOrder(orderQuery, RoleOrderKeys.Base<RoleCreator>(), RoleOrderKeys.RoleCreator)
.ApplyPaging(pagingQuery)
.Include(additionalIncludes)
.ToListAsync();
public async Task<bool> UpdateAsync<T>(Guid id, Action<T> updateFunc) where T : Role
{
T? entity = await GetAsync<T>(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<IEnumerable<RoleRating>> GetRoleRatingsAsync(Guid roleId, Func<IQueryable<RoleRating>, IQueryable<RoleRating>>? additionalIncludes = null) =>
await Database.RoleRatings
.Where(x => x.RoleId == roleId)
.Include(additionalIncludes)
.ToListAsync();
public async Task<RoleRating?> GetRoleRatingByUserAsync(Guid roleId, long accountId, Func<IQueryable<RoleRating>, IQueryable<RoleRating>>? additionalIncludes = null) =>
await Database.RoleRatings
.Include(additionalIncludes)
.FirstOrDefaultAsync(x => x.RoleId == roleId && x.AccountId == accountId);
public async Task<IEnumerable<RoleRating>> GetPersonRoleRatingsAsync(long personId, Func<IQueryable<RoleRating>, IQueryable<RoleRating>>? additionalIncludes = null) =>
await Database.RoleRatings
.Where(x => x.Role.PersonId == personId)
.Include(additionalIncludes)
.ToListAsync();
public async Task<IEnumerable<RoleRating>> GetPersonRoleRatingsByAccountIdAsync(long personId, long accountId, Func<IQueryable<RoleRating>, IQueryable<RoleRating>>? additionalIncludes = null) =>
await Database.RoleRatings
.Where(x => x.Role.PersonId == personId && x.AccountId == accountId)
.Include(additionalIncludes)
.ToListAsync();
public async Task<RoleRating> UpdateOrAddRoleRatingAsync(Guid roleId, long accountId, Func<RoleRating> addFunc, Action<RoleRating> updateFunc) =>
await UpdateOrAddAsync(await GetRoleRatingByUserAsync(roleId, accountId), addFunc, updateFunc);
public async Task DeleteRoleUserRatingAsync(Guid roleId, long accountId) =>
await DeleteAsync<RoleRating>(x => x.RoleId == roleId && x.AccountId == accountId);
#endregion
#region ActorTypes
public async Task<bool> ExistsActorTypeAsync(short id) =>
await Database.RoleActorTypes
.AnyAsync(x => x.Id == id);
public async Task<RoleActorType?> GetActorTypeAsync(short id, Func<IQueryable<RoleActorType>, IQueryable<RoleActorType>>? additionalIncludes = null) =>
await Database.RoleActorTypes
.Include(additionalIncludes)
.FirstOrDefaultAsync(x => x.Id == id);
public async Task<IEnumerable<RoleActorType>> GetAllActorTypesAsync(RoleActorTypeFilterQuery filterQuery, OrderQuery orderQuery, PagingQuery pagingQuery, Func<IQueryable<RoleActorType>, IQueryable<RoleActorType>>? 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<bool> ExistsCreatorTypeAsync(short id) =>
await Database.RoleCreatorTypes
.AnyAsync(x => x.Id == id);
public async Task<RoleCreatorType?> GetCreatorTypeAsync(short id, Func<IQueryable<RoleCreatorType>, IQueryable<RoleCreatorType>>? additionalIncludes = null) =>
await Database.RoleCreatorTypes
.Include(additionalIncludes)
.FirstOrDefaultAsync(x => x.Id == id);
public async Task<IEnumerable<RoleCreatorType>> GetAllCreatorTypesAsync(RoleCreatorTypeFilterQuery filterQuery, OrderQuery orderQuery, PagingQuery pagingQuery, Func<IQueryable<RoleCreatorType>, IQueryable<RoleCreatorType>>? 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
}