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

View File

@ -15,18 +15,24 @@ namespace Kyoo.Controllers
private readonly IPeopleRepository _people;
private readonly IGenreRepository _genres;
private readonly IProviderRepository _providers;
private readonly ISeasonRepository _seasons;
private readonly IEpisodeRepository _episodes;
public ShowRepository(DatabaseContext database,
IStudioRepository studios,
IPeopleRepository people,
IGenreRepository genres,
IProviderRepository providers)
IProviderRepository providers,
ISeasonRepository seasons,
IEpisodeRepository episodes)
{
_database = database;
_studios = studios;
_people = people;
_genres = genres;
_providers = providers;
_seasons = seasons;
_episodes = episodes;
}
public void Dispose()
@ -40,19 +46,19 @@ namespace Kyoo.Controllers
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)
@ -145,23 +151,17 @@ namespace Kyoo.Controllers
obj.StudioID = await _studios.CreateIfNotExists(obj.Studio);
if (obj.GenreLinks != null)
{
foreach (GenreLink link in obj.GenreLinks)
link.GenreID = await _genres.CreateIfNotExists(link.Genre);
}
if (obj.People != null)
{
foreach (PeopleLink link in obj.People)
link.PeopleID = await _people.CreateIfNotExists(link.People);
}
if (obj.ExternalIDs != null)
{
foreach (MetadataID link in obj.ExternalIDs)
link.ProviderID = await _providers.CreateIfNotExists(link.Provider);
}
}
public async Task Delete(Show obj)
{
@ -184,6 +184,13 @@ namespace Kyoo.Controllers
if (obj.LibraryLinks != null)
foreach (LibraryLink entry in obj.LibraryLinks)
_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();
}

View File

@ -115,6 +115,10 @@ namespace Kyoo.Controllers
throw new ArgumentNullException(nameof(obj));
_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();
}
}