diff --git a/src/TextServices.Builder.Api/Services/Notifications/SnsJobNotifier.cs b/src/TextServices.Builder.Api/Services/Notifications/SnsJobNotifier.cs index 3391275..24e4fc8 100644 --- a/src/TextServices.Builder.Api/Services/Notifications/SnsJobNotifier.cs +++ b/src/TextServices.Builder.Api/Services/Notifications/SnsJobNotifier.cs @@ -1,4 +1,5 @@ using System.Text.Json; +using System.Text.Json.Serialization; using Amazon.SimpleNotificationService; using Amazon.SimpleNotificationService.Model; using Microsoft.Extensions.Options; @@ -12,6 +13,13 @@ internal sealed class SnsJobNotifier( IOptions options, ILogger logger) : IJobNotifier { + private static readonly JsonSerializerOptions SerializerOptions = new() + { + PropertyNamingPolicy = JsonNamingPolicy.CamelCase, + Converters = { new JsonStringEnumConverter() }, + DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull, + }; + public async Task Notify(JobCompletionNotification notification, CancellationToken ct = default) { var topicArn = options.Value.Notifications.TopicArn; @@ -25,7 +33,7 @@ public async Task Notify(JobCompletionNotification notification, CancellationTok await sns.PublishAsync(new PublishRequest { TopicArn = topicArn, - Message = JsonSerializer.Serialize(notification), + Message = JsonSerializer.Serialize(notification, SerializerOptions), MessageAttributes = new Dictionary { ["MessageType"] = new() diff --git a/src/TextServices.Builder.Api/TextServices.Builder.Api.csproj b/src/TextServices.Builder.Api/TextServices.Builder.Api.csproj index 2d4814a..7a1c499 100644 --- a/src/TextServices.Builder.Api/TextServices.Builder.Api.csproj +++ b/src/TextServices.Builder.Api/TextServices.Builder.Api.csproj @@ -16,7 +16,7 @@ - + runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/src/TextServices.Search.Api/TextServices.Search.Api.csproj b/src/TextServices.Search.Api/TextServices.Search.Api.csproj index 9a111c4..2fa1628 100644 --- a/src/TextServices.Search.Api/TextServices.Search.Api.csproj +++ b/src/TextServices.Search.Api/TextServices.Search.Api.csproj @@ -10,7 +10,7 @@ - + diff --git a/src/TextServices.Tests/BuilderApi/SnsJobNotifierTests.cs b/src/TextServices.Tests/BuilderApi/SnsJobNotifierTests.cs index 4efcf60..18ce0e6 100644 --- a/src/TextServices.Tests/BuilderApi/SnsJobNotifierTests.cs +++ b/src/TextServices.Tests/BuilderApi/SnsJobNotifierTests.cs @@ -78,6 +78,26 @@ public async Task Notify_SetsMessageTypeAttribute(JobStatus status, string expec .MustHaveHappenedOnceExactly(); } + [Fact] + public async Task Notify_SerialisesMessageWithCamelCaseStringEnumAndOmitsNullErrors() + { + var sns = A.Fake(); + PublishRequest? captured = null; + A.CallTo(() => sns.PublishAsync(A._, A._)) + .Invokes((PublishRequest r, CancellationToken _) => captured = r) + .Returns(new PublishResponse()); + + var sut = MakeNotifier(sns, "arn:aws:sns:eu-west-1:123:test-topic"); + + await sut.Notify(MakeNotification("books/b123", JobStatus.Waiting)); + + captured.ShouldNotBeNull(); + var message = captured.Message; + message.ShouldContain("\"jobId\":\"books/b123\""); + message.ShouldContain("\"status\":\"Waiting\""); + message.ShouldNotContain("errors"); + } + // ------------------------------------------------------------------------- // Error handling // -------------------------------------------------------------------------