using MediatR; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Logging; using ReC.Application.Common.Dto; using ReC.Application.Common.Interfaces; using System.Text.Json; namespace ReC.Application.Common.Behaviors; public class HeaderQueryBehavior(IRecDbContext dbContext, ILogger>? logger = null) : IPipelineBehavior where TRecAction : RecActionDto { public async Task Handle(TRecAction action, RequestHandlerDelegate next, CancellationToken cancel) { if (action.HeaderQuery is null) return await next(cancel); var result = await dbContext.HeaderQueryResults.FromSqlRaw(action.HeaderQuery).FirstOrDefaultAsync(cancel); if(result?.RawHeader is null) { logger?.LogWarning("Header query did not return a result or returned a null REQUEST_HEADER. Profile ID: {ProfileId}, Action ID: {ActionId}", action.ProfileId, action.ActionId); action.IsReturnedNoData.HeaderQuery = true; return await next(cancel); } var headerDict = JsonSerializer.Deserialize>(result.RawHeader); if(headerDict is null) { logger?.LogWarning( "Header JSON deserialization returned null. RawHeader: {RawHeader}, ProfileId: {ProfileId}, ActionId: {ActionId}", result.RawHeader, action.ProfileId, action.ActionId); action.IsReturnedNoData.HeaderQuery = true; return await next(cancel); } action.Headers = headerDict.ToDictionary(header => header.Key, kvp => kvp.Value.ToString()); return await next(cancel); } }