Em sua API, notifique suas regras de negócio ao invés de usar exceptions!
Faça a instalação da biblioteca via nuget: Install-Package Marraia.Notifications -Version 1.0.0
No arquivo Startup.cs de sua aplicação adicione no método ConfigureServices o middleware em específico:
public void ConfigureServices(IServiceCollection services)
{
..
..
services.AddSmartNotification();
}
Em suas regras de negócio ao invés de usar exceptions para saber, se alguma regra foi violada, notifique suas mensagens. Para suas API´s, você poderá especificar se as suas regras são de uma má requisição(Bad Request (400)) ou se alguma regra foi violada(Conflict (409))
public class UserAppService : IUserAppService
{
private readonly IUserRepository _userRepository;
private readonly ISmartNotification _notification;
public UserAppService(
ISmartNotification notification,
IUserRepository userRepository)
{
_notification = notification;
_userRepository = userRepository;
}
public async Task InsertAsync(UserInput user)
{
if (string.IsNullOrEmpty(user.Login)
|| string.IsNullOrEmpty(user.Password)
|| string.IsNullOrEmpty(user.Name))
{
_notification.NewNotificationBadRequest("Dados obrigatórios");
return;
}
if (user.Age < 18)
{
_notification.NewNotificationConflict("Usuário com menos de 18 anos");
return;
}
var login = new User(user.Login,
user.Password, user.Name);
await _userRepository
.InsertAsync(login)
.ConfigureAwait(false);
}
}
Depois de notificar suas regras de negócio ou validações, em sua controller utilize os métodos:
-OkOrNotFound() => Para métodos GET, se verifica caso tenha algum item, o método retornará o código HTTP Ok(200).
Caso não ter nenhum item, retornará o código HTTP NotFound(404)
-OkOrNoContent() => Para métodos GET, se verifica caso tenha alguma lista com itens, o método retornará o código HTTP Ok(200).
Caso não ter nenhum item na lista, retornará o código HTTP NoContent(204)
-AcceptedContent() => Para método PUT, caso a alteração foi com sucesso, retornará Accept(202).
Caso o recurso não foi encontrado, retornará NotFound(404).
Caso tenha notificação retornará as notificações específicas BadRequest(404) ou Conflict(409)
-CreatedContent() => Para método POST, caso a inserção foi com sucesso, retornará Created(201).
Caso tenha notificação retornará as notificações específicas BadRequest(404) ou Conflict(409)
Faça a herança da classe BaseController em sua controller, e faça a injeção da interface INotificationHandler no contrutor.
[Route("api/[controller]")]
[ApiController]
public class UserController : BaseController
{
private readonly IUserAppService _userAppService;
/// <summary>
///
/// </summary>
/// <param name="notification"></param>
/// <param name="itemAppService"></param>
/// <param name="accessor"></param>
public UserController(
INotificationHandler<DomainNotification> notification,
IUserAppService userAppService)
: base(notification)
{
_userAppService = userAppService;
}
/// <summary>
///
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpPost]
[ProducesResponseType(typeof(string), 201)]
[ProducesResponseType(400)]
[ProducesResponseType(500)]
public async Task<IActionResult> Post([FromBody] UserInput input)
{
return CreatedContent("", await _userAppService.InsertAsync(input));
}
}