diff --git a/services/Archival/FilterLists.Archival.Infrastructure/FilterLists.Archival.Infrastructure.csproj b/services/Archival/FilterLists.Archival.Infrastructure/FilterLists.Archival.Infrastructure.csproj
index f7e211158..817b1e2c7 100644
--- a/services/Archival/FilterLists.Archival.Infrastructure/FilterLists.Archival.Infrastructure.csproj
+++ b/services/Archival/FilterLists.Archival.Infrastructure/FilterLists.Archival.Infrastructure.csproj
@@ -28,14 +28,10 @@
-
all
runtime; build; native; contentfiles; analyzers; buildtransitive
-
-
-
diff --git a/services/SharedKernel/FilterLists.SharedKernel.Apis.Clients/BaseApiClient.cs b/services/SharedKernel/FilterLists.SharedKernel.Apis.Clients/BaseApiClient.cs
new file mode 100644
index 000000000..742972c39
--- /dev/null
+++ b/services/SharedKernel/FilterLists.SharedKernel.Apis.Clients/BaseApiClient.cs
@@ -0,0 +1,25 @@
+using System.Net.Http;
+using System.Text.Json;
+using System.Threading;
+using System.Threading.Tasks;
+
+namespace FilterLists.SharedKernel.Apis.Clients
+{
+ internal abstract class BaseApiClient
+ {
+ protected BaseApiClient(HttpClient httpClient)
+ {
+ Client = httpClient;
+ }
+
+ protected HttpClient Client { get; }
+
+ protected async Task GetAsync(string requestUri, CancellationToken cancellationToken = default)
+ {
+ var response = await Client.GetAsync(requestUri, cancellationToken);
+ response.EnsureSuccessStatusCode();
+ await using var responseStream = await response.Content.ReadAsStreamAsync();
+ return await JsonSerializer.DeserializeAsync(responseStream, cancellationToken: cancellationToken);
+ }
+ }
+}
\ No newline at end of file
diff --git a/services/SharedKernel/FilterLists.SharedKernel.Apis.Clients/ConfigurationExtensions.cs b/services/SharedKernel/FilterLists.SharedKernel.Apis.Clients/ConfigurationExtensions.cs
index d9a570253..809a47ad7 100644
--- a/services/SharedKernel/FilterLists.SharedKernel.Apis.Clients/ConfigurationExtensions.cs
+++ b/services/SharedKernel/FilterLists.SharedKernel.Apis.Clients/ConfigurationExtensions.cs
@@ -1,5 +1,5 @@
-using Microsoft.Extensions.DependencyInjection;
-using RestSharp;
+using FilterLists.SharedKernel.Apis.Clients.Directory;
+using Microsoft.Extensions.DependencyInjection;
namespace FilterLists.SharedKernel.Apis.Clients
{
@@ -7,7 +7,7 @@ public static class ConfigurationExtensions
{
public static void AddApiClients(this IServiceCollection services)
{
- services.AddTransient();
+ services.AddHttpClient();
}
}
}
\ No newline at end of file
diff --git a/services/SharedKernel/FilterLists.SharedKernel.Apis.Clients/Directory/DirectoryApiApiClient.cs b/services/SharedKernel/FilterLists.SharedKernel.Apis.Clients/Directory/DirectoryApiApiClient.cs
new file mode 100644
index 000000000..8e143ae3b
--- /dev/null
+++ b/services/SharedKernel/FilterLists.SharedKernel.Apis.Clients/Directory/DirectoryApiApiClient.cs
@@ -0,0 +1,27 @@
+using System;
+using System.Collections.Generic;
+using System.Net.Http;
+using System.Threading;
+using System.Threading.Tasks;
+using FilterLists.SharedKernel.Apis.Contracts.Directory;
+
+namespace FilterLists.SharedKernel.Apis.Clients.Directory
+{
+ internal sealed class DirectoryApiApiClient : BaseApiClient, IDirectoryApiClient
+ {
+ public DirectoryApiApiClient(HttpClient httpClient, Uri directoryApiBaseUrl) : base(httpClient)
+ {
+ Client.BaseAddress = directoryApiBaseUrl;
+ }
+
+ public async Task> GetListsAsync(CancellationToken cancellationToken = default)
+ {
+ return await GetAsync>("/lists", cancellationToken);
+ }
+
+ public async Task GetListDetailsAsync(int id, CancellationToken cancellationToken = default)
+ {
+ return await GetAsync($"/lists/{id}", cancellationToken);
+ }
+ }
+}
\ No newline at end of file
diff --git a/services/SharedKernel/FilterLists.SharedKernel.Apis.Clients/Directory/IDirectoryApiClient.cs b/services/SharedKernel/FilterLists.SharedKernel.Apis.Clients/Directory/IDirectoryApiClient.cs
new file mode 100644
index 000000000..91267fea9
--- /dev/null
+++ b/services/SharedKernel/FilterLists.SharedKernel.Apis.Clients/Directory/IDirectoryApiClient.cs
@@ -0,0 +1,13 @@
+using System.Collections.Generic;
+using System.Threading;
+using System.Threading.Tasks;
+using FilterLists.SharedKernel.Apis.Contracts.Directory;
+
+namespace FilterLists.SharedKernel.Apis.Clients.Directory
+{
+ public interface IDirectoryApiClient
+ {
+ Task> GetListsAsync(CancellationToken cancellationToken = default);
+ Task GetListDetailsAsync(int id, CancellationToken cancellationToken = default);
+ }
+}
\ No newline at end of file
diff --git a/services/SharedKernel/FilterLists.SharedKernel.Apis.Clients/FilterLists.SharedKernel.Apis.Clients.csproj b/services/SharedKernel/FilterLists.SharedKernel.Apis.Clients/FilterLists.SharedKernel.Apis.Clients.csproj
index c05a1a4fe..99527e959 100644
--- a/services/SharedKernel/FilterLists.SharedKernel.Apis.Clients/FilterLists.SharedKernel.Apis.Clients.csproj
+++ b/services/SharedKernel/FilterLists.SharedKernel.Apis.Clients/FilterLists.SharedKernel.Apis.Clients.csproj
@@ -29,8 +29,8 @@
all
runtime; build; native; contentfiles; analyzers; buildtransitive
-
-
+
+