refactor: Improve service connection error message

When unable to connect to a service, we no longer send a confusing
message saying capabilities could not be obtained. This also involved
removing nullability in a few places to simplify logic an error
handling.
json-serializing-nullable-fields-issue
Robert Dailey 10 months ago
parent 3ac1de9c94
commit a84c8a0efc

@ -5,7 +5,6 @@ using Recyclarr.Cli.Pipelines.ReleaseProfile.Api.Objects;
using Recyclarr.Cli.Pipelines.ReleaseProfile.Api.Schemas; using Recyclarr.Cli.Pipelines.ReleaseProfile.Api.Schemas;
using Recyclarr.TrashLib.Compatibility.Sonarr; using Recyclarr.TrashLib.Compatibility.Sonarr;
using Recyclarr.TrashLib.Config.Services; using Recyclarr.TrashLib.Config.Services;
using Recyclarr.TrashLib.ExceptionTypes;
namespace Recyclarr.Cli.Pipelines.ReleaseProfile.Api; namespace Recyclarr.Cli.Pipelines.ReleaseProfile.Api;
@ -30,10 +29,6 @@ public class SonarrReleaseProfileCompatibilityHandler : ISonarrReleaseProfileCom
SonarrReleaseProfile profile) SonarrReleaseProfile profile)
{ {
var capabilities = await _capabilityFetcher.GetCapabilities(config); var capabilities = await _capabilityFetcher.GetCapabilities(config);
if (capabilities is null)
{
throw new ServiceIncompatibilityException("Capabilities could not be obtained");
}
return capabilities.ArraysNeededForReleaseProfileRequiredAndIgnored return capabilities.ArraysNeededForReleaseProfileRequiredAndIgnored
? profile ? profile

@ -4,5 +4,5 @@ namespace Recyclarr.TrashLib.ApiServices.System;
public interface IServiceInformation public interface IServiceInformation
{ {
public Task<Version?> GetVersion(IServiceConfiguration config); public Task<Version> GetVersion(IServiceConfiguration config);
} }

@ -1,6 +1,5 @@
using Flurl.Http; using Flurl.Http;
using Recyclarr.TrashLib.Config.Services; using Recyclarr.TrashLib.Config.Services;
using Recyclarr.TrashLib.Http;
namespace Recyclarr.TrashLib.ApiServices.System; namespace Recyclarr.TrashLib.ApiServices.System;
@ -15,7 +14,7 @@ public class ServiceInformation : IServiceInformation
_log = log; _log = log;
} }
public async Task<Version?> GetVersion(IServiceConfiguration config) public async Task<Version> GetVersion(IServiceConfiguration config)
{ {
try try
{ {
@ -23,11 +22,10 @@ public class ServiceInformation : IServiceInformation
_log.Debug("{Service} Version: {Version}", status.AppName, status.Version); _log.Debug("{Service} Version: {Version}", status.AppName, status.Version);
return new Version(status.Version); return new Version(status.Version);
} }
catch (FlurlHttpException ex) catch (FlurlHttpException)
{ {
_log.Error("Exception trying to obtain service version: {Message}", ex.SanitizedExceptionMessage()); _log.Error("Unable to obtain service version information");
throw;
} }
return null;
} }
} }

@ -4,5 +4,5 @@ namespace Recyclarr.TrashLib.Compatibility.Radarr;
public interface IRadarrCapabilityFetcher public interface IRadarrCapabilityFetcher
{ {
Task<RadarrCapabilities?> GetCapabilities(IServiceConfiguration config); Task<RadarrCapabilities> GetCapabilities(IServiceConfiguration config);
} }

@ -1,5 +1,4 @@
using Recyclarr.TrashLib.Config.Services; using Recyclarr.TrashLib.Config.Services;
using Recyclarr.TrashLib.ExceptionTypes;
namespace Recyclarr.TrashLib.Compatibility.Radarr; namespace Recyclarr.TrashLib.Compatibility.Radarr;
@ -14,11 +13,7 @@ public class RadarrCapabilityEnforcer
public async Task Check(RadarrConfiguration config) public async Task Check(RadarrConfiguration config)
{ {
var capabilities = await _capabilityFetcher.GetCapabilities(config); _ = await _capabilityFetcher.GetCapabilities(config);
if (capabilities is null)
{
throw new ServiceIncompatibilityException("Capabilities could not be obtained");
}
// For the future: Add more capability checks here as needed // For the future: Add more capability checks here as needed
} }

@ -12,10 +12,10 @@ public abstract class ServiceCapabilityFetcher<T> where T : class
_info = info; _info = info;
} }
public async Task<T?> GetCapabilities(IServiceConfiguration config) public async Task<T> GetCapabilities(IServiceConfiguration config)
{ {
var version = await _info.GetVersion(config); var version = await _info.GetVersion(config);
return version is not null ? BuildCapabilitiesObject(version) : null; return BuildCapabilitiesObject(version);
} }
protected abstract T BuildCapabilitiesObject(Version version); protected abstract T BuildCapabilitiesObject(Version version);

@ -4,5 +4,5 @@ namespace Recyclarr.TrashLib.Compatibility.Sonarr;
public interface ISonarrCapabilityFetcher public interface ISonarrCapabilityFetcher
{ {
Task<SonarrCapabilities?> GetCapabilities(IServiceConfiguration config); Task<SonarrCapabilities> GetCapabilities(IServiceConfiguration config);
} }

@ -16,10 +16,6 @@ public class SonarrCapabilityEnforcer
public async Task Check(SonarrConfiguration config) public async Task Check(SonarrConfiguration config)
{ {
var capabilities = await _capabilityFetcher.GetCapabilities(config); var capabilities = await _capabilityFetcher.GetCapabilities(config);
if (capabilities is null)
{
throw new ServiceIncompatibilityException("Capabilities could not be obtained");
}
if (!capabilities.SupportsNamedReleaseProfiles) if (!capabilities.SupportsNamedReleaseProfiles)
{ {

@ -9,20 +9,6 @@ namespace Recyclarr.TrashLib.Tests.Compatibility.Sonarr;
[Parallelizable(ParallelScope.All)] [Parallelizable(ParallelScope.All)]
public class SonarrCapabilityEnforcerTest public class SonarrCapabilityEnforcerTest
{ {
[Test, AutoMockData]
public void Fail_when_capabilities_not_obtained(
[Frozen] ISonarrCapabilityFetcher fetcher,
SonarrCapabilityEnforcer sut)
{
var config = NewConfig.Sonarr();
fetcher.GetCapabilities(default!).ReturnsForAnyArgs((SonarrCapabilities?) null);
var act = () => sut.Check(config);
act.Should().ThrowAsync<ServiceIncompatibilityException>().WithMessage("*obtained*");
}
[Test, AutoMockData] [Test, AutoMockData]
public void Minimum_version_not_met( public void Minimum_version_not_met(
[Frozen] ISonarrCapabilityFetcher fetcher, [Frozen] ISonarrCapabilityFetcher fetcher,

Loading…
Cancel
Save