107 lines
3.7 KiB
C#
107 lines
3.7 KiB
C#
using ApplicationSystem.MediatRHelper.Models;
|
||
using MediatR;
|
||
using Microsoft.Extensions.Logging;
|
||
using System.Net;
|
||
|
||
namespace ApplicationSystem.MediatRHelper.AbstractHandlers
|
||
{
|
||
/// <summary>
|
||
/// Абстрактный обработчик запроса
|
||
/// </summary>
|
||
public abstract class AbstractQueryHandler<TRequest, TResponse>(
|
||
ILogger logger)
|
||
: IRequestHandler<TRequest, ResponseModel<TResponse>> where TRequest : IRequestModel<TResponse>
|
||
{
|
||
protected readonly ILogger _logger = logger;
|
||
|
||
/// <summary>
|
||
/// Обработчик
|
||
/// </summary>
|
||
/// <param name="request"></param>
|
||
/// <param name="cancellationToken"></param>
|
||
/// <returns></returns>
|
||
protected abstract Task<ResponseModel<TResponse>> HandleAsync(
|
||
TRequest request, CancellationToken cancellationToken);
|
||
|
||
public async Task<ResponseModel<TResponse>> Handle(TRequest request, CancellationToken cancellationToken)
|
||
{
|
||
try
|
||
{
|
||
var response = await HandleAsync(request, cancellationToken);
|
||
_logger.LogInformation("Обработчик {handlerName} успешно завершил работу", GetType().FullName);
|
||
return response;
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
_logger.LogError(ex, "Ошибка в обработчике {handlerName}", GetType().FullName);
|
||
|
||
return new ResponseModel<TResponse>()
|
||
{
|
||
ResponseStatusCode = HttpStatusCode.InternalServerError,
|
||
};
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// Успешный результат
|
||
/// </summary>
|
||
/// <returns></returns>
|
||
protected ResponseModel<TResponse> Ok() => new()
|
||
{
|
||
ResponseStatusCode = HttpStatusCode.OK,
|
||
};
|
||
|
||
/// <summary>
|
||
/// Неверный запрос
|
||
/// </summary>
|
||
/// <returns></returns>
|
||
protected ResponseModel<TResponse> BadRequest() => new()
|
||
{
|
||
ResponseStatusCode = HttpStatusCode.BadRequest,
|
||
};
|
||
|
||
/// <summary>
|
||
/// Результат с кодом
|
||
/// </summary>
|
||
/// <param name="statusCode"></param>
|
||
/// <returns></returns>
|
||
protected ResponseModel<TResponse> StatusCode(int statusCode) => new()
|
||
{
|
||
ResponseStatusCode = (HttpStatusCode)statusCode,
|
||
};
|
||
|
||
/// <summary>
|
||
/// Результат с кодом
|
||
/// </summary>
|
||
/// <param name="statusCode"></param>
|
||
/// <returns></returns>
|
||
protected ResponseModel<TResponse> StatusCode(HttpStatusCode statusCode) => new()
|
||
{
|
||
ResponseStatusCode = statusCode,
|
||
};
|
||
|
||
/// <summary>
|
||
/// Проброс не успешного результата
|
||
/// </summary>
|
||
/// <typeparam name="TSource"></typeparam>
|
||
/// <param name="sourceResponse"></param>
|
||
/// <returns></returns>
|
||
protected ResponseModel<TResponse> ErrorResponse<TSource>(
|
||
ResponseModel<TSource> sourceResponse) => new()
|
||
{
|
||
ResponseStatusCode = sourceResponse.ResponseStatusCode,
|
||
};
|
||
|
||
/// <summary>
|
||
/// Проброс не успешного результата
|
||
/// </summary>
|
||
/// <param name="sourceResponse"></param>
|
||
/// <returns></returns>
|
||
protected ResponseModel<TResponse> ErrorResponse(
|
||
ResponseModel sourceResponse) => new()
|
||
{
|
||
ResponseStatusCode = sourceResponse.ResponseStatusCode,
|
||
};
|
||
}
|
||
}
|