Adding a delete range and fixing show's editing

This commit is contained in:
Zoe Roux 2021-03-17 22:04:28 +01:00
parent 457dcd0db2
commit aac1975a75
7 changed files with 50 additions and 21 deletions

View File

@ -98,6 +98,7 @@ namespace Kyoo.Controllers
Task DeleteRange(IEnumerable<int> ids); Task DeleteRange(IEnumerable<int> ids);
Task DeleteRange(params string[] slugs) => DeleteRange(slugs.AsEnumerable()); Task DeleteRange(params string[] slugs) => DeleteRange(slugs.AsEnumerable());
Task DeleteRange(IEnumerable<string> slugs); Task DeleteRange(IEnumerable<string> slugs);
Task DeleteRange([NotNull] Expression<Func<T, bool>> where);
} }
public interface IShowRepository : IRepository<Show> public interface IShowRepository : IRepository<Show>

View File

@ -182,5 +182,20 @@ namespace Kyoo.CommonApi
return Ok(); return Ok();
} }
[Authorize(Policy = "Write")]
public virtual async Task<IActionResult> Delete(Dictionary<string, string> where)
{
try
{
await _repository.DeleteRange(ApiHelper.ParseWhere<T>(where));
}
catch (ItemNotFound)
{
return NotFound();
}
return Ok();
}
} }
} }

View File

@ -218,7 +218,7 @@ namespace Kyoo.Controllers
} }
public abstract Task Delete(T obj); public abstract Task Delete(T obj);
public virtual async Task DeleteRange(IEnumerable<T> objs) public virtual async Task DeleteRange(IEnumerable<T> objs)
{ {
foreach (T obj in objs) foreach (T obj in objs)
@ -236,5 +236,11 @@ namespace Kyoo.Controllers
foreach (string slug in slugs) foreach (string slug in slugs)
await Delete(slug); await Delete(slug);
} }
public async Task DeleteRange(Expression<Func<T, bool>> where)
{
ICollection<T> resources = await GetAll(where);
await DeleteRange(resources);
}
} }
} }

View File

@ -165,8 +165,7 @@ namespace Kyoo.Controllers
if (changed.Tracks != null || resetOld) if (changed.Tracks != null || resetOld)
{ {
ICollection<Track> oldTracks = await _tracks.GetAll(x => x.EpisodeID == resource.ID); await _tracks.DeleteRange(x => x.EpisodeID == resource.ID);
await _tracks.DeleteRange(oldTracks);
resource.Tracks = changed.Tracks; resource.Tracks = changed.Tracks;
await ValidateTracks(resource); await ValidateTracks(resource);
} }
@ -197,11 +196,13 @@ namespace Kyoo.Controllers
protected override async Task Validate(Episode resource) protected override async Task Validate(Episode resource)
{ {
await base.Validate(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; return x;
}).ToList(); }).ToListAsync();
} }
public async Task Delete(string showSlug, int seasonNumber, int episodeNumber) public async Task Delete(string showSlug, int seasonNumber, int episodeNumber)

View File

@ -73,14 +73,15 @@ namespace Kyoo.Controllers
await base.Validate(resource); await base.Validate(resource);
await resource.ExternalIDs.ForEachAsync(async id => await resource.ExternalIDs.ForEachAsync(async id =>
{ {
id.ProviderID = (await _providers.CreateIfNotExists(id.Provider, true)).ID; id.Provider = await _providers.CreateIfNotExists(id.Provider, true);
id.Provider = null; id.ProviderID = id.Provider.ID;
_database.Entry(id.Provider).State = EntityState.Detached;
}); });
await resource.Roles.ForEachAsync(async role => await resource.Roles.ForEachAsync(async role =>
{ {
role.ShowID = (await _shows.Value.CreateIfNotExists(role.Show, true)).ID; role.Show = await _shows.Value.CreateIfNotExists(role.Show, true);
role.Show = null; role.ShowID = role.Show.ID;
_database.Entry(role.Show).State = EntityState.Detached;
}); });
} }

View File

@ -140,8 +140,9 @@ namespace Kyoo.Controllers
await base.Validate(resource); await base.Validate(resource);
await resource.ExternalIDs.ForEachAsync(async id => await resource.ExternalIDs.ForEachAsync(async id =>
{ {
id.ProviderID = (await _providers.CreateIfNotExists(id.Provider, true)).ID; id.Provider = await _providers.CreateIfNotExists(id.Provider, true);
id.Provider = null; id.ProviderID = id.Provider.ID;
_database.Entry(id.Provider).State = EntityState.Detached;
}); });
} }

View File

@ -88,7 +88,6 @@ namespace Kyoo.Controllers
{ {
await base.Create(obj); await base.Create(obj);
_database.Entry(obj).State = EntityState.Added; _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.GenreLinks.ForEach(x => _database.Entry(x).State = EntityState.Added);
obj.People.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); obj.ExternalIDs.ForEach(x => _database.Entry(x).State = EntityState.Added);
@ -101,18 +100,23 @@ namespace Kyoo.Controllers
await base.Validate(resource); await base.Validate(resource);
if (resource.Studio != null) if (resource.Studio != null)
resource.Studio = await _studios.CreateIfNotExists(resource.Studio, true); resource.Studio = await _studios.CreateIfNotExists(resource.Studio, true);
resource.GenreLinks = await resource.Genres resource.Genres = await resource.Genres
.SelectAsync(async x => Link.UCreate(resource, await _genres.CreateIfNotExists(x, true))) .SelectAsync(x => _genres.CreateIfNotExists(x, true))
.ToListAsync(); .ToListAsync();
resource.GenreLinks = resource.Genres?
.Select(x => Link.UCreate(resource, x))
.ToList();
await resource.ExternalIDs.ForEachAsync(async id => await resource.ExternalIDs.ForEachAsync(async id =>
{ {
id.ProviderID = (await _providers.CreateIfNotExists(id.Provider, true)).ID; id.Provider = await _providers.CreateIfNotExists(id.Provider, true);
id.Provider = null; id.ProviderID = id.Provider.ID;
_database.Entry(id.Provider).State = EntityState.Detached;
}); });
await resource.People.ForEachAsync(async role => await resource.People.ForEachAsync(async role =>
{ {
role.PeopleID = (await _people.CreateIfNotExists(role.People, true)).ID; role.People = await _people.CreateIfNotExists(role.People, true);
role.People = null; role.PeopleID = role.People.ID;
_database.Entry(role.People).State = EntityState.Detached;
}); });
} }
@ -126,7 +130,7 @@ namespace Kyoo.Controllers
if (changed.Genres != null || resetOld) if (changed.Genres != null || resetOld)
{ {
await Database.Entry(resource).Collection(x => x.GenreLinks).LoadAsync(); 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) if (changed.People != null || resetOld)