101 lines
3.4 KiB
C#
101 lines
3.4 KiB
C#
using ApplicationSystem.MediatRHelper.Models;
|
||
using MediatR;
|
||
using Microsoft.Extensions.Logging;
|
||
using System.Net;
|
||
|
||
namespace ApplicationSystem.MediatRHelper.AbstractHandlers
|
||
{
|
||
/// <summary>
|
||
/// Абстрактный обработчик команды
|
||
/// </summary>
|
||
/// <typeparam name="TRequest"></typeparam>
|
||
public abstract class AbstractCommandHandler<TRequest>(ILogger logger)
|
||
: IRequestHandler<TRequest, ResponseModel> where TRequest : IRequestModel
|
||
{
|
||
private readonly ILogger _logger = logger;
|
||
|
||
/// <summary>
|
||
/// Обработчик
|
||
/// </summary>
|
||
/// <param name="request"></param>
|
||
/// <param name="cancellationToken"></param>
|
||
/// <returns></returns>
|
||
protected abstract Task<ResponseModel> HandleAsync(
|
||
TRequest request, CancellationToken cancellationToken);
|
||
|
||
public async Task<ResponseModel> 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()
|
||
{
|
||
ResponseStatusCode = HttpStatusCode.InternalServerError,
|
||
};
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// Успешный результат
|
||
/// </summary>
|
||
/// <returns></returns>
|
||
protected ResponseModel Ok() => new()
|
||
{
|
||
ResponseStatusCode = HttpStatusCode.OK,
|
||
};
|
||
|
||
/// <summary>
|
||
/// Неверный запрос
|
||
/// </summary>
|
||
/// <returns></returns>
|
||
protected ResponseModel BadRequest() => new()
|
||
{
|
||
ResponseStatusCode = HttpStatusCode.BadRequest,
|
||
};
|
||
|
||
/// <summary>
|
||
/// Результат с кодом
|
||
/// </summary>
|
||
/// <param name="statusCode"></param>
|
||
/// <returns></returns>
|
||
protected ResponseModel StatusCode(int statusCode) => new()
|
||
{
|
||
ResponseStatusCode = (HttpStatusCode)statusCode,
|
||
};
|
||
|
||
/// <summary>
|
||
/// Результат с кодом
|
||
/// </summary>
|
||
/// <param name="statusCode"></param>
|
||
/// <returns></returns>
|
||
protected ResponseModel StatusCode(HttpStatusCode statusCode) => new()
|
||
{
|
||
ResponseStatusCode = statusCode,
|
||
};
|
||
|
||
/// <summary>
|
||
/// Проброс не успешного результата
|
||
/// </summary>
|
||
/// <typeparam name="TSource"></typeparam>
|
||
/// <param name="sourceResponse"></param>
|
||
/// <returns></returns>
|
||
protected ResponseModel ErrorResponse<TSource>(
|
||
ResponseModel<TSource> sourceResponse) => sourceResponse;
|
||
|
||
/// <summary>
|
||
/// Проброс не успешного результата
|
||
/// </summary>
|
||
/// <param name="sourceResponse"></param>
|
||
/// <returns></returns>
|
||
protected ResponseModel ErrorResponse(
|
||
ResponseModel sourceResponse) => sourceResponse;
|
||
}
|
||
}
|