30 lines
1.2 KiB
C#
30 lines
1.2 KiB
C#
namespace LiteCharms.Features.Mediator;
|
|
|
|
public sealed class LoggingPipelineBehavior<TRequest, TResponse>(ILogger<LoggingPipelineBehavior<TRequest, TResponse>> logger) :
|
|
IPipelineBehavior<TRequest, TResponse?>
|
|
where TRequest : IRequest<TResponse>
|
|
where TResponse : ResultBase, new()
|
|
{
|
|
public async ValueTask<TResponse?> Handle(TRequest message, MessageHandlerDelegate<TRequest, TResponse?> next, CancellationToken cancellationToken)
|
|
{
|
|
TResponse? response = await next(message, cancellationToken);
|
|
|
|
if (response is null)
|
|
logger.LogCritical("{Request} {TypeName} was returned as null", typeof(TRequest).Name, typeof(TRequest).Name);
|
|
|
|
if(response?.IsFailed == true || response?.Errors?.Any() == true)
|
|
{
|
|
foreach (var error in response.Errors)
|
|
{
|
|
if (!string.IsNullOrWhiteSpace(error.Message))
|
|
logger.LogWarning("{Request} {Error}", typeof(TRequest).Name, error.Message);
|
|
|
|
if (error?.Reasons?.Count > 0)
|
|
error.Reasons.ForEach(r => logger.LogError("{Request} {Reason}", typeof(TRequest).Name, r.ToString()));
|
|
}
|
|
}
|
|
|
|
return response;
|
|
}
|
|
}
|