From f44caba9064da64d7b8a2cd98f94f02051f7e2db Mon Sep 17 00:00:00 2001 From: Adam Moussa <166072409+amoussa1229@users.noreply.github.com> Date: Wed, 20 May 2026 17:23:55 -0400 Subject: [PATCH] Fix JSON enum serialization and audit log jsonb format Add JsonStringEnumConverter so string enum values (ServiceCategory, Priority, PricingMode, LineItemSource) deserialize correctly from frontend requests. Wrap AuditService detail strings in a JSON object to satisfy the Postgres jsonb column type. Relax global.json SDK version to match installed 8.0.1xx feature band. --- api/global.json | 2 +- api/src/ProposalSystem.Api/Program.cs | 3 +++ .../ProposalSystem.Infrastructure/Services/AuditService.cs | 7 ++++++- 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/api/global.json b/api/global.json index ae9f38c..391ba3c 100644 --- a/api/global.json +++ b/api/global.json @@ -1,6 +1,6 @@ { "sdk": { - "version": "8.0.400", + "version": "8.0.100", "rollForward": "latestFeature" } } diff --git a/api/src/ProposalSystem.Api/Program.cs b/api/src/ProposalSystem.Api/Program.cs index b3ac383..088f998 100644 --- a/api/src/ProposalSystem.Api/Program.cs +++ b/api/src/ProposalSystem.Api/Program.cs @@ -137,6 +137,9 @@ builder.Services.AddValidatorsFromAssemblyContaining(); builder.Services.AddControllers(options => { options.Filters.Add(); +}).AddJsonOptions(options => +{ + options.JsonSerializerOptions.Converters.Add(new System.Text.Json.Serialization.JsonStringEnumConverter()); }); // Middleware diff --git a/api/src/ProposalSystem.Infrastructure/Services/AuditService.cs b/api/src/ProposalSystem.Infrastructure/Services/AuditService.cs index 9909d9a..355fea8 100644 --- a/api/src/ProposalSystem.Infrastructure/Services/AuditService.cs +++ b/api/src/ProposalSystem.Infrastructure/Services/AuditService.cs @@ -1,3 +1,4 @@ +using System.Text.Json; using ProposalSystem.Application.Interfaces; using ProposalSystem.Domain.Entities; using ProposalSystem.Infrastructure.Data; @@ -17,13 +18,17 @@ public class AuditService : IAuditService public async Task LogAsync(AuditAction action, Guid? proposalId, string? details = null, CancellationToken ct = default) { + var jsonDetails = details != null + ? JsonSerializer.Serialize(new { message = details }) + : null; + var entry = new AuditLog { Id = Guid.NewGuid(), ProposalId = proposalId, UserId = _currentUser.UserId, Action = action, - Details = details, + Details = jsonDetails, Timestamp = DateTime.UtcNow, IpAddress = _currentUser.IpAddress, };