Robert Dailey 4 weeks ago
parent 54d3ee4219
commit 01eea26312

@ -14,8 +14,10 @@
<PackageVersion Include="Flurl.Http" Version="4.0.2" />
<PackageVersion Include="GitVersion.MsBuild" Version="6.0.0-beta.7" />
<PackageVersion Include="JetBrains.Annotations" Version="2023.3.0" />
<PackageVersion Include="Microsoft.Extensions.Http" Version="8.0.0" />
<PackageVersion Include="MudBlazor" Version="6.11.0" />
<PackageVersion Include="ReactiveUI.Blazor" Version="19.5.1" />
<PackageVersion Include="Refit" Version="7.0.0" />
<PackageVersion Include="Serilog" Version="3.1.1" />
<PackageVersion Include="Serilog.AspNetCore" Version="8.0.0" />
<PackageVersion Include="Serilog.Expressions" Version="4.0.0" />

@ -5,13 +5,14 @@ using Serilog;
namespace Recyclarr.Compatibility;
public class ServiceInformation(ISystemApiService api, ILogger log) : IServiceInformation
public class ServiceInformation(ServarrApiServiceFactory apiFactory, ILogger log) : IServiceInformation
{
public async Task<Version> GetVersion(IServiceConfiguration config)
{
try
{
var status = await api.GetStatus(config);
var api = apiFactory.Create<ISystemApiService>(config);
var status = await api.GetStatus();
log.Debug("{Service} Version: {Version}", status.AppName, status.Version);
return new Version(status.Version);
}

@ -19,7 +19,9 @@ public class ApiServicesAutofacModule : Module
.As<IFlurlClientCache>()
.SingleInstance();
builder.RegisterType<SystemApiService>().As<ISystemApiService>();
// Single instance because it holds a cache of HttpClient objects
builder.RegisterType<ServarrApiServiceFactory>().SingleInstance();
builder.RegisterType<ServarrRequestBuilder>().As<IServarrRequestBuilder>();
builder.RegisterType<QualityProfileApiService>().As<IQualityProfileApiService>();
builder.RegisterType<CustomFormatApiService>().As<ICustomFormatApiService>();

@ -2,6 +2,8 @@
<ItemGroup>
<PackageReference Include="Flurl.Http" />
<PackageReference Include="JetBrains.Annotations" />
<PackageReference Include="Microsoft.Extensions.Http" />
<PackageReference Include="Refit" />
<PackageReference Include="Serilog" />
</ItemGroup>
<ItemGroup>

@ -1,8 +1,67 @@
using System.Diagnostics.CodeAnalysis;
using Flurl;
using Recyclarr.Config.Models;
using Recyclarr.Json;
using Refit;
namespace Recyclarr.ServarrApi.System;
public interface ISystemApiService
{
Task<SystemStatus> GetStatus(IServiceConfiguration config);
[Get("/system/status")]
Task<SystemStatus> GetStatus();
}
public class ServarrApiServiceFactory(IHttpClientFactory clientFactory)
{
// private readonly SocketsHttpHandler _clientHandler = new();
// private readonly Dictionary<string, HttpClient> _clientCache = new();
//
// private HttpClient MakeHttpClient(IServiceConfiguration config)
// {
// // ReSharper disable once InvertIf
// if (!_clientCache.TryGetValue(config.InstanceName, out var client))
// {
// client = new HttpClient(new ServarrApiAuthHandler(config, _clientHandler))
// {
// BaseAddress = config.BaseUrl.AppendPathSegments("api", "v3").ToUri()
// };
//
// _clientCache.Add(config.InstanceName, client);
// }
//
// return client;
// }
[SuppressMessage("Reliability", "CA2000:Dispose objects before losing scope")]
public TService Create<TService>(IServiceConfiguration config)
{
var client = clientFactory.CreateClient();
client.BaseAddress = config.BaseUrl.AppendPathSegments("api", "v3").ToUri();
// var client = new HttpClient(new ServarrApiAuthHandler(config, new HttpClientHandler()))
// {
// BaseAddress = config.BaseUrl.AppendPathSegments("api", "v3").ToUri()
// };
var settings = new RefitSettings
{
ContentSerializer = new SystemTextJsonContentSerializer(GlobalJsonSerializerSettings.Services)
};
return RestService.For<TService>(client, settings);
}
}
[SuppressMessage("Reliability", "CA2000:Dispose objects before losing scope")]
public class ServarrApiAuthHandler(IServiceConfiguration config, HttpMessageHandler innerHandler)
: DelegatingHandler(innerHandler)
{
protected override async Task<HttpResponseMessage> SendAsync(
HttpRequestMessage request,
CancellationToken cancellationToken)
{
request.Headers.Add("X-Api-Key", config.ApiKey);
return await base.SendAsync(request, cancellationToken);
}
}

@ -1,14 +0,0 @@
using Flurl.Http;
using Recyclarr.Config.Models;
using Recyclarr.ServarrApi.Http.Servarr;
namespace Recyclarr.ServarrApi.System;
public class SystemApiService(IServarrRequestBuilder service) : ISystemApiService
{
public async Task<SystemStatus> GetStatus(IServiceConfiguration config)
{
return await service.Request(config, "system", "status")
.GetJsonAsync<SystemStatus>();
}
}
Loading…
Cancel
Save