mirror of
https://github.com/zoriya/Kyoo.git
synced 2025-06-02 21:24:20 -04:00
Implementing delete range
This commit is contained in:
parent
5944d948f1
commit
cf713cf5fa
@ -1,5 +1,6 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using JetBrains.Annotations;
|
using JetBrains.Annotations;
|
||||||
using Kyoo.Models;
|
using Kyoo.Models;
|
||||||
@ -15,9 +16,17 @@ namespace Kyoo.Controllers
|
|||||||
Task<int> Create([NotNull] T obj);
|
Task<int> Create([NotNull] T obj);
|
||||||
Task<int> CreateIfNotExists([NotNull] T obj);
|
Task<int> CreateIfNotExists([NotNull] T obj);
|
||||||
Task Edit([NotNull] T edited, bool resetOld);
|
Task Edit([NotNull] T edited, bool resetOld);
|
||||||
|
|
||||||
Task Delete(int id);
|
Task Delete(int id);
|
||||||
Task Delete(string slug);
|
Task Delete(string slug);
|
||||||
Task Delete([NotNull] T obj);
|
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>
|
public interface IShowRepository : IRepository<Show>
|
||||||
|
@ -137,5 +137,23 @@ namespace Kyoo.Controllers
|
|||||||
_database.Entry(link).State = EntityState.Deleted;
|
_database.Entry(link).State = EntityState.Deleted;
|
||||||
await _database.SaveChangesAsync();
|
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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -5,7 +5,6 @@ using System.Threading.Tasks;
|
|||||||
using Kyoo.Models;
|
using Kyoo.Models;
|
||||||
using Kyoo.Models.Exceptions;
|
using Kyoo.Models.Exceptions;
|
||||||
using Microsoft.EntityFrameworkCore;
|
using Microsoft.EntityFrameworkCore;
|
||||||
using Microsoft.EntityFrameworkCore.ChangeTracking;
|
|
||||||
|
|
||||||
namespace Kyoo.Controllers
|
namespace Kyoo.Controllers
|
||||||
{
|
{
|
||||||
@ -13,14 +12,13 @@ namespace Kyoo.Controllers
|
|||||||
{
|
{
|
||||||
private readonly DatabaseContext _database;
|
private readonly DatabaseContext _database;
|
||||||
private readonly IProviderRepository _providers;
|
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;
|
_database = database;
|
||||||
_providers = providers;
|
_providers = providers;
|
||||||
_tracks = tracks;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Dispose()
|
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)
|
public async Task Delete(int id)
|
||||||
{
|
{
|
||||||
Episode obj = await Get(id);
|
Episode obj = await Get(id);
|
||||||
@ -195,31 +210,26 @@ namespace Kyoo.Controllers
|
|||||||
if (obj.ExternalIDs != null)
|
if (obj.ExternalIDs != null)
|
||||||
foreach (MetadataID entry in obj.ExternalIDs)
|
foreach (MetadataID entry in obj.ExternalIDs)
|
||||||
_database.Entry(entry).State = EntityState.Deleted;
|
_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.
|
// 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();
|
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
|
foreach (int id in ids)
|
||||||
&& x.SeasonNumber == seasonNumber).ToListAsync();
|
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
|
foreach (string slug in slugs)
|
||||||
&& x.SeasonNumber == seasonNumber).ToListAsync();
|
await Delete(slug);
|
||||||
}
|
|
||||||
|
|
||||||
public async Task<ICollection<Episode>> GetEpisodes(int seasonID)
|
|
||||||
{
|
|
||||||
return await _database.Episodes.Where(x => x.SeasonID == seasonID).ToListAsync();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -134,5 +134,23 @@ namespace Kyoo.Controllers
|
|||||||
_database.Entry(link).State = EntityState.Deleted;
|
_database.Entry(link).State = EntityState.Deleted;
|
||||||
await _database.SaveChangesAsync();
|
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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -150,5 +150,23 @@ namespace Kyoo.Controllers
|
|||||||
_database.Entry(entry).State = EntityState.Deleted;
|
_database.Entry(entry).State = EntityState.Deleted;
|
||||||
await _database.SaveChangesAsync();
|
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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -149,5 +149,23 @@ namespace Kyoo.Controllers
|
|||||||
_database.Entry(link).State = EntityState.Deleted;
|
_database.Entry(link).State = EntityState.Deleted;
|
||||||
await _database.SaveChangesAsync();
|
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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -131,5 +131,23 @@ namespace Kyoo.Controllers
|
|||||||
// TODO handle ExternalID deletion when they refer to this providerID.
|
// TODO handle ExternalID deletion when they refer to this providerID.
|
||||||
await _database.SaveChangesAsync();
|
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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -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)
|
public async Task Delete(int id)
|
||||||
{
|
{
|
||||||
Season obj = await Get(id);
|
Season obj = await Get(id);
|
||||||
@ -172,19 +182,26 @@ namespace Kyoo.Controllers
|
|||||||
foreach (MetadataID entry in obj.ExternalIDs)
|
foreach (MetadataID entry in obj.ExternalIDs)
|
||||||
_database.Entry(entry).State = EntityState.Deleted;
|
_database.Entry(entry).State = EntityState.Deleted;
|
||||||
if (obj.Episodes != null)
|
if (obj.Episodes != null)
|
||||||
foreach (Episode episode in obj.Episodes)
|
await _episodes.DeleteRange(obj.Episodes);
|
||||||
await _episodes.Delete(episode);
|
|
||||||
await _database.SaveChangesAsync();
|
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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -162,6 +162,29 @@ namespace Kyoo.Controllers
|
|||||||
foreach (MetadataID link in obj.ExternalIDs)
|
foreach (MetadataID link in obj.ExternalIDs)
|
||||||
link.ProviderID = await _providers.CreateIfNotExists(link.Provider);
|
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)
|
public async Task Delete(int id)
|
||||||
{
|
{
|
||||||
@ -198,35 +221,28 @@ namespace Kyoo.Controllers
|
|||||||
_database.Entry(entry).State = EntityState.Deleted;
|
_database.Entry(entry).State = EntityState.Deleted;
|
||||||
|
|
||||||
if (obj.Seasons != null)
|
if (obj.Seasons != null)
|
||||||
foreach (Season season in obj.Seasons)
|
await _seasons.DeleteRange(obj.Seasons);
|
||||||
await _seasons.Delete(season);
|
|
||||||
if (obj.Episodes != null)
|
if (obj.Episodes != null)
|
||||||
foreach (Episode episode in obj.Episodes.Where(x => x.SeasonID == null))
|
await _episodes.DeleteRange(obj.Episodes);
|
||||||
await _episodes.Delete(episode);
|
|
||||||
await _database.SaveChangesAsync();
|
await _database.SaveChangesAsync();
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task AddShowLink(int showID, int? libraryID, int? collectionID)
|
public async Task DeleteRange(IEnumerable<Show> objs)
|
||||||
{
|
{
|
||||||
if (collectionID != null)
|
foreach (Show obj in objs)
|
||||||
{
|
await Delete(obj);
|
||||||
_database.CollectionLinks.AddIfNotExist(new CollectionLink { CollectionID = collectionID, ShowID = showID},
|
}
|
||||||
x => x.CollectionID == collectionID && x.ShowID == showID);
|
|
||||||
}
|
public async Task DeleteRange(IEnumerable<int> ids)
|
||||||
if (libraryID != null)
|
{
|
||||||
{
|
foreach (int id in ids)
|
||||||
_database.LibraryLinks.AddIfNotExist(new LibraryLink {LibraryID = libraryID.Value, ShowID = showID},
|
await Delete(id);
|
||||||
x => x.LibraryID == libraryID.Value && x.CollectionID == null && x.ShowID == showID);
|
}
|
||||||
}
|
|
||||||
|
public async Task DeleteRange(IEnumerable<string> slugs)
|
||||||
if (libraryID != null && collectionID != null)
|
{
|
||||||
{
|
foreach (string slug in slugs)
|
||||||
_database.LibraryLinks.AddIfNotExist(
|
await Delete(slug);
|
||||||
new LibraryLink {LibraryID = libraryID.Value, CollectionID = collectionID.Value},
|
|
||||||
x => x.LibraryID == libraryID && x.CollectionID == collectionID && x.ShowID == null);
|
|
||||||
}
|
|
||||||
|
|
||||||
await _database.SaveChangesAsync();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -133,5 +133,23 @@ namespace Kyoo.Controllers
|
|||||||
show.StudioID = null;
|
show.StudioID = null;
|
||||||
await _database.SaveChangesAsync();
|
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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -119,5 +119,23 @@ namespace Kyoo.Controllers
|
|||||||
_database.Entry(obj).State = EntityState.Deleted;
|
_database.Entry(obj).State = EntityState.Deleted;
|
||||||
await _database.SaveChangesAsync();
|
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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -46,9 +46,9 @@ namespace Kyoo
|
|||||||
services.AddDbContext<DatabaseContext>(options =>
|
services.AddDbContext<DatabaseContext>(options =>
|
||||||
{
|
{
|
||||||
options.UseLazyLoadingProxies()
|
options.UseLazyLoadingProxies()
|
||||||
.UseNpgsql(_configuration.GetConnectionString("Database"));
|
.UseNpgsql(_configuration.GetConnectionString("Database"))
|
||||||
//.EnableSensitiveDataLogging()
|
.EnableSensitiveDataLogging()
|
||||||
//.UseLoggerFactory(LoggerFactory.Create(builder => builder.AddConsole()));
|
.UseLoggerFactory(LoggerFactory.Create(builder => builder.AddConsole()));
|
||||||
}, ServiceLifetime.Transient);
|
}, ServiceLifetime.Transient);
|
||||||
|
|
||||||
services.AddDbContext<IdentityDatabase>(options =>
|
services.AddDbContext<IdentityDatabase>(options =>
|
||||||
|
@ -59,9 +59,9 @@ namespace Kyoo.Controllers
|
|||||||
using IServiceScope serviceScope = _serviceProvider.CreateScope();
|
using IServiceScope serviceScope = _serviceProvider.CreateScope();
|
||||||
await using ILibraryManager libraryManager = serviceScope.ServiceProvider.GetService<ILibraryManager>();
|
await using ILibraryManager libraryManager = serviceScope.ServiceProvider.GetService<ILibraryManager>();
|
||||||
|
|
||||||
// foreach (Show show in await libraryManager.GetShows())
|
foreach (Show show in await libraryManager.GetShows())
|
||||||
// if (!Directory.Exists(show.Path))
|
if (!Directory.Exists(show.Path))
|
||||||
// await libraryManager.DeleteShow(show);
|
await libraryManager.DeleteShow(show);
|
||||||
|
|
||||||
ICollection<Episode> episodes = await libraryManager.GetEpisodes();
|
ICollection<Episode> episodes = await libraryManager.GetEpisodes();
|
||||||
ICollection<Library> libraries = argument == null
|
ICollection<Library> libraries = argument == null
|
||||||
|
Loading…
x
Reference in New Issue
Block a user