proposal-system/api/src/ProposalSystem.Infrastructure/Services/SiteService.cs

53 lines
1.5 KiB
C#
Raw Normal View History

using Amazon.DynamoDBv2;
using Amazon.DynamoDBv2.Model;
using ProposalSystem.Application.DTOs;
using ProposalSystem.Application.Interfaces;
namespace ProposalSystem.Infrastructure.Services;
public class SiteService : ISiteService
{
private readonly IAmazonDynamoDB _dynamo;
private const string TableName = "verified-sites";
public SiteService(IAmazonDynamoDB dynamo)
{
_dynamo = dynamo;
}
public async Task<IReadOnlyList<SiteResponse>> SearchAsync(string query, CancellationToken ct = default)
{
var upper = query.ToUpper();
var request = new ScanRequest
{
TableName = TableName,
FilterExpression = "contains(siteCode, :q)",
ExpressionAttributeValues = new Dictionary<string, AttributeValue>
{
{ ":q", new AttributeValue { S = upper } }
},
Limit = 20,
};
var response = await _dynamo.ScanAsync(request, ct);
return response.Items
.Select(item => new SiteResponse(
GetString(item, "siteCode") ?? "",
GetString(item, "fullAddress"),
GetString(item, "address"),
GetString(item, "city"),
GetString(item, "state"),
GetString(item, "zip")
))
.OrderBy(s => s.SiteCode)
.ToList();
}
private static string? GetString(Dictionary<string, AttributeValue> item, string key)
{
return item.TryGetValue(key, out var attr) ? attr.S : null;
}
}