using CoreAgent.Domain.Models.Common; using MediatR; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Logging; using System.Net; namespace CoreAgent.API.Controllers { [ApiController] [Route("api/v{version:apiVersion}/[controller]")] public abstract class BaseApiController : ControllerBase { protected readonly IMediator _mediator; protected readonly ILogger _logger; protected BaseApiController(IMediator mediator, ILogger logger) { _mediator = mediator ?? throw new ArgumentNullException(nameof(mediator)); _logger = logger ?? throw new ArgumentNullException(nameof(logger)); } protected async Task HandleRequest(TRequest request) where TRequest : IRequest { try { _logger.LogInformation("Handling request of type {RequestType}", typeof(TRequest).Name); var response = await _mediator.Send(request); return ApiActionResult.Ok(response); } catch (Exception ex) { return HandleException(ex); } } protected async Task HandleRequest(TRequest request) where TRequest : IRequest { try { _logger.LogInformation("Handling request of type {RequestType}", typeof(TRequest).Name); await _mediator.Send(request); return ApiActionResult.Ok(); } catch (Exception ex) { return HandleException(ex); } } private IActionResult HandleException(Exception ex) { _logger.LogError(ex, "Error handling request"); return ApiActionResult.Error(ex.Message, "INTERNAL_ERROR", HttpStatusCode.InternalServerError); } private IActionResult HandleException(Exception ex) { _logger.LogError(ex, "Error handling request"); return ApiActionResult.Error(ex.Message, "INTERNAL_ERROR", HttpStatusCode.InternalServerError); } protected IActionResult Success(T data, string message = null) => ApiActionResult.Ok(data, message); protected IActionResult Success(string message = null) => ApiActionResult.Ok(message); protected IActionResult Error(string message, string errorCode = "ERROR", HttpStatusCode statusCode = HttpStatusCode.BadRequest) => ApiActionResult.Error(message, errorCode, statusCode); protected IActionResult Error(string message, string errorCode = "ERROR", HttpStatusCode statusCode = HttpStatusCode.BadRequest) => ApiActionResult.Error(message, errorCode, statusCode); } }