From c0b83d2d58bd2a11a69365eae29c1198c2407529 Mon Sep 17 00:00:00 2001 From: Zoe Roux Date: Sat, 31 Jul 2021 23:16:36 +0200 Subject: [PATCH] ShowRepository: Fixing relation adding --- .../Database/SpecificTests/ShowTests.cs | 20 +++++++++++ .../Repositories/ShowRepository.cs | 34 +++++++++++-------- 2 files changed, 40 insertions(+), 14 deletions(-) diff --git a/Kyoo.Tests/Database/SpecificTests/ShowTests.cs b/Kyoo.Tests/Database/SpecificTests/ShowTests.cs index 424ca76c..d004f954 100644 --- a/Kyoo.Tests/Database/SpecificTests/ShowTests.cs +++ b/Kyoo.Tests/Database/SpecificTests/ShowTests.cs @@ -74,6 +74,26 @@ namespace Kyoo.Tests.Database Assert.Equal(value.Genres.Select(x => new{x.Slug, x.Name}), show.Genres.Select(x => new{x.Slug, x.Name})); } + [Fact] + public async Task AddGenreTest() + { + Show value = await _repository.Get(TestSample.Get().Slug); + await Repositories.LibraryManager.Load(value, x => x.Genres); + value.Genres.Add(new Genre("test")); + Show edited = await _repository.Edit(value, false); + + Assert.Equal(value.Slug, edited.Slug); + Assert.Equal(value.Genres.Select(x => new{x.Slug, x.Name}), edited.Genres.Select(x => new{x.Slug, x.Name})); + + await using DatabaseContext database = Repositories.Context.New(); + Show show = await database.Shows + .Include(x => x.Genres) + .FirstAsync(); + + Assert.Equal(value.Slug, show.Slug); + Assert.Equal(value.Genres.Select(x => new{x.Slug, x.Name}), show.Genres.Select(x => new{x.Slug, x.Name})); + } + [Fact] public async Task EditStudioTest() { diff --git a/Kyoo/Controllers/Repositories/ShowRepository.cs b/Kyoo/Controllers/Repositories/ShowRepository.cs index 1c7471f7..458690f7 100644 --- a/Kyoo/Controllers/Repositories/ShowRepository.cs +++ b/Kyoo/Controllers/Repositories/ShowRepository.cs @@ -76,10 +76,6 @@ namespace Kyoo.Controllers { await base.Create(obj); _database.Entry(obj).State = EntityState.Added; - if (obj.Genres != null) - _database.AttachRange(obj.Genres); - obj.People.ForEach(x => _database.Entry(x).State = EntityState.Added); - obj.ExternalIDs.ForEach(x => _database.MetadataIds().Attach(x)); await _database.SaveChangesAsync($"Trying to insert a duplicated show (slug {obj.Slug} already exists)."); return obj; } @@ -99,20 +95,30 @@ namespace Kyoo.Controllers resource.Genres = await resource.Genres .SelectAsync(x => _genres.CreateIfNotExists(x)) .ToListAsync(); + _database.AttachRange(resource.Genres); } - await resource.ExternalIDs.ForEachAsync(async id => + if (resource.ExternalIDs != null) { - id.Provider = await _providers.CreateIfNotExists(id.Provider); - id.ProviderID = id.Provider.ID; - _database.Entry(id.Provider).State = EntityState.Detached; - }); - await resource.People.ForEachAsync(async role => + foreach (MetadataID id in resource.ExternalIDs) + { + id.Provider = await _providers.CreateIfNotExists(id.Provider); + id.ProviderID = id.Provider.ID; + _database.Entry(id.Provider).State = EntityState.Detached; + } + _database.MetadataIds().AttachRange(resource.ExternalIDs); + } + + if (resource.People != null) { - role.People = await _people.CreateIfNotExists(role.People); - role.PeopleID = role.People.ID; - _database.Entry(role.People).State = EntityState.Detached; - }); + foreach (PeopleRole role in resource.People) + { + role.People = await _people.CreateIfNotExists(role.People); + role.PeopleID = role.People.ID; + _database.Entry(role.People).State = EntityState.Detached; + _database.Entry(role).State = EntityState.Added; + } + } } ///