From 20306a38e1d0f6a7954978cf07cde8e185f79c78 Mon Sep 17 00:00:00 2001 From: Taloth Saldono Date: Wed, 11 Aug 2021 13:47:03 +0200 Subject: [PATCH] Fixed: Release Push api broken when no indexer id is specified --- .../RssSync/IndexerTagSpecificationFixture.cs | 28 ++++++++++++++++++- .../RssSync/IndexerTagSpecification.cs | 25 ++++++++++++++--- 2 files changed, 48 insertions(+), 5 deletions(-) diff --git a/src/NzbDrone.Core.Test/DecisionEngineTests/RssSync/IndexerTagSpecificationFixture.cs b/src/NzbDrone.Core.Test/DecisionEngineTests/RssSync/IndexerTagSpecificationFixture.cs index bc15bf276..7120fdfb7 100644 --- a/src/NzbDrone.Core.Test/DecisionEngineTests/RssSync/IndexerTagSpecificationFixture.cs +++ b/src/NzbDrone.Core.Test/DecisionEngineTests/RssSync/IndexerTagSpecificationFixture.cs @@ -3,6 +3,7 @@ using FluentAssertions; using Moq; using NUnit.Framework; +using NzbDrone.Core.Datastore; using NzbDrone.Core.DecisionEngine.Specifications.RssSync; using NzbDrone.Core.Indexers; using NzbDrone.Core.IndexerSearch.Definitions; @@ -33,8 +34,13 @@ public void Setup() }; Mocker - .GetMock() + .GetMock() .Setup(m => m.Get(It.IsAny())) + .Throws(new ModelNotFoundException(typeof(IndexerDefinition), -1)); + + Mocker + .GetMock() + .Setup(m => m.Get(1)) .Returns(_fakeIndexerDefinition); _specification = Mocker.Resolve(); @@ -106,5 +112,25 @@ public void indexer_with_tags_series_with_different_tags_should_return_false() _specification.IsSatisfiedBy(_parseResultMulti, new SingleEpisodeSearchCriteria { MonitoredEpisodesOnly = true }).Accepted.Should().BeFalse(); } + + [Test] + public void release_without_indexerid_should_return_true() + { + _fakeIndexerDefinition.Tags = new HashSet { 456 }; + _fakeSeries.Tags = new HashSet { 123, 789 }; + _fakeRelease.IndexerId = 0; + + _specification.IsSatisfiedBy(_parseResultMulti, new SingleEpisodeSearchCriteria { MonitoredEpisodesOnly = true }).Accepted.Should().BeTrue(); + } + + [Test] + public void release_with_invalid_indexerid_should_return_true() + { + _fakeIndexerDefinition.Tags = new HashSet { 456 }; + _fakeSeries.Tags = new HashSet { 123, 789 }; + _fakeRelease.IndexerId = 2; + + _specification.IsSatisfiedBy(_parseResultMulti, new SingleEpisodeSearchCriteria { MonitoredEpisodesOnly = true }).Accepted.Should().BeTrue(); + } } } diff --git a/src/NzbDrone.Core/DecisionEngine/Specifications/RssSync/IndexerTagSpecification.cs b/src/NzbDrone.Core/DecisionEngine/Specifications/RssSync/IndexerTagSpecification.cs index 5ab1c1423..2d861bad8 100644 --- a/src/NzbDrone.Core/DecisionEngine/Specifications/RssSync/IndexerTagSpecification.cs +++ b/src/NzbDrone.Core/DecisionEngine/Specifications/RssSync/IndexerTagSpecification.cs @@ -1,6 +1,7 @@ using System.Linq; using NLog; using NzbDrone.Common.Extensions; +using NzbDrone.Core.Datastore; using NzbDrone.Core.Indexers; using NzbDrone.Core.IndexerSearch.Definitions; using NzbDrone.Core.Parser.Model; @@ -10,12 +11,12 @@ namespace NzbDrone.Core.DecisionEngine.Specifications.RssSync public class IndexerTagSpecification : IDecisionEngineSpecification { private readonly Logger _logger; - private readonly IIndexerRepository _indexerRepository; + private readonly IIndexerFactory _indexerFactory; - public IndexerTagSpecification(Logger logger, IIndexerRepository indexerRepository) + public IndexerTagSpecification(Logger logger, IIndexerFactory indexerFactory) { _logger = logger; - _indexerRepository = indexerRepository; + _indexerFactory = indexerFactory; } public SpecificationPriority Priority => SpecificationPriority.Default; @@ -23,8 +24,24 @@ public IndexerTagSpecification(Logger logger, IIndexerRepository indexerReposito public virtual Decision IsSatisfiedBy(RemoteEpisode subject, SearchCriteriaBase searchCriteria) { + if (subject.Release == null || subject.Series?.Tags == null || subject.Release.IndexerId == 0) + { + return Decision.Accept(); + } + + IndexerDefinition indexer; + try + { + indexer = _indexerFactory.Get(subject.Release.IndexerId); + } + catch (ModelNotFoundException) + { + _logger.Debug("Indexer with id {0} does not exist, skipping indexer tags check", subject.Release.IndexerId); + return Decision.Accept(); + } + // If indexer has tags, check that at least one of them is present on the series - var indexerTags = _indexerRepository.Get(subject.Release.IndexerId).Tags; + var indexerTags = indexer.Tags; if (indexerTags.Any() && indexerTags.Intersect(subject.Series.Tags).Empty()) {