New: Don't retest connections, indexers, download clients, etc if re-saved with the exact same settings

(cherry picked from commit 71fd09f162b2880c461e03cba4317c34ee3203dc)
(cherry picked from commit 804a5921b3b620e2407d5d6a7fd69fb1fd9b0cbf)
(cherry picked from commit 65cb1ccafd54479fa3fca1f1eaa4b96222b0176b)
pull/2006/head
Mark McDowall 6 months ago committed by Bogdan
parent 94634234ff
commit 3492b75287

@ -1,4 +1,5 @@
using System.Collections.Generic;
using System.Text.Json.Serialization;
using NzbDrone.Core.Datastore;
namespace NzbDrone.Core.ThingiProvider
@ -13,7 +14,10 @@ namespace NzbDrone.Core.ThingiProvider
private IProviderConfig _settings;
public string Name { get; set; }
[JsonIgnore]
public string ImplementationName { get; set; }
public string Implementation { get; set; }
public string ConfigContract { get; set; }
public virtual bool Enable { get; set; }

@ -3,6 +3,7 @@ using System.Linq;
using FluentValidation;
using FluentValidation.Results;
using Microsoft.AspNetCore.Mvc;
using NzbDrone.Common.Serializer;
using NzbDrone.Core.ThingiProvider;
using NzbDrone.Core.Validation;
using NzbDrone.Http.REST.Attributes;
@ -69,7 +70,7 @@ namespace Prowlarr.Api.V1
[Produces("application/json")]
public ActionResult<TProviderResource> CreateProvider([FromBody] TProviderResource providerResource, [FromQuery] bool forceSave = false)
{
var providerDefinition = GetDefinition(providerResource, true, !forceSave, false);
var providerDefinition = GetDefinition(providerResource, null, true, !forceSave, false);
if (providerDefinition.Enable)
{
@ -86,15 +87,24 @@ namespace Prowlarr.Api.V1
[Produces("application/json")]
public ActionResult<TProviderResource> UpdateProvider([FromBody] TProviderResource providerResource, [FromQuery] bool forceSave = false)
{
var providerDefinition = GetDefinition(providerResource, true, !forceSave, false);
var existingDefinition = _providerFactory.Find(providerResource.Id);
var providerDefinition = GetDefinition(providerResource, existingDefinition, true, !forceSave, false);
// Only test existing definitions if it is enabled and forceSave isn't set.
if (providerDefinition.Enable && !forceSave)
// Comparing via JSON string to eliminate the need for every provider implementation to implement equality checks.
// Compare settings separately because they are not serialized with the definition.
var hasDefinitionChanged = STJson.ToJson(existingDefinition) != STJson.ToJson(providerDefinition) ||
STJson.ToJson(existingDefinition.Settings) != STJson.ToJson(providerDefinition.Settings);
// Only test existing definitions if it is enabled and forceSave isn't set and the definition has changed.
if (providerDefinition.Enable && !forceSave && hasDefinitionChanged)
{
Test(providerDefinition, true);
}
_providerFactory.Update(providerDefinition);
if (hasDefinitionChanged)
{
_providerFactory.Update(providerDefinition);
}
return Accepted(providerResource.Id);
}
@ -140,9 +150,8 @@ namespace Prowlarr.Api.V1
return Accepted(_providerFactory.Update(definitionsToUpdate).Select(x => _resourceMapper.ToResource(x)));
}
private TProviderDefinition GetDefinition(TProviderResource providerResource, bool validate, bool includeWarnings, bool forceValidate)
private TProviderDefinition GetDefinition(TProviderResource providerResource, TProviderDefinition existingDefinition, bool validate, bool includeWarnings, bool forceValidate)
{
var existingDefinition = providerResource.Id > 0 ? _providerFactory.Find(providerResource.Id) : null;
var definition = _resourceMapper.ToModel(providerResource, existingDefinition);
if (validate && (definition.Enable || forceValidate))
@ -199,7 +208,8 @@ namespace Prowlarr.Api.V1
[Consumes("application/json")]
public object Test([FromBody] TProviderResource providerResource)
{
var providerDefinition = GetDefinition(providerResource, true, true, true);
var existingDefinition = providerResource.Id > 0 ? _providerFactory.Find(providerResource.Id) : null;
var providerDefinition = GetDefinition(providerResource, existingDefinition, true, true, true);
Test(providerDefinition, true);
@ -232,9 +242,10 @@ namespace Prowlarr.Api.V1
[HttpPost("action/{name}")]
[Consumes("application/json")]
[Produces("application/json")]
public IActionResult RequestAction(string name, [FromBody] TProviderResource resource)
public IActionResult RequestAction(string name, [FromBody] TProviderResource providerResource)
{
var providerDefinition = GetDefinition(resource, false, false, false);
var existingDefinition = providerResource.Id > 0 ? _providerFactory.Find(providerResource.Id) : null;
var providerDefinition = GetDefinition(providerResource, existingDefinition, false, false, false);
var query = Request.Query.ToDictionary(x => x.Key, x => x.Value.ToString());

Loading…
Cancel
Save