Refactoring, database structure changed
This commit is contained in:
130
WatchIt.WebAPI/Repositories/Accounts/AccountsRepository.cs
Normal file
130
WatchIt.WebAPI/Repositories/Accounts/AccountsRepository.cs
Normal 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
|
||||
}
|
||||
33
WatchIt.WebAPI/Repositories/Accounts/IAccountsRepository.cs
Normal file
33
WatchIt.WebAPI/Repositories/Accounts/IAccountsRepository.cs
Normal 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);
|
||||
}
|
||||
36
WatchIt.WebAPI/Repositories/Genders/GendersRepository.cs
Normal file
36
WatchIt.WebAPI/Repositories/Genders/GendersRepository.cs
Normal 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
|
||||
}
|
||||
12
WatchIt.WebAPI/Repositories/Genders/IGendersRepository.cs
Normal file
12
WatchIt.WebAPI/Repositories/Genders/IGendersRepository.cs
Normal 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);
|
||||
}
|
||||
36
WatchIt.WebAPI/Repositories/Genres/GenresRepository.cs
Normal file
36
WatchIt.WebAPI/Repositories/Genres/GenresRepository.cs
Normal 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
|
||||
}
|
||||
12
WatchIt.WebAPI/Repositories/Genres/IGenresRepository.cs
Normal file
12
WatchIt.WebAPI/Repositories/Genres/IGenresRepository.cs
Normal 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);
|
||||
}
|
||||
15
WatchIt.WebAPI/Repositories/IRepository.cs
Normal file
15
WatchIt.WebAPI/Repositories/IRepository.cs
Normal 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);
|
||||
}
|
||||
35
WatchIt.WebAPI/Repositories/Media/IMediaRepository.cs
Normal file
35
WatchIt.WebAPI/Repositories/Media/IMediaRepository.cs
Normal 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);
|
||||
}
|
||||
175
WatchIt.WebAPI/Repositories/Media/MediaRepository.cs
Normal file
175
WatchIt.WebAPI/Repositories/Media/MediaRepository.cs
Normal 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
|
||||
}
|
||||
22
WatchIt.WebAPI/Repositories/People/IPeopleRepository.cs
Normal file
22
WatchIt.WebAPI/Repositories/People/IPeopleRepository.cs
Normal 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);
|
||||
}
|
||||
94
WatchIt.WebAPI/Repositories/People/PeopleRepository.cs
Normal file
94
WatchIt.WebAPI/Repositories/People/PeopleRepository.cs
Normal 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
|
||||
}
|
||||
21
WatchIt.WebAPI/Repositories/Photos/IPhotosRepository.cs
Normal file
21
WatchIt.WebAPI/Repositories/Photos/IPhotosRepository.cs
Normal 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);
|
||||
}
|
||||
112
WatchIt.WebAPI/Repositories/Photos/PhotosRepository.cs
Normal file
112
WatchIt.WebAPI/Repositories/Photos/PhotosRepository.cs
Normal 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
|
||||
}
|
||||
16
WatchIt.WebAPI/Repositories/QueryableExtensions.cs
Normal file
16
WatchIt.WebAPI/Repositories/QueryableExtensions.cs
Normal 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;
|
||||
}
|
||||
}
|
||||
118
WatchIt.WebAPI/Repositories/Repository.cs
Normal file
118
WatchIt.WebAPI/Repositories/Repository.cs
Normal 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
|
||||
}
|
||||
38
WatchIt.WebAPI/Repositories/Roles/IRolesRepository.cs
Normal file
38
WatchIt.WebAPI/Repositories/Roles/IRolesRepository.cs
Normal 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);
|
||||
}
|
||||
161
WatchIt.WebAPI/Repositories/Roles/RolesRepository.cs
Normal file
161
WatchIt.WebAPI/Repositories/Roles/RolesRepository.cs
Normal 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
|
||||
}
|
||||
Reference in New Issue
Block a user