using HrynCo.NotificationService.Web.Infrastructure; using HrynCo.NotificationService.Services.Core; using MediatR; using Microsoft.AspNetCore.Mvc; namespace HrynCo.NotificationService.Web.Controllers.Api; [Route("api/v1/[controller]")] [ApiController] public abstract class ApiControllerBase : ControllerBase { protected ApiControllerBase(IMediator mediator) { Mediator = mediator; } protected IMediator Mediator { get; } protected IActionResult FromServiceResult(ServiceResult result) => result.IsSuccess ? Ok(new ApiResponse { Success = true, Data = result.Result }) : MapServiceError(result.Error!); protected IActionResult CreatedFromServiceResult(ServiceResult result, string actionName, Func routeValues) => result.IsSuccess ? CreatedAtAction(actionName, routeValues(result.Result), new ApiResponse { Success = true, Data = result.Result }) : MapServiceError(result.Error!); protected IActionResult MapServiceError(ServiceError error) { string code = error.Code?.ToString() ?? "Unknown"; return error.Code switch { ServiceErrorCode.NotFound => NotFound(ErrorResponse(code, error.Message)), ServiceErrorCode.Conflict => Conflict(ErrorResponse(code, error.Message)), ServiceErrorCode.InvalidRequest => BadRequest(ErrorResponse(code, error.Message)), null => throw new InvalidOperationException("Error code was null for failed result."), _ => throw new ArgumentOutOfRangeException(nameof(error), error, "Unexpected error code.") }; } private static ApiResponse ErrorResponse(string code, string message) => new() { Success = false, Error = new ApiError { Code = code, Message = message } }; }