diff --git a/src/SanctionsSearch.Worker.Tests/Usings.cs b/src/SanctionsSearch.Worker.Tests/Usings.cs index 3573f5b..900d184 100644 --- a/src/SanctionsSearch.Worker.Tests/Usings.cs +++ b/src/SanctionsSearch.Worker.Tests/Usings.cs @@ -14,10 +14,9 @@ global using Moq; global using RichardSzalay.MockHttp; +global using SanctionsSearch.Worker.Interfaces; global using SanctionsSearch.Worker.Models; global using SanctionsSearch.Worker.Options; global using SanctionsSearch.Worker.Persistence; global using SanctionsSearch.Worker.Services; global using SanctionsSearch.Worker.Tests.Faker; -global using SanctionsSearch.Worker.Interfaces; - diff --git a/src/SanctionsSearch.Worker/Extensions/GetPagedRecordsResponseExtensions.cs b/src/SanctionsSearch.Worker/Extensions/GetPagedRecordsResponseExtensions.cs new file mode 100644 index 0000000..4e362ea --- /dev/null +++ b/src/SanctionsSearch.Worker/Extensions/GetPagedRecordsResponseExtensions.cs @@ -0,0 +1,9 @@ +namespace SanctionsSearch.Worker.Extensions; + +static class GetPagedRecordsResponseExtensions +{ + public static bool HasMorePages(this GetPagedRecordsResponse response) + { + return response.PageNumber < response.TotalPages; + } +} \ No newline at end of file diff --git a/src/SanctionsSearch.Worker/Extensions/RecordFieldValueExtensions.cs b/src/SanctionsSearch.Worker/Extensions/RecordFieldValueExtensions.cs new file mode 100644 index 0000000..18ccf77 --- /dev/null +++ b/src/SanctionsSearch.Worker/Extensions/RecordFieldValueExtensions.cs @@ -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; +} \ No newline at end of file diff --git a/src/SanctionsSearch.Worker/Interfaces/IOnspringService.cs b/src/SanctionsSearch.Worker/Interfaces/IOnspringService.cs index 0803de8..d5cd0ee 100644 --- a/src/SanctionsSearch.Worker/Interfaces/IOnspringService.cs +++ b/src/SanctionsSearch.Worker/Interfaces/IOnspringService.cs @@ -2,4 +2,5 @@ namespace SanctionsSearch.Worker.Interfaces; interface IOnspringService { + Task> GetSearchRequestsAsync(); } \ No newline at end of file diff --git a/src/SanctionsSearch.Worker/Migrations/20240822235325_add_addresses_and_comments_to_sdn.cs b/src/SanctionsSearch.Worker/Migrations/20240822235325_add_addresses_and_comments_to_sdn.cs index c3f528b..d654b3e 100644 --- a/src/SanctionsSearch.Worker/Migrations/20240822235325_add_addresses_and_comments_to_sdn.cs +++ b/src/SanctionsSearch.Worker/Migrations/20240822235325_add_addresses_and_comments_to_sdn.cs @@ -4,19 +4,19 @@ namespace SanctionsSearch.Worker.Migrations { + /// + public partial class add_addresses_and_comments_to_sdn : Migration + { /// - public partial class add_addresses_and_comments_to_sdn : Migration + protected override void Up(MigrationBuilder migrationBuilder) { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - - } } -} + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + + } + } +} \ No newline at end of file diff --git a/src/SanctionsSearch.Worker/Models/SdnMap.cs b/src/SanctionsSearch.Worker/Models/SdnMap.cs index 6c5cbf5..7afb4cd 100644 --- a/src/SanctionsSearch.Worker/Models/SdnMap.cs +++ b/src/SanctionsSearch.Worker/Models/SdnMap.cs @@ -17,4 +17,4 @@ class SdnMap : ClassMap Map(m => m.VesselOwner).Index(10).TypeConverter(); Map(m => m.Remarks).Index(11).TypeConverter(); } -} +} \ No newline at end of file diff --git a/src/SanctionsSearch.Worker/Models/SearchRequest.cs b/src/SanctionsSearch.Worker/Models/SearchRequest.cs new file mode 100644 index 0000000..ced813c --- /dev/null +++ b/src/SanctionsSearch.Worker/Models/SearchRequest.cs @@ -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; +} \ No newline at end of file diff --git a/src/SanctionsSearch.Worker/Program.cs b/src/SanctionsSearch.Worker/Program.cs index 7838353..2a05916 100644 --- a/src/SanctionsSearch.Worker/Program.cs +++ b/src/SanctionsSearch.Worker/Program.cs @@ -73,6 +73,14 @@ class Program .AddHttpClient() .AddStandardResilienceHandler(); + builder.Services + .AddHttpClient((sp, client) => + { + var options = sp.GetRequiredService(); + client.BaseAddress = new Uri(options.BaseUrl); + }) + .AddStandardResilienceHandler(); + builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); diff --git a/src/SanctionsSearch.Worker/Services/OnspringService.cs b/src/SanctionsSearch.Worker/Services/OnspringService.cs index 7eddc3e..7ebb4ae 100644 --- a/src/SanctionsSearch.Worker/Services/OnspringService.cs +++ b/src/SanctionsSearch.Worker/Services/OnspringService.cs @@ -1,5 +1,85 @@ namespace SanctionsSearch.Worker.Services; -class OnspringService : IOnspringService +class OnspringService( + HttpClient httpClient, + OnspringOptions options, + ILogger logger +) : IOnspringService { + private readonly IOnspringClient _client = new OnspringClient(options.ApiKey, httpClient); + private readonly ILogger _logger = logger; + + public async Task> 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(); + + 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; + } } \ No newline at end of file diff --git a/src/SanctionsSearch.Worker/Usings.cs b/src/SanctionsSearch.Worker/Usings.cs index 8317b5b..959c9c5 100644 --- a/src/SanctionsSearch.Worker/Usings.cs +++ b/src/SanctionsSearch.Worker/Usings.cs @@ -1,12 +1,22 @@ +global using System.Collections.Concurrent; +global using System.Globalization; global using System.Linq.Expressions; global using System.Reflection; +global using CsvHelper; +global using CsvHelper.Configuration; + global using FluentResults; global using Microsoft.Data.Sqlite; global using Microsoft.EntityFrameworkCore; 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.Models; global using SanctionsSearch.Worker.Options; @@ -19,7 +29,3 @@ global using Serilog; global using Serilog.Context; global using Serilog.Exceptions; global using Serilog.Formatting.Compact; - -global using System.Globalization; -global using CsvHelper; -global using CsvHelper.Configuration; \ No newline at end of file