Browse Source

fix: properly delete manual collections from search index

pull/2939/head
Jason Dove 4 weeks ago
parent
commit
4d8c880496
No known key found for this signature in database
  1. 1
      CHANGELOG.md
  2. 33
      ErsatzTV.Application/MediaCollections/Commands/DeleteCollectionHandler.cs

1
CHANGELOG.md

@ -29,6 +29,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
- Automatically remove already-played playout items from (continuous) scripted schedules - Automatically remove already-played playout items from (continuous) scripted schedules
- Extract embedded text subtitles (when enabled in settings) on channels that use custom stream selectors - Extract embedded text subtitles (when enabled in settings) on channels that use custom stream selectors
- Fix subtitle playback using Next streaming engine - Fix subtitle playback using Next streaming engine
- Fix bug where search results for deleted manual collections would continue to appear
### Changed ### Changed
- Upgrade Intel driver in docker containers to support latest Battlemage devices (e.g. B70) - Upgrade Intel driver in docker containers to support latest Battlemage devices (e.g. B70)

33
ErsatzTV.Application/MediaCollections/Commands/DeleteCollectionHandler.cs

@ -1,5 +1,7 @@
using ErsatzTV.Core; using ErsatzTV.Core;
using ErsatzTV.Core.Domain; using ErsatzTV.Core.Domain;
using ErsatzTV.Core.Interfaces.Metadata;
using ErsatzTV.Core.Interfaces.Repositories;
using ErsatzTV.Core.Interfaces.Search; using ErsatzTV.Core.Interfaces.Search;
using ErsatzTV.Infrastructure.Data; using ErsatzTV.Infrastructure.Data;
using ErsatzTV.Infrastructure.Extensions; using ErsatzTV.Infrastructure.Extensions;
@ -7,31 +9,38 @@ using Microsoft.EntityFrameworkCore;
namespace ErsatzTV.Application.MediaCollections; namespace ErsatzTV.Application.MediaCollections;
public class DeleteCollectionHandler : IRequestHandler<DeleteCollection, Either<BaseError, Unit>> public class DeleteCollectionHandler(
IDbContextFactory<TvContext> dbContextFactory,
ISearchTargets searchTargets,
IMediaCollectionRepository mediaCollectionRepository,
ISearchRepository searchRepository,
IFallbackMetadataProvider fallbackMetadataProvider,
ILanguageCodeService languageCodeService,
ISearchIndex searchIndex)
: IRequestHandler<DeleteCollection, Either<BaseError, Unit>>
{ {
private readonly IDbContextFactory<TvContext> _dbContextFactory;
private readonly ISearchTargets _searchTargets;
public DeleteCollectionHandler(IDbContextFactory<TvContext> dbContextFactory, ISearchTargets searchTargets)
{
_dbContextFactory = dbContextFactory;
_searchTargets = searchTargets;
}
public async Task<Either<BaseError, Unit>> Handle( public async Task<Either<BaseError, Unit>> Handle(
DeleteCollection request, DeleteCollection request,
CancellationToken cancellationToken) CancellationToken cancellationToken)
{ {
await using TvContext dbContext = await _dbContextFactory.CreateDbContextAsync(cancellationToken); await using TvContext dbContext = await dbContextFactory.CreateDbContextAsync(cancellationToken);
Validation<BaseError, Collection> validation = await CollectionMustExist(dbContext, request, cancellationToken); Validation<BaseError, Collection> validation = await CollectionMustExist(dbContext, request, cancellationToken);
return await validation.Apply(c => DoDeletion(dbContext, c, cancellationToken)); return await validation.Apply(c => DoDeletion(dbContext, c, cancellationToken));
} }
private async Task<Unit> DoDeletion(TvContext dbContext, Collection collection, CancellationToken cancellationToken) private async Task<Unit> DoDeletion(TvContext dbContext, Collection collection, CancellationToken cancellationToken)
{ {
var itemIds = (await mediaCollectionRepository.GetItems(collection.Id)).Map(i => i.Id).ToList();
dbContext.Collections.Remove(collection); dbContext.Collections.Remove(collection);
await dbContext.SaveChangesAsync(cancellationToken); await dbContext.SaveChangesAsync(cancellationToken);
_searchTargets.SearchTargetsChanged(); await searchIndex.RebuildItems(
searchRepository,
fallbackMetadataProvider,
languageCodeService,
itemIds,
cancellationToken);
searchIndex.Commit();
searchTargets.SearchTargetsChanged();
return Unit.Default; return Unit.Default;
} }

Loading…
Cancel
Save