diff --git a/Kyoo/Controllers/Repositories/GenreRepository.cs b/Kyoo/Controllers/Repositories/GenreRepository.cs new file mode 100644 index 00000000..5544c07b --- /dev/null +++ b/Kyoo/Controllers/Repositories/GenreRepository.cs @@ -0,0 +1,87 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Kyoo.Models; +using Kyoo.Models.Exceptions; +using Microsoft.EntityFrameworkCore; + +namespace Kyoo.Controllers +{ + public class GenreRepository : IGenreRepository + { + private readonly DatabaseContext _database; + + + public GenreRepository(DatabaseContext database) + { + _database = database; + } + + public async Task Get(long id) + { + return await _database.Genres.FirstOrDefaultAsync(x => x.ID == id); + } + + public async Task Get(string slug) + { + return await _database.Genres.FirstOrDefaultAsync(x => x.Slug == slug); + } + + public async Task> Search(string query) + { + return await _database.Genres + .Where(genre => EF.Functions.Like(genre.Name, $"%{query}%")) + .Take(20) + .ToListAsync(); + } + + public async Task> GetAll() + { + return await _database.Genres.ToListAsync(); + } + + public async Task Create(Genre obj) + { + if (obj == null) + throw new ArgumentNullException(nameof(obj)); + + await _database.Genres.AddAsync(obj); + await _database.SaveChangesAsync(); + return obj.ID; + } + + public async Task CreateIfNotExists(Genre obj) + { + if (obj == null) + throw new ArgumentNullException(nameof(obj)); + + Genre old = await Get(obj.Slug); + if (old != null) + return obj.ID; + return await Create(obj); + } + + public async Task Edit(Genre edited, bool resetOld) + { + if (edited == null) + throw new ArgumentNullException(nameof(edited)); + + Genre old = await Get(edited.Slug); + + if (old == null) + throw new ItemNotFound($"No genre found with the slug {edited.Slug}."); + + if (resetOld) + Utility.Nullify(old); + Utility.Merge(old, edited); + await _database.SaveChangesAsync(); + } + + public async Task Delete(Genre obj) + { + _database.Genres.Remove(obj); + await _database.SaveChangesAsync(); + } + } +} \ No newline at end of file diff --git a/Kyoo/Controllers/Repositories/ShowRepository.cs b/Kyoo/Controllers/Repositories/ShowRepository.cs index 120af32c..e0901cfc 100644 --- a/Kyoo/Controllers/Repositories/ShowRepository.cs +++ b/Kyoo/Controllers/Repositories/ShowRepository.cs @@ -29,49 +29,36 @@ namespace Kyoo.Controllers _providers = providers; } - public Task Get(long id) + public async Task Get(long id) { - return Task.FromResult(_database.Shows.FirstOrDefault(x => x.ID == id)); + return await _database.Shows.FirstOrDefaultAsync(x => x.ID == id); } - public Task Get(string slug) + public async Task Get(string slug) { - return Task.FromResult(_database.Shows.FirstOrDefault(x => x.Slug == slug)); + return await _database.Shows.FirstOrDefaultAsync(x => x.Slug == slug); } - public Task> Search(string query) + public async Task> Search(string query) { - return Task.FromResult>( - _database.Shows.FromSqlInterpolated($@"SELECT * FROM Shows WHERE Shows.Title LIKE {$"%{query}%"} - OR Shows.Aliases LIKE {$"%{query}%"}").Take(20).ToList()); + return await _database.Shows + .FromSqlInterpolated($@"SELECT * FROM Shows WHERE Shows.Title LIKE {$"%{query}%"} + OR Shows.Aliases LIKE {$"%{query}%"}") + .Take(20) + .ToListAsync(); } - public Task> GetAll() + public async Task> GetAll() { - return Task.FromResult>(_database.Shows.ToList()); + return await _database.Shows.ToListAsync(); } public async Task Create(Show obj) { if (obj == null) throw new ArgumentNullException(nameof(obj)); - - obj.StudioID = await _studio.CreateIfNotExists(obj.Studio); - obj.GenreLinks = (await Task.WhenAll(obj.GenreLinks.Select(async x => - { - x.GenreID = await _genres.CreateIfNotExists(x.Genre); - return x; - }))).ToList(); - obj.People = (await Task.WhenAll(obj.People.Select(async x => - { - x.PeopleID = await _people.CreateIfNotExists(x.People); - return x; - }))).ToList(); - obj.ExternalIDs = (await Task.WhenAll(obj.ExternalIDs.Select(async x => - { - x.ProviderID = await _providers.CreateIfNotExists(x.Provider); - return x; - }))).ToList(); + + await Validate(obj); obj.Seasons = null; obj.Episodes = null; @@ -105,9 +92,30 @@ namespace Kyoo.Controllers if (resetOld) Utility.Nullify(old); Utility.Merge(old, edited); + await Validate(old); await _database.SaveChangesAsync(); } + private async Task Validate(Show obj) + { + obj.StudioID = await _studio.CreateIfNotExists(obj.Studio); + obj.GenreLinks = (await Task.WhenAll(obj.GenreLinks.Select(async x => + { + x.GenreID = await _genres.CreateIfNotExists(x.Genre); + return x; + }))).ToList(); + obj.People = (await Task.WhenAll(obj.People.Select(async x => + { + x.PeopleID = await _people.CreateIfNotExists(x.People); + return x; + }))).ToList(); + obj.ExternalIDs = (await Task.WhenAll(obj.ExternalIDs.Select(async x => + { + x.ProviderID = await _providers.CreateIfNotExists(x.Provider); + return x; + }))).ToList(); + } + public async Task Delete(Show show) { _database.Shows.Remove(show);