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(params string[] slugs) => DeleteRange(slugs.AsEnumerable());
Task DeleteRange(IEnumerable<string> slugs);
Task DeleteRange([NotNull] Expression<Func<T, bool>> where);
}
public interface IShowRepository : IRepository<Show>

View File

@ -182,5 +182,20 @@ namespace Kyoo.CommonApi
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 virtual async Task DeleteRange(IEnumerable<T> 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<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)
{
ICollection<Track> 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)

View File

@ -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;
});
}

View File

@ -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;
});
}

View File

@ -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)