Build ErsatzTV Image / Build & test (.NET) (pull_request) Successful in 7m11s
Build ErsatzTV Image / Docs update reminder (pull_request) Successful in 12s
Build ErsatzTV Image / EF migration integrity (SQLite + MySql) (pull_request) Successful in 9m49s
Build ErsatzTV Image / Build & push image (amd64) (pull_request) Has been skipped
POST /api/libraries/{id}/scan-show resolved the target show via
GetShowIdByTitle, an EF.Functions.Like "%title%" substring match with
no OrderBy - non-deterministic under duplicate/overlapping titles and
capable of scanning the wrong show. The Blazor UI never had this bug
(it always passed the exact show id); this endpoint shipped days ago
in PR #216 with no external consumers, so the contract break is safe.
BREAKING CHANGE: ScanShowRequest now takes `showId: int` instead of
`showTitle: string`. Replaced ITelevisionRepository.GetShowIdByTitle
with GetShowTitle(libraryId, showId), which also enforces the show
belongs to the given library. LibrariesController.ScanShow now returns
a genuine 404 ProblemDetails (via ApiResults.NotFoundProblem, the
established pre-check pattern from TemplateController.DeleteGroup)
when the show id doesn't exist in that library, then queues
QueueShowScanByLibraryId with the DB-resolved title.
SPA: libraries.ts ScanShowParams.showId replaces showTitle;
MediaDetailScreen.tsx passes show.id. Extended
ApiErrorResponseMetadataTests and OpenApiErrorResponseContractTests
with the new 404 contract for ScanShow. Regenerated v1.json / v1.d.ts
via scripts/update-openapi.sh + npm run generate:api.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
59 lines
2.8 KiB
C#
59 lines
2.8 KiB
C#
using ErsatzTV.Core.Domain;
|
|
using ErsatzTV.Core.Metadata;
|
|
|
|
namespace ErsatzTV.Core.Interfaces.Repositories;
|
|
|
|
public interface ITelevisionRepository
|
|
{
|
|
Task<bool> AllShowsExist(List<int> showIds);
|
|
Task<bool> AllSeasonsExist(List<int> seasonIds);
|
|
Task<bool> AllEpisodesExist(List<int> episodeIds);
|
|
Task<List<Show>> GetAllShows();
|
|
Task<Option<Show>> GetShow(int showId, CancellationToken cancellationToken);
|
|
Task<Option<string>> GetShowTitle(int libraryId, int showId);
|
|
Task<List<Episode>> GetShowItems(int showId);
|
|
Task<List<int>> GetEpisodeIdsForShow(int showId);
|
|
Task<List<Season>> GetAllSeasons();
|
|
Task<Option<Season>> GetSeason(int seasonId);
|
|
Task<int> GetSeasonCount(int showId);
|
|
|
|
Task<List<Season>> GetPagedSeasons(
|
|
int televisionShowId,
|
|
int pageNumber,
|
|
int pageSize,
|
|
CancellationToken cancellationToken);
|
|
|
|
Task<List<Episode>> GetSeasonItems(int seasonId);
|
|
Task<int> GetEpisodeCount(int seasonId);
|
|
Task<List<EpisodeMetadata>> GetPagedEpisodes(int seasonId, int pageNumber, int pageSize);
|
|
Task<Option<Show>> GetShowByMetadata(int libraryPathId, ShowMetadata metadata, string showFolder);
|
|
Task<Either<BaseError, MediaItemScanResult<Show>>> AddShow(int libraryPathId, ShowMetadata metadata);
|
|
Task<Either<BaseError, Season>> GetOrAddSeason(Show show, int libraryPathId, int seasonNumber);
|
|
|
|
Task<Either<BaseError, Episode>> GetOrAddEpisode(
|
|
Season season,
|
|
LibraryPath libraryPath,
|
|
LibraryFolder libraryFolder,
|
|
string path,
|
|
CancellationToken cancellationToken);
|
|
|
|
Task<IEnumerable<string>> FindEpisodePaths(LibraryPath libraryPath);
|
|
Task<Unit> DeleteByPath(LibraryPath libraryPath, string path);
|
|
Task<Unit> DeleteEmptySeasons(LibraryPath libraryPath);
|
|
Task<List<int>> DeleteEmptyShows(LibraryPath libraryPath);
|
|
Task<bool> AddGenre(ShowMetadata metadata, Genre genre);
|
|
Task<bool> AddGenre(EpisodeMetadata metadata, Genre genre);
|
|
Task<bool> AddTag(Domain.Metadata metadata, Tag tag);
|
|
Task<bool> AddStudio(ShowMetadata metadata, Studio studio);
|
|
Task<bool> AddActor(ShowMetadata metadata, Actor actor);
|
|
Task<bool> AddActor(EpisodeMetadata metadata, Actor actor);
|
|
Task<Unit> RemoveMetadata(Episode episode, EpisodeMetadata metadata);
|
|
Task<bool> AddDirector(EpisodeMetadata metadata, Director director);
|
|
Task<bool> AddWriter(EpisodeMetadata metadata, Writer writer);
|
|
Task<bool> UpdateTitles(EpisodeMetadata metadata, string title, string sortTitle);
|
|
Task<bool> UpdateOutline(EpisodeMetadata metadata, string outline);
|
|
Task<bool> UpdatePlot(EpisodeMetadata metadata, string plot);
|
|
Task<bool> UpdateYear(ShowMetadata metadata, int? year);
|
|
Task<bool> UpdateTitles(ShowMetadata metadata, string title, string sortTitle);
|
|
}
|