feat: work on collecting search requests

This commit is contained in:
Stevan Freeborn
2024-08-30 16:00:08 -05:00
parent eb0b6558bd
commit 409d4e339f
10 changed files with 143 additions and 20 deletions
+1 -2
View File
@@ -14,10 +14,9 @@ global using Moq;
global using RichardSzalay.MockHttp; global using RichardSzalay.MockHttp;
global using SanctionsSearch.Worker.Interfaces;
global using SanctionsSearch.Worker.Models; global using SanctionsSearch.Worker.Models;
global using SanctionsSearch.Worker.Options; global using SanctionsSearch.Worker.Options;
global using SanctionsSearch.Worker.Persistence; global using SanctionsSearch.Worker.Persistence;
global using SanctionsSearch.Worker.Services; global using SanctionsSearch.Worker.Services;
global using SanctionsSearch.Worker.Tests.Faker; global using SanctionsSearch.Worker.Tests.Faker;
global using SanctionsSearch.Worker.Interfaces;
@@ -0,0 +1,9 @@
namespace SanctionsSearch.Worker.Extensions;
static class GetPagedRecordsResponseExtensions
{
public static bool HasMorePages(this GetPagedRecordsResponse response)
{
return response.PageNumber < response.TotalPages;
}
}
@@ -0,0 +1,9 @@
namespace SanctionsSearch.Worker.Extensions;
static class RecordFieldValueExtensions
{
public static string GetStringValue(this RecordFieldValue recordFieldValue) =>
recordFieldValue.Type is not ResultValueType.String
? string.Empty
: recordFieldValue.AsString() ?? string.Empty;
}
@@ -2,4 +2,5 @@ namespace SanctionsSearch.Worker.Interfaces;
interface IOnspringService interface IOnspringService
{ {
Task<List<SearchRequest>> GetSearchRequestsAsync();
} }
@@ -0,0 +1,11 @@
namespace SanctionsSearch.Worker.Models;
class SearchRequest
{
public string Name { get; set; } = string.Empty;
public string Address { get; set; } = string.Empty;
public string City { get; set; } = string.Empty;
public string State { get; set; } = string.Empty;
public string Zip { get; set; } = string.Empty;
public string Country { get; set; } = string.Empty;
}
+8
View File
@@ -73,6 +73,14 @@ class Program
.AddHttpClient<IOfacFileService, OfacFileService>() .AddHttpClient<IOfacFileService, OfacFileService>()
.AddStandardResilienceHandler(); .AddStandardResilienceHandler();
builder.Services
.AddHttpClient<IOnspringService, OnspringService>((sp, client) =>
{
var options = sp.GetRequiredService<OnspringOptions>();
client.BaseAddress = new Uri(options.BaseUrl);
})
.AddStandardResilienceHandler();
builder.Services.AddScoped<ISdnRepository, SdnRepository>(); builder.Services.AddScoped<ISdnRepository, SdnRepository>();
builder.Services.AddScoped<IAddressRepository, AddressRepository>(); builder.Services.AddScoped<IAddressRepository, AddressRepository>();
builder.Services.AddScoped<IAliasRepository, AliasRepository>(); builder.Services.AddScoped<IAliasRepository, AliasRepository>();
@@ -1,5 +1,85 @@
namespace SanctionsSearch.Worker.Services; namespace SanctionsSearch.Worker.Services;
class OnspringService : IOnspringService class OnspringService(
HttpClient httpClient,
OnspringOptions options,
ILogger<OnspringService> logger
) : IOnspringService
{ {
private readonly IOnspringClient _client = new OnspringClient(options.ApiKey, httpClient);
private readonly ILogger<OnspringService> _logger = logger;
public async Task<List<SearchRequest>> GetSearchRequestsAsync()
{
var queryRequest = new QueryRecordsRequest()
{
AppId = options.SearchRequestOptions.AppId,
FieldIds = [
options.SearchRequestOptions.NameFieldId,
options.SearchRequestOptions.AddressFieldId,
options.SearchRequestOptions.CityFieldId,
options.SearchRequestOptions.StateFieldId,
options.SearchRequestOptions.ZipFieldId,
options.SearchRequestOptions.CountryFieldId
],
};
var records = new ConcurrentBag<ResultRecord>();
var initialResponse = await _client.QueryRecordsAsync(queryRequest);
if (initialResponse.IsSuccessful is false)
{
_logger.LogError(
"Failed to retrieve search requests: {StatusCode} - {Error}",
initialResponse.StatusCode,
initialResponse.Message
);
return [];
}
initialResponse.Value.Items.ForEach(records.Add);
if (initialResponse.Value.HasMorePages())
{
// TODO: Fan out and collect remaining pages
}
return records.Select(MapRecordToSearchRequest).ToList();
}
private SearchRequest MapRecordToSearchRequest(ResultRecord record)
{
var searchRequest = new SearchRequest();
foreach (var field in record.FieldData)
{
if (field.FieldId == options.SearchRequestOptions.NameFieldId)
{
searchRequest.Name = field.GetStringValue();
}
else if (field.FieldId == options.SearchRequestOptions.AddressFieldId)
{
searchRequest.Address = field.GetStringValue();
}
else if (field.FieldId == options.SearchRequestOptions.CityFieldId)
{
searchRequest.City = field.GetStringValue();
}
else if (field.FieldId == options.SearchRequestOptions.StateFieldId)
{
searchRequest.State = field.GetStringValue();
}
else if (field.FieldId == options.SearchRequestOptions.ZipFieldId)
{
searchRequest.Zip = field.GetStringValue();
}
else if (field.FieldId == options.SearchRequestOptions.CountryFieldId)
{
searchRequest.Country = field.GetStringValue();
}
}
return searchRequest;
}
} }
+10 -4
View File
@@ -1,12 +1,22 @@
global using System.Collections.Concurrent;
global using System.Globalization;
global using System.Linq.Expressions; global using System.Linq.Expressions;
global using System.Reflection; global using System.Reflection;
global using CsvHelper;
global using CsvHelper.Configuration;
global using FluentResults; global using FluentResults;
global using Microsoft.Data.Sqlite; global using Microsoft.Data.Sqlite;
global using Microsoft.EntityFrameworkCore; global using Microsoft.EntityFrameworkCore;
global using Microsoft.Extensions.Options; global using Microsoft.Extensions.Options;
global using Onspring.API.SDK;
global using Onspring.API.SDK.Enums;
global using Onspring.API.SDK.Models;
global using SanctionsSearch.Worker.Extensions;
global using SanctionsSearch.Worker.Interfaces; global using SanctionsSearch.Worker.Interfaces;
global using SanctionsSearch.Worker.Models; global using SanctionsSearch.Worker.Models;
global using SanctionsSearch.Worker.Options; global using SanctionsSearch.Worker.Options;
@@ -19,7 +29,3 @@ global using Serilog;
global using Serilog.Context; global using Serilog.Context;
global using Serilog.Exceptions; global using Serilog.Exceptions;
global using Serilog.Formatting.Compact; global using Serilog.Formatting.Compact;
global using System.Globalization;
global using CsvHelper;
global using CsvHelper.Configuration;