Updated HeaderQueryBehavior to handle null or missing REQUEST_HEADER gracefully by logging warnings and setting action.IsReturnedNoData.HeaderQuery to true instead of throwing exceptions. Enhanced log messages for failed RawHeader deserialization to improve clarity and added pipeline continuity by calling await next(cancel). Refactored log formatting for consistency.
47 lines
1.7 KiB
C#
47 lines
1.7 KiB
C#
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<TRecAction>(IRecDbContext dbContext, ILogger<HeaderQueryBehavior<TRecAction>>? logger = null) : IPipelineBehavior<TRecAction, Unit>
|
|
where TRecAction : RecActionDto
|
|
{
|
|
public async Task<Unit> Handle(TRecAction action, RequestHandlerDelegate<Unit> 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<Dictionary<string, JsonElement>>(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);
|
|
}
|
|
}
|