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

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

@ -1,6 +1,5 @@
using Flurl.Http;
using Recyclarr.TrashLib.Config.Services;
using Recyclarr.TrashLib.Http;
namespace Recyclarr.TrashLib.ApiServices.System;
@ -15,7 +14,7 @@ public class ServiceInformation : IServiceInformation
_log = log;
}
public async Task<Version?> GetVersion(IServiceConfiguration config)
public async Task<Version> GetVersion(IServiceConfiguration config)
{
try
{
@ -23,11 +22,10 @@ public class ServiceInformation : IServiceInformation
_log.Debug("{Service} Version: {Version}", status.AppName, 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
{
Task<RadarrCapabilities?> GetCapabilities(IServiceConfiguration config);
Task<RadarrCapabilities> GetCapabilities(IServiceConfiguration config);
}

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

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

@ -4,5 +4,5 @@ namespace Recyclarr.TrashLib.Compatibility.Sonarr;
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)
{
var capabilities = await _capabilityFetcher.GetCapabilities(config);
if (capabilities is null)
{
throw new ServiceIncompatibilityException("Capabilities could not be obtained");
}
if (!capabilities.SupportsNamedReleaseProfiles)
{

@ -9,20 +9,6 @@ namespace Recyclarr.TrashLib.Tests.Compatibility.Sonarr;
[Parallelizable(ParallelScope.All)]
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]
public void Minimum_version_not_met(
[Frozen] ISonarrCapabilityFetcher fetcher,

Loading…
Cancel
Save