feat: begin working on adding search result back into Onspring
This commit is contained in:
@@ -3,4 +3,5 @@ namespace SanctionsSearch.Worker.Interfaces;
|
|||||||
interface IOnspringService
|
interface IOnspringService
|
||||||
{
|
{
|
||||||
Task<List<SearchRequest>> GetSearchRequestsAsync();
|
Task<List<SearchRequest>> GetSearchRequestsAsync();
|
||||||
|
Task<Result> AddSearchResultAsync(SearchResult result);
|
||||||
}
|
}
|
||||||
@@ -2,6 +2,7 @@ namespace SanctionsSearch.Worker.Models;
|
|||||||
|
|
||||||
class SearchRequest
|
class SearchRequest
|
||||||
{
|
{
|
||||||
|
public int Id { get; init; }
|
||||||
public string Name { get; set; } = string.Empty;
|
public string Name { get; set; } = string.Empty;
|
||||||
public string Address { get; set; } = string.Empty;
|
public string Address { get; set; } = string.Empty;
|
||||||
public string City { get; set; } = string.Empty;
|
public string City { get; set; } = string.Empty;
|
||||||
|
|||||||
@@ -0,0 +1,6 @@
|
|||||||
|
namespace SanctionsSearch.Worker.Models;
|
||||||
|
|
||||||
|
class SearchResult
|
||||||
|
{
|
||||||
|
// TODO: Add properties to represent the search result
|
||||||
|
}
|
||||||
@@ -69,17 +69,18 @@ class Program
|
|||||||
|
|
||||||
builder.Services.AddSingleton(TimeProvider.System);
|
builder.Services.AddSingleton(TimeProvider.System);
|
||||||
|
|
||||||
builder.Services
|
builder.Services.AddHttpClient();
|
||||||
.AddHttpClient<IOfacFileService, OfacFileService>()
|
builder.Services.ConfigureHttpClientDefaults(builder => builder.AddStandardResilienceHandler());
|
||||||
.AddStandardResilienceHandler();
|
builder.Services.AddScoped<IOnspringClient>(sp =>
|
||||||
|
{
|
||||||
|
var options = sp.GetRequiredService<OnspringOptions>();
|
||||||
|
var httpClient = sp.GetRequiredService<HttpClient>();
|
||||||
|
httpClient.BaseAddress = new Uri(options.BaseUrl);
|
||||||
|
return new OnspringClient(options.ApiKey, httpClient);
|
||||||
|
});
|
||||||
|
|
||||||
builder.Services
|
builder.Services.AddScoped<IOfacFileService, OfacFileService>();
|
||||||
.AddHttpClient<IOnspringService, OnspringService>((sp, client) =>
|
builder.Services.AddScoped<IOnspringService, OnspringService>();
|
||||||
{
|
|
||||||
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>();
|
||||||
|
|||||||
@@ -1,26 +1,39 @@
|
|||||||
|
|
||||||
namespace SanctionsSearch.Worker.Services;
|
namespace SanctionsSearch.Worker.Services;
|
||||||
|
|
||||||
class OnspringService(
|
class OnspringService(
|
||||||
HttpClient httpClient,
|
IOnspringClient client,
|
||||||
OnspringOptions options,
|
OnspringOptions options,
|
||||||
ILogger<OnspringService> logger
|
ILogger<OnspringService> logger
|
||||||
) : IOnspringService
|
) : IOnspringService
|
||||||
{
|
{
|
||||||
private readonly IOnspringClient _client = new OnspringClient(options.ApiKey, httpClient);
|
private readonly OnspringOptions _options = options;
|
||||||
private readonly ILogger<OnspringService> _logger = logger;
|
private readonly ILogger<OnspringService> _logger = logger;
|
||||||
|
private readonly IOnspringClient _client = client;
|
||||||
|
|
||||||
|
public Task<Result> AddSearchResultAsync(SearchResult result)
|
||||||
|
{
|
||||||
|
// TODO: Implement this method
|
||||||
|
// - we should add a new record for each hit
|
||||||
|
// - each new hit record should reference the request
|
||||||
|
// - we should update the request status to processed
|
||||||
|
// - we should return a Result indicating success or failure
|
||||||
|
throw new NotImplementedException();
|
||||||
|
}
|
||||||
|
|
||||||
public async Task<List<SearchRequest>> GetSearchRequestsAsync()
|
public async Task<List<SearchRequest>> GetSearchRequestsAsync()
|
||||||
{
|
{
|
||||||
var queryRequest = new QueryRecordsRequest()
|
var queryRequest = new QueryRecordsRequest()
|
||||||
{
|
{
|
||||||
AppId = options.SearchRequestOptions.AppId,
|
AppId = _options.SearchRequestOptions.AppId,
|
||||||
|
Filter = $"{_options.SearchRequestOptions.StatusFieldId} contains '{_options.SearchRequestOptions.AwaitingProcessingStatusId}'",
|
||||||
FieldIds = [
|
FieldIds = [
|
||||||
options.SearchRequestOptions.NameFieldId,
|
_options.SearchRequestOptions.NameFieldId,
|
||||||
options.SearchRequestOptions.AddressFieldId,
|
_options.SearchRequestOptions.AddressFieldId,
|
||||||
options.SearchRequestOptions.CityFieldId,
|
_options.SearchRequestOptions.CityFieldId,
|
||||||
options.SearchRequestOptions.StateFieldId,
|
_options.SearchRequestOptions.StateFieldId,
|
||||||
options.SearchRequestOptions.ZipFieldId,
|
_options.SearchRequestOptions.ZipFieldId,
|
||||||
options.SearchRequestOptions.CountryFieldId
|
_options.SearchRequestOptions.CountryFieldId
|
||||||
],
|
],
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -42,7 +55,35 @@ class OnspringService(
|
|||||||
|
|
||||||
if (initialResponse.Value.HasMorePages())
|
if (initialResponse.Value.HasMorePages())
|
||||||
{
|
{
|
||||||
// TODO: Fan out and collect remaining pages
|
var remainingPageNumbers = Enumerable.Range(initialResponse.Value.PageNumber + 1, initialResponse.Value.TotalPages - 1);
|
||||||
|
var pagingRequests = remainingPageNumbers.Select(num => new PagingRequest { PageNumber = num });
|
||||||
|
var remainingRequests = pagingRequests.Select(async pageRequest =>
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var res = await _client.QueryRecordsAsync(queryRequest, pageRequest);
|
||||||
|
|
||||||
|
if (res.IsSuccessful is false)
|
||||||
|
{
|
||||||
|
_logger.LogError(
|
||||||
|
"Failed to retrieve search requests for page {PageNumber}: {StatusCode} - {Error}",
|
||||||
|
pageRequest.PageNumber,
|
||||||
|
res.StatusCode,
|
||||||
|
res.Message
|
||||||
|
);
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
res.Value.Items.ForEach(records.Add);
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
_logger.LogError(ex, "Failed to retrieve search requests for page {PageNumber}", pageRequest.PageNumber);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
await Task.WhenAll(remainingRequests);
|
||||||
}
|
}
|
||||||
|
|
||||||
return records.Select(MapRecordToSearchRequest).ToList();
|
return records.Select(MapRecordToSearchRequest).ToList();
|
||||||
@@ -50,31 +91,34 @@ class OnspringService(
|
|||||||
|
|
||||||
private SearchRequest MapRecordToSearchRequest(ResultRecord record)
|
private SearchRequest MapRecordToSearchRequest(ResultRecord record)
|
||||||
{
|
{
|
||||||
var searchRequest = new SearchRequest();
|
var searchRequest = new SearchRequest
|
||||||
|
{
|
||||||
|
Id = record.RecordId
|
||||||
|
};
|
||||||
|
|
||||||
foreach (var field in record.FieldData)
|
foreach (var field in record.FieldData)
|
||||||
{
|
{
|
||||||
if (field.FieldId == options.SearchRequestOptions.NameFieldId)
|
if (field.FieldId == _options.SearchRequestOptions.NameFieldId)
|
||||||
{
|
{
|
||||||
searchRequest.Name = field.GetStringValue();
|
searchRequest.Name = field.GetStringValue();
|
||||||
}
|
}
|
||||||
else if (field.FieldId == options.SearchRequestOptions.AddressFieldId)
|
else if (field.FieldId == _options.SearchRequestOptions.AddressFieldId)
|
||||||
{
|
{
|
||||||
searchRequest.Address = field.GetStringValue();
|
searchRequest.Address = field.GetStringValue();
|
||||||
}
|
}
|
||||||
else if (field.FieldId == options.SearchRequestOptions.CityFieldId)
|
else if (field.FieldId == _options.SearchRequestOptions.CityFieldId)
|
||||||
{
|
{
|
||||||
searchRequest.City = field.GetStringValue();
|
searchRequest.City = field.GetStringValue();
|
||||||
}
|
}
|
||||||
else if (field.FieldId == options.SearchRequestOptions.StateFieldId)
|
else if (field.FieldId == _options.SearchRequestOptions.StateFieldId)
|
||||||
{
|
{
|
||||||
searchRequest.State = field.GetStringValue();
|
searchRequest.State = field.GetStringValue();
|
||||||
}
|
}
|
||||||
else if (field.FieldId == options.SearchRequestOptions.ZipFieldId)
|
else if (field.FieldId == _options.SearchRequestOptions.ZipFieldId)
|
||||||
{
|
{
|
||||||
searchRequest.Zip = field.GetStringValue();
|
searchRequest.Zip = field.GetStringValue();
|
||||||
}
|
}
|
||||||
else if (field.FieldId == options.SearchRequestOptions.CountryFieldId)
|
else if (field.FieldId == _options.SearchRequestOptions.CountryFieldId)
|
||||||
{
|
{
|
||||||
searchRequest.Country = field.GetStringValue();
|
searchRequest.Country = field.GetStringValue();
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user