Handling related entities for seasons, shows & studios

This commit is contained in:
Zoe Roux 2020-06-20 18:08:19 +02:00
parent 04fae1fc65
commit 48fc4fd249
3 changed files with 30 additions and 14 deletions

View File

@ -12,12 +12,14 @@ namespace Kyoo.Controllers
{ {
private readonly DatabaseContext _database; private readonly DatabaseContext _database;
private readonly IProviderRepository _providers; private readonly IProviderRepository _providers;
private readonly IEpisodeRepository _episodes;
public SeasonRepository(DatabaseContext database, IProviderRepository providers) public SeasonRepository(DatabaseContext database, IProviderRepository providers, IEpisodeRepository episodes)
{ {
_database = database; _database = database;
_providers = providers; _providers = providers;
_episodes = episodes;
} }
public void Dispose() public void Dispose()
@ -151,6 +153,9 @@ 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;
if (obj.Episodes != null)
foreach (Episode episode in obj.Episodes)
await _episodes.Delete(episode);
await _database.SaveChangesAsync(); await _database.SaveChangesAsync();
} }

View File

@ -15,18 +15,24 @@ namespace Kyoo.Controllers
private readonly IPeopleRepository _people; private readonly IPeopleRepository _people;
private readonly IGenreRepository _genres; private readonly IGenreRepository _genres;
private readonly IProviderRepository _providers; private readonly IProviderRepository _providers;
private readonly ISeasonRepository _seasons;
private readonly IEpisodeRepository _episodes;
public ShowRepository(DatabaseContext database, public ShowRepository(DatabaseContext database,
IStudioRepository studios, IStudioRepository studios,
IPeopleRepository people, IPeopleRepository people,
IGenreRepository genres, IGenreRepository genres,
IProviderRepository providers) IProviderRepository providers,
ISeasonRepository seasons,
IEpisodeRepository episodes)
{ {
_database = database; _database = database;
_studios = studios; _studios = studios;
_people = people; _people = people;
_genres = genres; _genres = genres;
_providers = providers; _providers = providers;
_seasons = seasons;
_episodes = episodes;
} }
public void Dispose() public void Dispose()
@ -40,19 +46,19 @@ namespace Kyoo.Controllers
await Task.WhenAll(_database.DisposeAsync().AsTask(), _studios.DisposeAsync().AsTask()); await Task.WhenAll(_database.DisposeAsync().AsTask(), _studios.DisposeAsync().AsTask());
} }
public async Task<Show> Get(int id) public Task<Show> Get(int id)
{ {
return await _database.Shows.FirstOrDefaultAsync(x => x.ID == id); return _database.Shows.FirstOrDefaultAsync(x => x.ID == id);
} }
public async Task<Show> Get(string slug) public Task<Show> Get(string slug)
{ {
return await _database.Shows.FirstOrDefaultAsync(x => x.Slug == slug); return _database.Shows.FirstOrDefaultAsync(x => x.Slug == slug);
} }
public async Task<Show> GetByPath(string path) public Task<Show> GetByPath(string path)
{ {
return await _database.Shows.FirstOrDefaultAsync(x => x.Path == path); return _database.Shows.FirstOrDefaultAsync(x => x.Path == path);
} }
public async Task<ICollection<Show>> Search(string query) public async Task<ICollection<Show>> Search(string query)
@ -145,22 +151,16 @@ namespace Kyoo.Controllers
obj.StudioID = await _studios.CreateIfNotExists(obj.Studio); obj.StudioID = await _studios.CreateIfNotExists(obj.Studio);
if (obj.GenreLinks != null) if (obj.GenreLinks != null)
{
foreach (GenreLink link in obj.GenreLinks) foreach (GenreLink link in obj.GenreLinks)
link.GenreID = await _genres.CreateIfNotExists(link.Genre); link.GenreID = await _genres.CreateIfNotExists(link.Genre);
}
if (obj.People != null) if (obj.People != null)
{
foreach (PeopleLink link in obj.People) foreach (PeopleLink link in obj.People)
link.PeopleID = await _people.CreateIfNotExists(link.People); link.PeopleID = await _people.CreateIfNotExists(link.People);
}
if (obj.ExternalIDs != null) if (obj.ExternalIDs != null)
{
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 Delete(Show obj) public async Task Delete(Show obj)
@ -184,6 +184,13 @@ namespace Kyoo.Controllers
if (obj.LibraryLinks != null) if (obj.LibraryLinks != null)
foreach (LibraryLink entry in obj.LibraryLinks) foreach (LibraryLink entry in obj.LibraryLinks)
_database.Entry(entry).State = EntityState.Deleted; _database.Entry(entry).State = EntityState.Deleted;
if (obj.Seasons != null)
foreach (Season season in obj.Seasons)
await _seasons.Delete(season);
if (obj.Episodes != null)
foreach (Episode episode in obj.Episodes.Where(x => x.SeasonID == null))
await _episodes.Delete(episode);
await _database.SaveChangesAsync(); await _database.SaveChangesAsync();
} }

View File

@ -115,6 +115,10 @@ namespace Kyoo.Controllers
throw new ArgumentNullException(nameof(obj)); throw new ArgumentNullException(nameof(obj));
_database.Entry(obj).State = EntityState.Deleted; _database.Entry(obj).State = EntityState.Deleted;
// Using Dotnet-EF change discovery service to remove references to this studio on shows.
foreach (Show show in obj.Shows)
show.StudioID = null;
await _database.SaveChangesAsync(); await _database.SaveChangesAsync();
} }
} }