using CoreAgent.Domain.Models; 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 new ApiActionResult(ApiResponse.CreateSuccess(response)); } catch (Exception ex) { _logger.LogError(ex, "Error handling request of type {RequestType}", typeof(TRequest).Name); return new ApiActionResult( ApiResponse.CreateError(ex.Message), HttpStatusCode.InternalServerError ); } } 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 new ApiActionResult(ApiResponse.CreateSuccess()); } catch (Exception ex) { _logger.LogError(ex, "Error handling request of type {RequestType}", typeof(TRequest).Name); return new ApiActionResult( ApiResponse.CreateError(ex.Message), HttpStatusCode.InternalServerError ); } } protected IActionResult Success(T data, string message = null) { return new ApiActionResult(ApiResponse.CreateSuccess(data, message)); } protected IActionResult Success(string message = null) { return new ApiActionResult(ApiResponse.CreateSuccess(message)); } protected IActionResult Error(string message, List errors = null, HttpStatusCode statusCode = HttpStatusCode.BadRequest) { return new ApiActionResult(ApiResponse.CreateError(message, errors), statusCode); } protected IActionResult Error(string message, List errors = null, HttpStatusCode statusCode = HttpStatusCode.BadRequest) { return new ApiActionResult(ApiResponse.CreateError(message, errors), statusCode); } } }