173 lines
		
	
	
		
			7.6 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
		
		
			
		
	
	
			173 lines
		
	
	
		
			7.6 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| 
								 | 
							
								using GestionIntegral.Api.Data.Repositories.Radios;
							 | 
						||
| 
								 | 
							
								using GestionIntegral.Api.Dtos.Radios;
							 | 
						||
| 
								 | 
							
								using GestionIntegral.Api.Models.Radios;
							 | 
						||
| 
								 | 
							
								using Microsoft.Extensions.Logging;
							 | 
						||
| 
								 | 
							
								using System.Collections.Generic;
							 | 
						||
| 
								 | 
							
								using System.Linq;
							 | 
						||
| 
								 | 
							
								using System.Threading.Tasks;
							 | 
						||
| 
								 | 
							
								// using GestionIntegral.Api.Data; // Para DbConnectionFactory si se usa transacción
							 | 
						||
| 
								 | 
							
								// using System.Data; // Para IsolationLevel si se usa transacción
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								namespace GestionIntegral.Api.Services.Radios
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    public class CancionService : ICancionService
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        private readonly ICancionRepository _cancionRepository;
							 | 
						||
| 
								 | 
							
								        private readonly IRitmoRepository _ritmoRepository;
							 | 
						||
| 
								 | 
							
								        private readonly ILogger<CancionService> _logger;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        public CancionService(
							 | 
						||
| 
								 | 
							
								            ICancionRepository cancionRepository,
							 | 
						||
| 
								 | 
							
								            IRitmoRepository ritmoRepository,
							 | 
						||
| 
								 | 
							
								            ILogger<CancionService> logger)
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            _cancionRepository = cancionRepository;
							 | 
						||
| 
								 | 
							
								            _ritmoRepository = ritmoRepository;
							 | 
						||
| 
								 | 
							
								            _logger = logger;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        private async Task<CancionDto> MapToDto(Cancion cancion)
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            if (cancion == null) return null!;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            string? nombreRitmo = null;
							 | 
						||
| 
								 | 
							
								            if (cancion.Ritmo.HasValue && cancion.Ritmo.Value > 0)
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                var ritmoDb = await _ritmoRepository.GetByIdAsync(cancion.Ritmo.Value);
							 | 
						||
| 
								 | 
							
								                nombreRitmo = ritmoDb?.NombreRitmo;
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            return new CancionDto
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                Id = cancion.Id,
							 | 
						||
| 
								 | 
							
								                Tema = cancion.Tema,
							 | 
						||
| 
								 | 
							
								                CompositorAutor = cancion.CompositorAutor,
							 | 
						||
| 
								 | 
							
								                Interprete = cancion.Interprete,
							 | 
						||
| 
								 | 
							
								                Sello = cancion.Sello,
							 | 
						||
| 
								 | 
							
								                Placa = cancion.Placa,
							 | 
						||
| 
								 | 
							
								                Pista = cancion.Pista,
							 | 
						||
| 
								 | 
							
								                Introduccion = cancion.Introduccion,
							 | 
						||
| 
								 | 
							
								                IdRitmo = cancion.Ritmo, // Pasar el valor de cancion.Ritmo
							 | 
						||
| 
								 | 
							
								                NombreRitmo = nombreRitmo,
							 | 
						||
| 
								 | 
							
								                Formato = cancion.Formato,
							 | 
						||
| 
								 | 
							
								                Album = cancion.Album
							 | 
						||
| 
								 | 
							
								            };
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        public async Task<IEnumerable<CancionDto>> ObtenerTodasAsync(string? temaFilter, string? interpreteFilter, int? idRitmoFilter)
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            var canciones = await _cancionRepository.GetAllAsync(temaFilter, interpreteFilter, idRitmoFilter);
							 | 
						||
| 
								 | 
							
								            var dtos = new List<CancionDto>();
							 | 
						||
| 
								 | 
							
								            foreach (var cancion in canciones)
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                dtos.Add(await MapToDto(cancion));
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            return dtos;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        public async Task<CancionDto?> ObtenerPorIdAsync(int id)
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            var cancion = await _cancionRepository.GetByIdAsync(id);
							 | 
						||
| 
								 | 
							
								            return cancion == null ? null : await MapToDto(cancion);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        public async Task<(CancionDto? Cancion, string? Error)> CrearAsync(CreateCancionDto createDto, int idUsuario)
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            if (createDto.IdRitmo.HasValue && createDto.IdRitmo.Value > 0) // Asegurar que > 0 para evitar buscar ritmo con ID 0
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                 if(await _ritmoRepository.GetByIdAsync(createDto.IdRitmo.Value) == null)
							 | 
						||
| 
								 | 
							
								                    return (null, "El ritmo seleccionado no es válido.");
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            
							 | 
						||
| 
								 | 
							
								            if (!string.IsNullOrWhiteSpace(createDto.Tema) && !string.IsNullOrWhiteSpace(createDto.Interprete) &&
							 | 
						||
| 
								 | 
							
								                await _cancionRepository.ExistsByTemaAndInterpreteAsync(createDto.Tema, createDto.Interprete))
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                return (null, "Ya existe una canción con el mismo tema e intérprete.");
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            var nuevaCancion = new Cancion
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                Tema = createDto.Tema, CompositorAutor = createDto.CompositorAutor, Interprete = createDto.Interprete,
							 | 
						||
| 
								 | 
							
								                Sello = createDto.Sello, Placa = createDto.Placa, Pista = createDto.Pista,
							 | 
						||
| 
								 | 
							
								                Introduccion = createDto.Introduccion,
							 | 
						||
| 
								 | 
							
								                Ritmo = createDto.IdRitmo, // Asignar createDto.IdRitmo a la propiedad Ritmo del modelo
							 | 
						||
| 
								 | 
							
								                Formato = createDto.Formato, Album = createDto.Album
							 | 
						||
| 
								 | 
							
								            };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            try
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                var cancionCreada = await _cancionRepository.CreateAsync(nuevaCancion);
							 | 
						||
| 
								 | 
							
								                if (cancionCreada == null) return (null, "Error al crear la canción.");
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                _logger.LogInformation("Canción ID {Id} creada por Usuario ID {UserId}.", cancionCreada.Id, idUsuario);
							 | 
						||
| 
								 | 
							
								                return (await MapToDto(cancionCreada), null);
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            catch (System.Exception ex)
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                _logger.LogError(ex, "Error CrearAsync Cancion: {Tema}", createDto.Tema);
							 | 
						||
| 
								 | 
							
								                return (null, $"Error interno: {ex.Message}");
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        public async Task<(bool Exito, string? Error)> ActualizarAsync(int id, UpdateCancionDto updateDto, int idUsuario)
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            var cancionExistente = await _cancionRepository.GetByIdAsync(id);
							 | 
						||
| 
								 | 
							
								            if (cancionExistente == null) return (false, "Canción no encontrada.");
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            if (updateDto.IdRitmo.HasValue && updateDto.IdRitmo.Value > 0) // Asegurar que > 0
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                if (await _ritmoRepository.GetByIdAsync(updateDto.IdRitmo.Value) == null)
							 | 
						||
| 
								 | 
							
								                    return (false, "El ritmo seleccionado no es válido.");
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            if ((!string.IsNullOrWhiteSpace(updateDto.Tema) && !string.IsNullOrWhiteSpace(updateDto.Interprete)) &&
							 | 
						||
| 
								 | 
							
								                (cancionExistente.Tema != updateDto.Tema || cancionExistente.Interprete != updateDto.Interprete) &&
							 | 
						||
| 
								 | 
							
								                await _cancionRepository.ExistsByTemaAndInterpreteAsync(updateDto.Tema!, updateDto.Interprete!, id))
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                return (false, "Ya existe otra canción con el mismo tema e intérprete."); // Devolver tupla bool,string
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            cancionExistente.Tema = updateDto.Tema; cancionExistente.CompositorAutor = updateDto.CompositorAutor;
							 | 
						||
| 
								 | 
							
								            cancionExistente.Interprete = updateDto.Interprete; cancionExistente.Sello = updateDto.Sello;
							 | 
						||
| 
								 | 
							
								            cancionExistente.Placa = updateDto.Placa; cancionExistente.Pista = updateDto.Pista;
							 | 
						||
| 
								 | 
							
								            cancionExistente.Introduccion = updateDto.Introduccion;
							 | 
						||
| 
								 | 
							
								            cancionExistente.Ritmo = updateDto.IdRitmo; // Asignar updateDto.IdRitmo a la propiedad Ritmo del modelo
							 | 
						||
| 
								 | 
							
								            cancionExistente.Formato = updateDto.Formato; cancionExistente.Album = updateDto.Album;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            try
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                var actualizado = await _cancionRepository.UpdateAsync(cancionExistente);
							 | 
						||
| 
								 | 
							
								                if (!actualizado) return (false, "Error al actualizar la canción.");
							 | 
						||
| 
								 | 
							
								                
							 | 
						||
| 
								 | 
							
								                _logger.LogInformation("Canción ID {Id} actualizada por Usuario ID {UserId}.", id, idUsuario);
							 | 
						||
| 
								 | 
							
								                return (true, null);
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            catch (System.Exception ex)
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                _logger.LogError(ex, "Error ActualizarAsync Canción ID: {Id}", id);
							 | 
						||
| 
								 | 
							
								                return (false, $"Error interno: {ex.Message}");
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        public async Task<(bool Exito, string? Error)> EliminarAsync(int id, int idUsuario)
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            var cancionExistente = await _cancionRepository.GetByIdAsync(id);
							 | 
						||
| 
								 | 
							
								            if (cancionExistente == null) return (false, "Canción no encontrada.");
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            try
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                var eliminado = await _cancionRepository.DeleteAsync(id);
							 | 
						||
| 
								 | 
							
								                if (!eliminado) return (false, "Error al eliminar la canción.");
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                _logger.LogInformation("Canción ID {Id} eliminada por Usuario ID {UserId}.", id, idUsuario);
							 | 
						||
| 
								 | 
							
								                return (true, null);
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            catch (System.Exception ex)
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                _logger.LogError(ex, "Error EliminarAsync Canción ID: {Id}", id);
							 | 
						||
| 
								 | 
							
								                return (false, $"Error interno: {ex.Message}");
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								}
							 |