diff --git a/Kyoo.Common/Controllers/ILibraryManager.cs b/Kyoo.Common/Controllers/ILibraryManager.cs index c8c00a82..260b0ea6 100644 --- a/Kyoo.Common/Controllers/ILibraryManager.cs +++ b/Kyoo.Common/Controllers/ILibraryManager.cs @@ -55,6 +55,7 @@ namespace Kyoo.Controllers //Register values long RegisterCollection(Collection collection); long RegisterShow(Show show); + long EditShow(Show show); long RegisterMovie(Episode movie); long RegisterSeason(Season season); long RegisterEpisode(Episode episode); diff --git a/Kyoo.Common/Models/Exceptions/ItemNotFound.cs b/Kyoo.Common/Models/Exceptions/ItemNotFound.cs new file mode 100644 index 00000000..c72427c6 --- /dev/null +++ b/Kyoo.Common/Models/Exceptions/ItemNotFound.cs @@ -0,0 +1,14 @@ +using System; + +namespace Kyoo.Models.Exceptions +{ + public class ItemNotFound : Exception + { + public override string Message { get; } + + public ItemNotFound(string message) + { + Message = message; + } + } +} \ No newline at end of file diff --git a/Kyoo.Common/Models/Genre.cs b/Kyoo.Common/Models/Genre.cs index 1c681fd5..333fa900 100644 --- a/Kyoo.Common/Models/Genre.cs +++ b/Kyoo.Common/Models/Genre.cs @@ -11,6 +11,8 @@ namespace Kyoo.Models // public IEnumerable Shows { get; set; } + public Genre() {} + public Genre(string name) { Slug = Utility.ToSlug(name); diff --git a/Kyoo.Common/Models/Show.cs b/Kyoo.Common/Models/Show.cs index a580a259..467cd04b 100644 --- a/Kyoo.Common/Models/Show.cs +++ b/Kyoo.Common/Models/Show.cs @@ -31,7 +31,7 @@ namespace Kyoo.Models public bool IsCollection; - [JsonIgnore] public virtual IEnumerable Genres + public virtual IEnumerable Genres { get { return GenreLinks?.Select(x => x.Genre).OrderBy(x => x.Name); } set { GenreLinks = value?.Select(x => new GenreLink(this, x)).ToList(); } diff --git a/Kyoo/Controllers/LibraryManager.cs b/Kyoo/Controllers/LibraryManager.cs index 6f22cdab..7a6dbe81 100644 --- a/Kyoo/Controllers/LibraryManager.cs +++ b/Kyoo/Controllers/LibraryManager.cs @@ -1,7 +1,10 @@ -using Kyoo.Models; +using System; +using Kyoo.Models; using Kyoo.Models.Watch; using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; using System.Linq; +using Kyoo.Models.Exceptions; using Microsoft.EntityFrameworkCore; namespace Kyoo.Controllers @@ -347,29 +350,70 @@ namespace Kyoo.Controllers { if (show == null) return 0; - if (!_database.Entry(show).IsKeySet) _database.Shows.Add(show); - - if (show.Studio != null) // Do not query it if the studio is already attached. // Do not set this value if the database does not found the studio. - show.Studio = _database.Studios.FirstOrDefault(x => x.Slug == show.Studio.Slug); - // show.GenreLinks = show.GenreLinks?.Select(x => - // { - // x.Genre = _database.Genres.FirstOrDefault(y => y.Slug == x.Genre.Slug) ?? x.Genre; - // return x; - // }); - // show.People = show.People?.Select(x => - // { - // x.People = _database.Peoples.FirstOrDefault(y => y.Slug == x.Slug) ?? x.People; - // return x; - // }); - // show.Seasons = show.Seasons?.Select(x => _database.Seasons.FirstOrDefault(y => y.SeasonNumber == x.SeasonNumber) ?? x); - // show.Episodes = show.Episodes?.Select(x => _database.Episodes.FirstOrDefault(y => y.EpisodeNumber == x.EpisodeNumber && y.SeasonNumber == x.SeasonNumber) ?? x); - // _database.SaveChanges(); return show.ID; } + public long EditShow(Show edited) + { + if (edited == null) + throw new ArgumentNullException(nameof(edited)); + + _database.ChangeTracker.LazyLoadingEnabled = false; + _database.ChangeTracker.AutoDetectChangesEnabled = false; + + try + { + Show show = _database.Entry(edited).IsKeySet + ? _database.Shows.FirstOrDefault(x => x.ID == edited.ID) + : GetShowBySlug(edited.Slug); + + if (show == null) + throw new ItemNotFound($"No show could be found with the id {edited.ID} or the slug {edited.Slug}"); + + Utility.Complete(show, edited); + + Studio tmp = _database.Studios.FirstOrDefault(x => x.Slug == edited.Studio.Slug); + if (tmp != null) + show.Studio = tmp; + + show.GenreLinks = edited.GenreLinks?.Select(x => + { + x.Genre = _database.Genres.FirstOrDefault(y => y.Slug == x.Genre.Slug) ?? x.Genre; + x.GenreID = x.Genre.ID; + return x; + }).ToList(); + show.People = edited.People?.Select(x => + { + x.People = _database.Peoples.FirstOrDefault(y => y.Slug == x.People.Slug) ?? x.People; + return x; + }).ToList(); + show.Seasons = edited.Seasons?.Select(x => + { + return _database.Seasons.FirstOrDefault(y => y.ShowID == x.ShowID + && y.SeasonNumber == x.SeasonNumber) ?? x; + }).ToList(); + show.Episodes = edited.Episodes?.Select(x => + { + return _database.Episodes.FirstOrDefault(y => y.ShowID == x.ShowID + && y.SeasonNumber == x.SeasonNumber + && y.EpisodeNumber == x.EpisodeNumber) ?? x; + }).ToList(); + + _database.ChangeTracker.DetectChanges(); + _database.SaveChanges(); + } + finally + { + _database.ChangeTracker.LazyLoadingEnabled = true; + _database.ChangeTracker.AutoDetectChangesEnabled = true; + } + + return edited.ID; + } + public long RegisterMovie(Episode movie) { if (movie == null) diff --git a/Kyoo/Views/API/ShowsAPI.cs b/Kyoo/Views/API/ShowsAPI.cs index d21850a0..310a83cd 100644 --- a/Kyoo/Views/API/ShowsAPI.cs +++ b/Kyoo/Views/API/ShowsAPI.cs @@ -1,11 +1,10 @@ -using Kyoo.Models; +using System; +using Kyoo.Models; using Microsoft.AspNetCore.Mvc; using System.Collections.Generic; -using System.Linq; using Kyoo.Controllers; -using Microsoft.AspNetCore.Authentication.Cookies; +using Kyoo.Models.Exceptions; using Microsoft.AspNetCore.Authorization; -using Microsoft.EntityFrameworkCore; namespace Kyoo.Api { @@ -42,17 +41,21 @@ namespace Kyoo.Api } [HttpPost("edit/{slug}")] - // [Authorize(Policy="Write")] + [Authorize(Policy="Write")] public IActionResult EditShow(string slug, [FromBody] Show show) - { - if (!ModelState.IsValid) - return BadRequest(show); + { + if (!ModelState.IsValid) + return BadRequest(show); show.ID = 0; - Show old = _libraryManager.GetShowBySlug(slug); - if (old == null) + show.Slug = slug; + try + { + _libraryManager.EditShow(show); + } + catch (ItemNotFound) + { return NotFound(); - //old = Utility.Complete(old, show); - _libraryManager.RegisterShow(old); + } return Ok(); } } diff --git a/Kyoo/appsettings.json b/Kyoo/appsettings.json index bf38c6d1..b31c9b65 100644 --- a/Kyoo/appsettings.json +++ b/Kyoo/appsettings.json @@ -26,6 +26,6 @@ "peoplePath": "people", "profilePicturePath": "users/", "plugins": "plugins/", - "defaultPermissions": "read,play", + "defaultPermissions": "read,play,write,admin", "regex": "(\\/(?.*)\\/)?.*\\/(?.+?)(( S(?\\d+)E(?\\d+)| (?\\d+)))?\\." }