diff --git a/Kyoo.Common/Controllers/IRepository.cs b/Kyoo.Common/Controllers/IRepository.cs index b0b42cc6..5beee98b 100644 --- a/Kyoo.Common/Controllers/IRepository.cs +++ b/Kyoo.Common/Controllers/IRepository.cs @@ -98,6 +98,7 @@ namespace Kyoo.Controllers Task DeleteRange(IEnumerable ids); Task DeleteRange(params string[] slugs) => DeleteRange(slugs.AsEnumerable()); Task DeleteRange(IEnumerable slugs); + Task DeleteRange([NotNull] Expression> where); } public interface IShowRepository : IRepository diff --git a/Kyoo.CommonAPI/CrudApi.cs b/Kyoo.CommonAPI/CrudApi.cs index 4d674cc2..0bbf7733 100644 --- a/Kyoo.CommonAPI/CrudApi.cs +++ b/Kyoo.CommonAPI/CrudApi.cs @@ -182,5 +182,20 @@ namespace Kyoo.CommonApi return Ok(); } + + [Authorize(Policy = "Write")] + public virtual async Task Delete(Dictionary where) + { + try + { + await _repository.DeleteRange(ApiHelper.ParseWhere(where)); + } + catch (ItemNotFound) + { + return NotFound(); + } + + return Ok(); + } } } \ No newline at end of file diff --git a/Kyoo.CommonAPI/LocalRepository.cs b/Kyoo.CommonAPI/LocalRepository.cs index 660ef8af..5da8fcc0 100644 --- a/Kyoo.CommonAPI/LocalRepository.cs +++ b/Kyoo.CommonAPI/LocalRepository.cs @@ -218,7 +218,7 @@ namespace Kyoo.Controllers } public abstract Task Delete(T obj); - + public virtual async Task DeleteRange(IEnumerable objs) { foreach (T obj in objs) @@ -236,5 +236,11 @@ namespace Kyoo.Controllers foreach (string slug in slugs) await Delete(slug); } + + public async Task DeleteRange(Expression> where) + { + ICollection resources = await GetAll(where); + await DeleteRange(resources); + } } } \ No newline at end of file diff --git a/Kyoo/Controllers/Repositories/EpisodeRepository.cs b/Kyoo/Controllers/Repositories/EpisodeRepository.cs index c6b2e307..34c689dc 100644 --- a/Kyoo/Controllers/Repositories/EpisodeRepository.cs +++ b/Kyoo/Controllers/Repositories/EpisodeRepository.cs @@ -165,8 +165,7 @@ namespace Kyoo.Controllers if (changed.Tracks != null || resetOld) { - ICollection oldTracks = await _tracks.GetAll(x => x.EpisodeID == resource.ID); - await _tracks.DeleteRange(oldTracks); + await _tracks.DeleteRange(x => x.EpisodeID == resource.ID); resource.Tracks = changed.Tracks; await ValidateTracks(resource); } @@ -197,11 +196,13 @@ namespace Kyoo.Controllers protected override async Task Validate(Episode resource) { await base.Validate(resource); - resource.ExternalIDs = resource.ExternalIDs?.Select(x => + resource.ExternalIDs = await resource.ExternalIDs.SelectAsync(async x => { - x.Provider = null; + x.Provider = await _providers.CreateIfNotExists(x.Provider, true); + x.ProviderID = x.Provider.ID; + _database.Entry(x.Provider).State = EntityState.Detached; return x; - }).ToList(); + }).ToListAsync(); } public async Task Delete(string showSlug, int seasonNumber, int episodeNumber) diff --git a/Kyoo/Controllers/Repositories/PeopleRepository.cs b/Kyoo/Controllers/Repositories/PeopleRepository.cs index 04570182..9097bea8 100644 --- a/Kyoo/Controllers/Repositories/PeopleRepository.cs +++ b/Kyoo/Controllers/Repositories/PeopleRepository.cs @@ -73,14 +73,15 @@ namespace Kyoo.Controllers await base.Validate(resource); await resource.ExternalIDs.ForEachAsync(async id => { - id.ProviderID = (await _providers.CreateIfNotExists(id.Provider, true)).ID; - id.Provider = null; - + id.Provider = await _providers.CreateIfNotExists(id.Provider, true); + id.ProviderID = id.Provider.ID; + _database.Entry(id.Provider).State = EntityState.Detached; }); await resource.Roles.ForEachAsync(async role => { - role.ShowID = (await _shows.Value.CreateIfNotExists(role.Show, true)).ID; - role.Show = null; + role.Show = await _shows.Value.CreateIfNotExists(role.Show, true); + role.ShowID = role.Show.ID; + _database.Entry(role.Show).State = EntityState.Detached; }); } diff --git a/Kyoo/Controllers/Repositories/SeasonRepository.cs b/Kyoo/Controllers/Repositories/SeasonRepository.cs index d1bc271f..29c3e400 100644 --- a/Kyoo/Controllers/Repositories/SeasonRepository.cs +++ b/Kyoo/Controllers/Repositories/SeasonRepository.cs @@ -140,8 +140,9 @@ namespace Kyoo.Controllers await base.Validate(resource); await resource.ExternalIDs.ForEachAsync(async id => { - id.ProviderID = (await _providers.CreateIfNotExists(id.Provider, true)).ID; - id.Provider = null; + id.Provider = await _providers.CreateIfNotExists(id.Provider, true); + id.ProviderID = id.Provider.ID; + _database.Entry(id.Provider).State = EntityState.Detached; }); } diff --git a/Kyoo/Controllers/Repositories/ShowRepository.cs b/Kyoo/Controllers/Repositories/ShowRepository.cs index 1fdc8c6a..be04ffc9 100644 --- a/Kyoo/Controllers/Repositories/ShowRepository.cs +++ b/Kyoo/Controllers/Repositories/ShowRepository.cs @@ -88,7 +88,6 @@ namespace Kyoo.Controllers { await base.Create(obj); _database.Entry(obj).State = EntityState.Added; - obj.GenreLinks = obj.Genres?.Select(x => Link.Create(obj, x)).ToArray(); obj.GenreLinks.ForEach(x => _database.Entry(x).State = EntityState.Added); obj.People.ForEach(x => _database.Entry(x).State = EntityState.Added); obj.ExternalIDs.ForEach(x => _database.Entry(x).State = EntityState.Added); @@ -101,18 +100,23 @@ namespace Kyoo.Controllers await base.Validate(resource); if (resource.Studio != null) resource.Studio = await _studios.CreateIfNotExists(resource.Studio, true); - resource.GenreLinks = await resource.Genres - .SelectAsync(async x => Link.UCreate(resource, await _genres.CreateIfNotExists(x, true))) + resource.Genres = await resource.Genres + .SelectAsync(x => _genres.CreateIfNotExists(x, true)) .ToListAsync(); + resource.GenreLinks = resource.Genres? + .Select(x => Link.UCreate(resource, x)) + .ToList(); await resource.ExternalIDs.ForEachAsync(async id => { - id.ProviderID = (await _providers.CreateIfNotExists(id.Provider, true)).ID; - id.Provider = null; + id.Provider = await _providers.CreateIfNotExists(id.Provider, true); + id.ProviderID = id.Provider.ID; + _database.Entry(id.Provider).State = EntityState.Detached; }); await resource.People.ForEachAsync(async role => { - role.PeopleID = (await _people.CreateIfNotExists(role.People, true)).ID; - role.People = null; + role.People = await _people.CreateIfNotExists(role.People, true); + role.PeopleID = role.People.ID; + _database.Entry(role.People).State = EntityState.Detached; }); } @@ -126,7 +130,7 @@ namespace Kyoo.Controllers if (changed.Genres != null || resetOld) { await Database.Entry(resource).Collection(x => x.GenreLinks).LoadAsync(); - resource.GenreLinks = changed.GenreLinks; + resource.GenreLinks = changed.Genres?.Select(x => Link.UCreate(resource, x)).ToList(); } if (changed.People != null || resetOld)