Implementing delete range

This commit is contained in:
Zoe Roux 2020-06-22 04:24:57 +02:00
parent 5944d948f1
commit cf713cf5fa
13 changed files with 237 additions and 59 deletions

View File

@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using JetBrains.Annotations;
using Kyoo.Models;
@ -15,9 +16,17 @@ namespace Kyoo.Controllers
Task<int> Create([NotNull] T obj);
Task<int> CreateIfNotExists([NotNull] T obj);
Task Edit([NotNull] T edited, bool resetOld);
Task Delete(int id);
Task Delete(string slug);
Task Delete([NotNull] T obj);
Task DeleteRange(params T[] objs) => DeleteRange(objs.AsEnumerable());
Task DeleteRange(IEnumerable<T> objs);
Task DeleteRange(params int[] ids) => DeleteRange(ids.AsEnumerable());
Task DeleteRange(IEnumerable<int> ids);
Task DeleteRange(params string[] slugs) => DeleteRange(slugs.AsEnumerable());
Task DeleteRange(IEnumerable<string> slugs);
}
public interface IShowRepository : IRepository<Show>

View File

@ -137,5 +137,23 @@ namespace Kyoo.Controllers
_database.Entry(link).State = EntityState.Deleted;
await _database.SaveChangesAsync();
}
public async Task DeleteRange(IEnumerable<Collection> objs)
{
foreach (Collection obj in objs)
await Delete(obj);
}
public async Task DeleteRange(IEnumerable<int> ids)
{
foreach (int id in ids)
await Delete(id);
}
public async Task DeleteRange(IEnumerable<string> slugs)
{
foreach (string slug in slugs)
await Delete(slug);
}
}
}

View File

@ -5,7 +5,6 @@ using System.Threading.Tasks;
using Kyoo.Models;
using Kyoo.Models.Exceptions;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.ChangeTracking;
namespace Kyoo.Controllers
{
@ -13,14 +12,13 @@ namespace Kyoo.Controllers
{
private readonly DatabaseContext _database;
private readonly IProviderRepository _providers;
private readonly ITrackRepository _tracks;
// private readonly ITrackRepository _tracks;
public EpisodeRepository(DatabaseContext database, IProviderRepository providers, ITrackRepository tracks)
public EpisodeRepository(DatabaseContext database, IProviderRepository providers)
{
_database = database;
_providers = providers;
_tracks = tracks;
}
public void Dispose()
@ -168,6 +166,23 @@ namespace Kyoo.Controllers
}
}
public async Task<ICollection<Episode>> GetEpisodes(int showID, int seasonNumber)
{
return await _database.Episodes.Where(x => x.ShowID == showID
&& x.SeasonNumber == seasonNumber).ToListAsync();
}
public async Task<ICollection<Episode>> GetEpisodes(string showSlug, int seasonNumber)
{
return await _database.Episodes.Where(x => x.Show.Slug == showSlug
&& x.SeasonNumber == seasonNumber).ToListAsync();
}
public async Task<ICollection<Episode>> GetEpisodes(int seasonID)
{
return await _database.Episodes.Where(x => x.SeasonID == seasonID).ToListAsync();
}
public async Task Delete(int id)
{
Episode obj = await Get(id);
@ -195,31 +210,26 @@ namespace Kyoo.Controllers
if (obj.ExternalIDs != null)
foreach (MetadataID entry in obj.ExternalIDs)
_database.Entry(entry).State = EntityState.Deleted;
// Since Tracks & Episodes are on the same database and handled by dotnet-ef, we can't use the repository to delete them.
/*if (obj.Tracks != null)
* foreach (Track entry in obj.Tracks)
* await _tracks.Delete(entry);
*/
await _database.SaveChangesAsync();
}
public async Task DeleteRange(IEnumerable<Episode> objs)
{
foreach (Episode obj in objs)
await Delete(obj);
}
public async Task<ICollection<Episode>> GetEpisodes(int showID, int seasonNumber)
public async Task DeleteRange(IEnumerable<int> ids)
{
return await _database.Episodes.Where(x => x.ShowID == showID
&& x.SeasonNumber == seasonNumber).ToListAsync();
foreach (int id in ids)
await Delete(id);
}
public async Task<ICollection<Episode>> GetEpisodes(string showSlug, int seasonNumber)
public async Task DeleteRange(IEnumerable<string> slugs)
{
return await _database.Episodes.Where(x => x.Show.Slug == showSlug
&& x.SeasonNumber == seasonNumber).ToListAsync();
}
public async Task<ICollection<Episode>> GetEpisodes(int seasonID)
{
return await _database.Episodes.Where(x => x.SeasonID == seasonID).ToListAsync();
foreach (string slug in slugs)
await Delete(slug);
}
}
}

View File

@ -134,5 +134,23 @@ namespace Kyoo.Controllers
_database.Entry(link).State = EntityState.Deleted;
await _database.SaveChangesAsync();
}
public async Task DeleteRange(IEnumerable<Genre> objs)
{
foreach (Genre obj in objs)
await Delete(obj);
}
public async Task DeleteRange(IEnumerable<int> ids)
{
foreach (int id in ids)
await Delete(id);
}
public async Task DeleteRange(IEnumerable<string> slugs)
{
foreach (string slug in slugs)
await Delete(slug);
}
}
}

View File

@ -150,5 +150,23 @@ namespace Kyoo.Controllers
_database.Entry(entry).State = EntityState.Deleted;
await _database.SaveChangesAsync();
}
public async Task DeleteRange(IEnumerable<Library> objs)
{
foreach (Library obj in objs)
await Delete(obj);
}
public async Task DeleteRange(IEnumerable<int> ids)
{
foreach (int id in ids)
await Delete(id);
}
public async Task DeleteRange(IEnumerable<string> slugs)
{
foreach (string slug in slugs)
await Delete(slug);
}
}
}

View File

@ -149,5 +149,23 @@ namespace Kyoo.Controllers
_database.Entry(link).State = EntityState.Deleted;
await _database.SaveChangesAsync();
}
public async Task DeleteRange(IEnumerable<People> objs)
{
foreach (People obj in objs)
await Delete(obj);
}
public async Task DeleteRange(IEnumerable<int> ids)
{
foreach (int id in ids)
await Delete(id);
}
public async Task DeleteRange(IEnumerable<string> slugs)
{
foreach (string slug in slugs)
await Delete(slug);
}
}
}

View File

@ -131,5 +131,23 @@ namespace Kyoo.Controllers
// TODO handle ExternalID deletion when they refer to this providerID.
await _database.SaveChangesAsync();
}
public async Task DeleteRange(IEnumerable<ProviderID> objs)
{
foreach (ProviderID obj in objs)
await Delete(obj);
}
public async Task DeleteRange(IEnumerable<int> ids)
{
foreach (int id in ids)
await Delete(id);
}
public async Task DeleteRange(IEnumerable<string> slugs)
{
foreach (string slug in slugs)
await Delete(slug);
}
}
}

View File

@ -144,6 +144,16 @@ namespace Kyoo.Controllers
}
}
public async Task<ICollection<Season>> GetSeasons(int showID)
{
return await _database.Seasons.Where(x => x.ShowID == showID).ToListAsync();
}
public async Task<ICollection<Season>> GetSeasons(string showSlug)
{
return await _database.Seasons.Where(x => x.Show.Slug == showSlug).ToListAsync();
}
public async Task Delete(int id)
{
Season obj = await Get(id);
@ -172,19 +182,26 @@ namespace Kyoo.Controllers
foreach (MetadataID entry in obj.ExternalIDs)
_database.Entry(entry).State = EntityState.Deleted;
if (obj.Episodes != null)
foreach (Episode episode in obj.Episodes)
await _episodes.Delete(episode);
await _episodes.DeleteRange(obj.Episodes);
await _database.SaveChangesAsync();
}
public async Task<ICollection<Season>> GetSeasons(int showID)
public async Task DeleteRange(IEnumerable<Season> objs)
{
return await _database.Seasons.Where(x => x.ShowID == showID).ToListAsync();
foreach (Season obj in objs)
await Delete(obj);
}
public async Task<ICollection<Season>> GetSeasons(string showSlug)
public async Task DeleteRange(IEnumerable<int> ids)
{
return await _database.Seasons.Where(x => x.Show.Slug == showSlug).ToListAsync();
foreach (int id in ids)
await Delete(id);
}
public async Task DeleteRange(IEnumerable<string> slugs)
{
foreach (string slug in slugs)
await Delete(slug);
}
}
}

View File

@ -162,6 +162,29 @@ namespace Kyoo.Controllers
foreach (MetadataID link in obj.ExternalIDs)
link.ProviderID = await _providers.CreateIfNotExists(link.Provider);
}
public async Task AddShowLink(int showID, int? libraryID, int? collectionID)
{
if (collectionID != null)
{
_database.CollectionLinks.AddIfNotExist(new CollectionLink { CollectionID = collectionID, ShowID = showID},
x => x.CollectionID == collectionID && x.ShowID == showID);
}
if (libraryID != null)
{
_database.LibraryLinks.AddIfNotExist(new LibraryLink {LibraryID = libraryID.Value, ShowID = showID},
x => x.LibraryID == libraryID.Value && x.CollectionID == null && x.ShowID == showID);
}
if (libraryID != null && collectionID != null)
{
_database.LibraryLinks.AddIfNotExist(
new LibraryLink {LibraryID = libraryID.Value, CollectionID = collectionID.Value},
x => x.LibraryID == libraryID && x.CollectionID == collectionID && x.ShowID == null);
}
await _database.SaveChangesAsync();
}
public async Task Delete(int id)
{
@ -198,35 +221,28 @@ namespace Kyoo.Controllers
_database.Entry(entry).State = EntityState.Deleted;
if (obj.Seasons != null)
foreach (Season season in obj.Seasons)
await _seasons.Delete(season);
await _seasons.DeleteRange(obj.Seasons);
if (obj.Episodes != null)
foreach (Episode episode in obj.Episodes.Where(x => x.SeasonID == null))
await _episodes.Delete(episode);
await _episodes.DeleteRange(obj.Episodes);
await _database.SaveChangesAsync();
}
public async Task AddShowLink(int showID, int? libraryID, int? collectionID)
public async Task DeleteRange(IEnumerable<Show> objs)
{
if (collectionID != null)
{
_database.CollectionLinks.AddIfNotExist(new CollectionLink { CollectionID = collectionID, ShowID = showID},
x => x.CollectionID == collectionID && x.ShowID == showID);
}
if (libraryID != null)
{
_database.LibraryLinks.AddIfNotExist(new LibraryLink {LibraryID = libraryID.Value, ShowID = showID},
x => x.LibraryID == libraryID.Value && x.CollectionID == null && x.ShowID == showID);
}
if (libraryID != null && collectionID != null)
{
_database.LibraryLinks.AddIfNotExist(
new LibraryLink {LibraryID = libraryID.Value, CollectionID = collectionID.Value},
x => x.LibraryID == libraryID && x.CollectionID == collectionID && x.ShowID == null);
}
await _database.SaveChangesAsync();
foreach (Show obj in objs)
await Delete(obj);
}
public async Task DeleteRange(IEnumerable<int> ids)
{
foreach (int id in ids)
await Delete(id);
}
public async Task DeleteRange(IEnumerable<string> slugs)
{
foreach (string slug in slugs)
await Delete(slug);
}
}
}

View File

@ -133,5 +133,23 @@ namespace Kyoo.Controllers
show.StudioID = null;
await _database.SaveChangesAsync();
}
public async Task DeleteRange(IEnumerable<Studio> objs)
{
foreach (Studio obj in objs)
await Delete(obj);
}
public async Task DeleteRange(IEnumerable<int> ids)
{
foreach (int id in ids)
await Delete(id);
}
public async Task DeleteRange(IEnumerable<string> slugs)
{
foreach (string slug in slugs)
await Delete(slug);
}
}
}

View File

@ -119,5 +119,23 @@ namespace Kyoo.Controllers
_database.Entry(obj).State = EntityState.Deleted;
await _database.SaveChangesAsync();
}
public async Task DeleteRange(IEnumerable<Track> objs)
{
foreach (Track obj in objs)
await Delete(obj);
}
public async Task DeleteRange(IEnumerable<int> ids)
{
foreach (int id in ids)
await Delete(id);
}
public async Task DeleteRange(IEnumerable<string> slugs)
{
foreach (string slug in slugs)
await Delete(slug);
}
}
}

View File

@ -46,9 +46,9 @@ namespace Kyoo
services.AddDbContext<DatabaseContext>(options =>
{
options.UseLazyLoadingProxies()
.UseNpgsql(_configuration.GetConnectionString("Database"));
//.EnableSensitiveDataLogging()
//.UseLoggerFactory(LoggerFactory.Create(builder => builder.AddConsole()));
.UseNpgsql(_configuration.GetConnectionString("Database"))
.EnableSensitiveDataLogging()
.UseLoggerFactory(LoggerFactory.Create(builder => builder.AddConsole()));
}, ServiceLifetime.Transient);
services.AddDbContext<IdentityDatabase>(options =>

View File

@ -59,9 +59,9 @@ namespace Kyoo.Controllers
using IServiceScope serviceScope = _serviceProvider.CreateScope();
await using ILibraryManager libraryManager = serviceScope.ServiceProvider.GetService<ILibraryManager>();
// foreach (Show show in await libraryManager.GetShows())
// if (!Directory.Exists(show.Path))
// await libraryManager.DeleteShow(show);
foreach (Show show in await libraryManager.GetShows())
if (!Directory.Exists(show.Path))
await libraryManager.DeleteShow(show);
ICollection<Episode> episodes = await libraryManager.GetEpisodes();
ICollection<Library> libraries = argument == null