diff --git a/API/Controllers/ChapterController.cs b/API/Controllers/ChapterController.cs index f305e7de6..8de26cf97 100644 --- a/API/Controllers/ChapterController.cs +++ b/API/Controllers/ChapterController.cs @@ -68,7 +68,8 @@ public class ChapterController : BaseApiController { if (User.IsInRole(PolicyConstants.ReadOnlyRole)) return BadRequest(await _localizationService.Translate(User.GetUserId(), "permission-denied")); - var chapter = await _unitOfWork.ChapterRepository.GetChapterAsync(chapterId); + var chapter = await _unitOfWork.ChapterRepository.GetChapterAsync(chapterId, + ChapterIncludes.Files | ChapterIncludes.ExternalReviews | ChapterIncludes.ExternalRatings); if (chapter == null) return BadRequest(_localizationService.Translate(User.GetUserId(), "chapter-doesnt-exist")); @@ -86,6 +87,15 @@ public class ChapterController : BaseApiController _unitOfWork.ChapterRepository.Remove(chapter); } + // If we removed the volume, do an additional check if we need to delete the actual series as well or not + var series = await _unitOfWork.SeriesRepository.GetSeriesByIdAsync(vol.SeriesId, SeriesIncludes.ExternalData | SeriesIncludes.Volumes); + var needToRemoveSeries = needToRemoveVolume && series != null && series.Volumes.Count <= 1; + if (needToRemoveSeries) + { + _unitOfWork.SeriesRepository.Remove(series!); + } + + if (!await _unitOfWork.CommitAsync()) return Ok(false); @@ -95,6 +105,12 @@ public class ChapterController : BaseApiController await _eventHub.SendMessageAsync(MessageFactory.VolumeRemoved, MessageFactory.VolumeRemovedEvent(chapter.VolumeId, vol.SeriesId), false); } + if (needToRemoveSeries) + { + await _eventHub.SendMessageAsync(MessageFactory.SeriesRemoved, + MessageFactory.SeriesRemovedEvent(series!.Id, series.Name, series.LibraryId), false); + } + return Ok(true); } diff --git a/API/Controllers/MetadataController.cs b/API/Controllers/MetadataController.cs index 9757186bb..b08ac1f38 100644 --- a/API/Controllers/MetadataController.cs +++ b/API/Controllers/MetadataController.cs @@ -221,7 +221,7 @@ public class MetadataController(IUnitOfWork unitOfWork, ILocalizationService loc return Ok(ret); } - private async Task PrepareSeriesDetail(List userReviews, SeriesDetailPlusDto ret) + private async Task PrepareSeriesDetail(List userReviews, SeriesDetailPlusDto? ret) { var isAdmin = User.IsInRole(PolicyConstants.AdminRole); var user = await unitOfWork.UserRepository.GetUserByIdAsync(User.GetUserId())!; @@ -235,12 +235,12 @@ public class MetadataController(IUnitOfWork unitOfWork, ILocalizationService loc ret.Recommendations.OwnedSeries = await unitOfWork.SeriesRepository.GetSeriesDtoByIdsAsync( ret.Recommendations.OwnedSeries.Select(s => s.Id), user); - ret.Recommendations.ExternalSeries = new List(); + ret.Recommendations.ExternalSeries = []; } if (ret.Recommendations != null && user != null) { - ret.Recommendations.OwnedSeries ??= new List(); + ret.Recommendations.OwnedSeries ??= []; await unitOfWork.SeriesRepository.AddSeriesModifiers(user.Id, ret.Recommendations.OwnedSeries); } } diff --git a/API/Data/Repositories/ChapterRepository.cs b/API/Data/Repositories/ChapterRepository.cs index 5badb315e..27d21df74 100644 --- a/API/Data/Repositories/ChapterRepository.cs +++ b/API/Data/Repositories/ChapterRepository.cs @@ -28,6 +28,7 @@ public enum ChapterIncludes Genres = 16, Tags = 32, ExternalReviews = 1 << 6, + ExternalRatings = 1 << 7 } public interface IChapterRepository diff --git a/API/Data/Repositories/SeriesRepository.cs b/API/Data/Repositories/SeriesRepository.cs index 572273d16..948f35a68 100644 --- a/API/Data/Repositories/SeriesRepository.cs +++ b/API/Data/Repositories/SeriesRepository.cs @@ -57,6 +57,8 @@ public enum SeriesIncludes ExternalRatings = 128, ExternalRecommendations = 256, ExternalMetadata = 512, + + ExternalData = ExternalMetadata | ExternalReviews | ExternalRatings | ExternalRecommendations, } /// diff --git a/API/Extensions/QueryExtensions/IncludesExtensions.cs b/API/Extensions/QueryExtensions/IncludesExtensions.cs index 1706648c1..864c4e5a1 100644 --- a/API/Extensions/QueryExtensions/IncludesExtensions.cs +++ b/API/Extensions/QueryExtensions/IncludesExtensions.cs @@ -79,6 +79,12 @@ public static class IncludesExtensions .Include(c => c.ExternalReviews); } + if (includes.HasFlag(ChapterIncludes.ExternalRatings)) + { + queryable = queryable + .Include(c => c.ExternalRatings); + } + return queryable.AsSplitQuery(); }