< Summary

Information
Class: CoWorkingApp.API.Infrastructure.Presentation.Controllers.ControllerGeneric<T1, T2, T3>
Assembly: CoWorkingApp.API
File(s): H:\Vicentico\Proyectos\CoWorkingApp Project\CoWorkingApp\CoWorkingApp.API\Infrastructure\Presentation\Controllers\ControllerGeneric.cs
Line coverage
100%
Covered lines: 87
Uncovered lines: 0
Coverable lines: 87
Total lines: 208
Line coverage: 100%
Branch coverage
100%
Covered branches: 14
Total branches: 14
Branch coverage: 100%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Cyclomatic complexity Line coverage
.ctor(...)100%4100%
HandleException(...)100%1100%
GetAll()100%8100%
GetById()100%2100%
Create()100%2100%
Update()100%2100%
Delete()100%2100%

File(s)

H:\Vicentico\Proyectos\CoWorkingApp Project\CoWorkingApp\CoWorkingApp.API\Infrastructure\Presentation\Controllers\ControllerGeneric.cs

#LineLine coverage
 1using CoWorkingApp.Core.Application.Abstracts;
 2using CoWorkingApp.Core.Application.Contracts.Requests;
 3using CoWorkingApp.Core.Application.Contracts.Services;
 4using Microsoft.AspNetCore.Mvc;
 5
 6namespace CoWorkingApp.API.Infrastructure.Presentation.Controllers
 7{
 8    /// <summary>
 9    /// Controlador genérico para operaciones CRUD básicas en entidades.
 10    /// </summary>
 11    /// <typeparam name="TService">Tipo de servicio que maneja las operaciones.</typeparam>
 12    /// <typeparam name="TRequest">Tipo de solicitud.</typeparam>
 13    /// <typeparam name="TResponse">Tipo de respuesta.</typeparam>
 14    [ApiController]
 15    public class ControllerGeneric<TService, TRequest, TResponse> : ControllerBase
 16        where TService : IService<TRequest, TResponse>  // Restricción para el tipo de servicio
 17        where TRequest : IRequest                       // Restricción para el tipo de solicitud
 18        where TResponse : ResponseMessage, new()        // Restricción para el tipo de respuesta
 19    {
 20        protected readonly TService _service;    // Instancia del servicio
 21        protected readonly ILogger _logger;      // Instancia del logger
 22
 23        /// <summary>
 24        /// Constructor del controlador genérico.
 25        /// </summary>
 26        /// <param name="service">Instancia del servicio.</param>
 27        /// <param name="logger">Instancia del logger.</param>
 9428        public ControllerGeneric(TService service, ILogger logger)
 9429        {
 9430            _service = service ?? throw new ArgumentNullException();
 9131            _logger = logger ?? throw new ArgumentNullException();
 8832        }
 33
 34        /// <summary>
 35        /// Maneja las excepciones y construye una respuesta de error coherente.
 36        /// </summary>
 37        protected TResponse HandleException(Exception ex)
 2138        {
 2139            return ResponseMessage.HandleException<TResponse>(ex);
 2140        }
 41
 42        /// <summary>
 43        /// Obtiene todos los elementos y devuelve una lista de entidades o un mensaje de error si ocurre un error.
 44        /// </summary>
 45        [HttpGet]
 46        public async Task<ActionResult<IEnumerable<TResponse>>> GetAll()
 2347        {
 48            try
 2349            {
 50                // Intenta obtener todas las entidades desde el servicio
 2351                var entities = await _service.GetAllAsync();
 52
 53                // Verifica si alguna de las respuestas no fue exitosa
 5354                if (entities.Any(e => !e.Success))
 1755                {
 56                    // Si hay respuestas no exitosas, se construye una lista de respuestas de error
 6857                    var errorResponse = entities.Where(e => !e.Success).ToList();
 58                    // Se actualiza el mensaje de cada respuesta de error y se agregan los mensajes de error a la lista 
 1759                    errorResponse.ForEach(response =>
 2860                    {
 2861                        response.Message = "Error occurred while retrieving entity";
 2862                        response.Errors.Add(response.Message);
 4563                    });
 64
 65                    // Se devuelve un estado de error con las respuestas de error
 1766                    return StatusCode(500, errorResponse);
 67                }
 68
 69                // Si todas las respuestas fueron exitosas, se devuelve un estado OK con las entidades recuperadas
 370                return Ok(entities);
 71            }
 372            catch (Exception)
 373            {
 74                // Maneja cualquier otra excepción inesperada
 375                var exception = new Exception("An unexpected error occurred while retrieving all entities");
 376                _logger.LogError(exception, exception.Message);
 377                return StatusCode(500, HandleException(exception));
 78            }
 2379        }
 80
 81        /// <summary>
 82        /// Obtiene una entidad por su ID de manera asincrónica.
 83        /// </summary>
 84        /// <param name="id">ID de la entidad a buscar.</param>
 85        [HttpGet("{id}")]
 86        public async Task<ActionResult<TResponse>> GetById(Guid id)
 987        {
 88            try
 989            {
 90                // Llama al servicio para obtener la entidad por su ID
 991                var entity = await _service.GetByIdAsync(id);
 92
 693                if (!entity.Success)
 394                {
 95                    // Maneja el caso específico de que la entidad no se encuentre
 396                    entity.Message = "Entity not found";
 397                    entity.Errors.Add(entity.Message);
 98
 399                    return NotFound(entity);
 100                }
 101
 3102                return Ok(entity);
 103            }
 3104            catch (Exception)
 3105            {
 106                // Maneja cualquier otra excepción inesperada
 3107                var exception = new Exception("Error retrieving entity by ID");
 3108                _logger.LogError(exception, exception.Message);
 3109                return StatusCode(500, HandleException(exception));
 110            }
 9111        }
 112
 113        /// <summary>
 114        /// Crea una nueva entidad de manera asincrónica.
 115        /// </summary>
 116        /// <param name="entityRequest">Entidad a crear.</param>
 117        [HttpPost]
 118        public async Task<ActionResult<TResponse>> Create([FromBody] TRequest entityRequest)
 11119        {
 120            try
 11121            {
 122                // Llama al servicio para crear una nueva entidad
 11123                var entity = await _service.CreateAsync(entityRequest);
 124
 8125                if (!entity.Success)
 3126                {
 3127                    entity.Message = "Error occurred while creating the entity.";
 3128                    entity.Errors.Add(entity.Message);
 129
 3130                    return BadRequest(entity);
 131                }
 132
 5133                return StatusCode(201, entity);
 134            }
 3135            catch (Exception)
 3136            {
 137                // Maneja cualquier otra excepción inesperada
 3138                var exception = new Exception("An unexpected error occurred while creating the entity.");
 3139                _logger.LogError(exception, exception.Message);
 3140                return StatusCode(500, HandleException(exception));
 141            }
 11142        }
 143
 144        /// <summary>
 145        /// ACTualiza una entidad existente de manera asincrónica.
 146        /// </summary>
 147        /// <param name="id">ID de la entidad a actualizar.</param>
 148        /// <param name="entityRequest">Datos actualizados de la entidad.</param>
 149        [HttpPut("{id}")]
 150        public async Task<ActionResult<TResponse>> Update(Guid id, [FromBody] TRequest entityRequest)
 13151        {
 152            try
 13153            {
 154                // Llama al servicio para actualizar la entidad
 13155                var response = await _service.UpdateAsync(id, entityRequest);
 156
 10157                if (!response.Success)
 5158                {
 5159                    response.Message = "Error occurred while updating the entity.";
 5160                    response.Errors.Add(response.Message);
 5161                    return BadRequest(response);
 162                }
 163
 5164                return Ok(response);
 165            }
 3166            catch (Exception)
 3167            {
 168                // Maneja cualquier otra excepción inesperada
 3169                var exception = new Exception("An unexpected error occurred while updating the entity.");
 3170                _logger.LogError(exception, exception.Message);
 3171                return StatusCode(500, HandleException(exception));
 172            }
 13173        }
 174
 175
 176        /// <summary>
 177        /// Elimina una entidad por su ID de manera asincrónica.
 178        /// </summary>
 179        /// <param name="id">ID de la entidad a eliminar.</param>
 180        [HttpDelete("{id}")]
 181        public async Task<ActionResult<TResponse>> Delete(Guid id)
 9182        {
 183            try
 9184            {
 185                // Llama al servicio para eliminar la entidad por su ID
 9186                var response = await _service.DeleteAsync(id);
 187
 6188                if (!response.Success)
 3189                {
 3190                    response.Message = "Error occurred while deleting the entity.";
 3191                    response.Errors.Add(response.Message);
 3192                    return BadRequest(response);
 193                }
 194
 3195                return StatusCode(204, response);
 196            }
 3197            catch (Exception)
 3198            {
 199                // Maneja cualquier otra excepción inesperada
 3200                var exception = new Exception("An unexpected error occurred while deleting the entity.");
 3201                _logger.LogError(exception, exception.Message);
 3202                return StatusCode(500, HandleException(exception));
 203            }
 9204        }
 205
 206
 207    }
 208}