From e7a3cfc2cc13131cb4c91e65265044b68eb7485c Mon Sep 17 00:00:00 2001 From: Zoe Roux Date: Sun, 7 Jun 2020 19:31:45 +0200 Subject: [PATCH] Solving bugs with related entities in repositories --- Kyoo.Common/Kyoo.Common.csproj | 2 +- .../Repositories/EpisodeRepository.cs | 5 ++++- .../Repositories/LibraryRepository.cs | 4 +++- .../Repositories/PeopleRepository.cs | 19 ++++++++++++------- .../Repositories/SeasonRepository.cs | 10 +++++----- Kyoo/Views/API/ShowsAPI.cs | 5 ++++- 6 files changed, 29 insertions(+), 16 deletions(-) diff --git a/Kyoo.Common/Kyoo.Common.csproj b/Kyoo.Common/Kyoo.Common.csproj index 7799859f..bdd20619 100644 --- a/Kyoo.Common/Kyoo.Common.csproj +++ b/Kyoo.Common/Kyoo.Common.csproj @@ -11,7 +11,7 @@ SDG GPL-3.0-or-later true - 1.0.20 + 1.0.21 diff --git a/Kyoo/Controllers/Repositories/EpisodeRepository.cs b/Kyoo/Controllers/Repositories/EpisodeRepository.cs index 157a7a80..231107b6 100644 --- a/Kyoo/Controllers/Repositories/EpisodeRepository.cs +++ b/Kyoo/Controllers/Repositories/EpisodeRepository.cs @@ -66,7 +66,10 @@ namespace Kyoo.Controllers throw new ArgumentNullException(nameof(obj)); await Validate(obj); - await _database.Episodes.AddAsync(obj); + _database.Entry(obj).State = EntityState.Added; + if (obj.ExternalIDs != null) + foreach (MetadataID entry in obj.ExternalIDs) + _database.Entry(entry).State = EntityState.Added; await _database.SaveChangesAsync(); return obj.ID; } diff --git a/Kyoo/Controllers/Repositories/LibraryRepository.cs b/Kyoo/Controllers/Repositories/LibraryRepository.cs index 9df08f4b..4df5a1d0 100644 --- a/Kyoo/Controllers/Repositories/LibraryRepository.cs +++ b/Kyoo/Controllers/Repositories/LibraryRepository.cs @@ -49,9 +49,11 @@ namespace Kyoo.Controllers if (obj == null) throw new ArgumentNullException(nameof(obj)); - obj.Links = null; await Validate(obj); _database.Entry(obj).State = EntityState.Added; + if (obj.ProviderLinks != null) + foreach (ProviderLink entry in obj.ProviderLinks) + _database.Entry(entry).State = EntityState.Added; await _database.SaveChangesAsync(); return obj.ID; } diff --git a/Kyoo/Controllers/Repositories/PeopleRepository.cs b/Kyoo/Controllers/Repositories/PeopleRepository.cs index d6fd7e3f..26bcc825 100644 --- a/Kyoo/Controllers/Repositories/PeopleRepository.cs +++ b/Kyoo/Controllers/Repositories/PeopleRepository.cs @@ -5,18 +5,19 @@ using System.Threading.Tasks; using Kyoo.Models; using Kyoo.Models.Exceptions; using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.DependencyInjection; namespace Kyoo.Controllers { public class PeopleRepository : IPeopleRepository { private readonly DatabaseContext _database; - private readonly IProviderRepository _providers; + private readonly IServiceProvider _serviceProvider; - public PeopleRepository(DatabaseContext database, IProviderRepository providers) + public PeopleRepository(DatabaseContext database, IServiceProvider serviceProvider) { _database = database; - _providers = providers; + _serviceProvider = serviceProvider; } public Task Get(int id) @@ -48,9 +49,10 @@ namespace Kyoo.Controllers throw new ArgumentNullException(nameof(obj)); await Validate(obj); - obj.Roles = null; - - await _database.Peoples.AddAsync(obj); + _database.Entry(obj).State = EntityState.Added; + if (obj.ExternalIDs != null) + foreach (MetadataID entry in obj.ExternalIDs) + _database.Entry(entry).State = EntityState.Added; await _database.SaveChangesAsync(); return obj.ID; } @@ -87,7 +89,10 @@ namespace Kyoo.Controllers { obj.ExternalIDs = (await Task.WhenAll(obj.ExternalIDs.Select(async x => { - x.ProviderID = await _providers.CreateIfNotExists(x.Provider); + using IServiceScope serviceScope = _serviceProvider.CreateScope(); + IProviderRepository providers = serviceScope.ServiceProvider.GetService(); + + x.ProviderID = await providers.CreateIfNotExists(x.Provider); return x; }))).ToList(); } diff --git a/Kyoo/Controllers/Repositories/SeasonRepository.cs b/Kyoo/Controllers/Repositories/SeasonRepository.cs index bf06c538..6e514871 100644 --- a/Kyoo/Controllers/Repositories/SeasonRepository.cs +++ b/Kyoo/Controllers/Repositories/SeasonRepository.cs @@ -60,12 +60,12 @@ namespace Kyoo.Controllers { if (obj == null) throw new ArgumentNullException(nameof(obj)); - - obj.Show = null; - obj.Episodes = null; - await Validate(obj); - await _database.Seasons.AddAsync(obj); + await Validate(obj); + _database.Entry(obj).State = EntityState.Added; + if (obj.ExternalIDs != null) + foreach (MetadataID entry in obj.ExternalIDs) + _database.Entry(entry).State = EntityState.Added; await _database.SaveChangesAsync(); return obj.ID; } diff --git a/Kyoo/Views/API/ShowsAPI.cs b/Kyoo/Views/API/ShowsAPI.cs index e92c028a..a22a485e 100644 --- a/Kyoo/Views/API/ShowsAPI.cs +++ b/Kyoo/Views/API/ShowsAPI.cs @@ -37,7 +37,10 @@ namespace Kyoo.Api [Authorize(Policy="Read")] public IEnumerable GetShows() { - return _database.LibraryLinks.AsEnumerable().Select(x => x.Show ?? x.Collection.AsShow()); + return _database.LibraryLinks + .Include(x => x.Show) + .Include(x => x.Collection) + .AsEnumerable().Select(x => x.Show ?? x.Collection.AsShow()).ToList(); } [HttpGet("{slug}")]