package es.recursoscatolicos.service; import es.recursoscatolicos.dto.EntradaDiarioDTO; import es.recursoscatolicos.dto.EntradaDiarioRequest; import es.recursoscatolicos.model.EntradaDiario; import es.recursoscatolicos.model.Usuario; import es.recursoscatolicos.repository.EntradaDiarioRepository; import es.recursoscatolicos.repository.UsuarioRepository; import lombok.RequiredArgsConstructor; import org.springframework.security.access.AccessDeniedException; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.time.LocalDate; import java.util.List; import java.util.stream.Collectors; @Service @RequiredArgsConstructor public class DiarioService { private final EntradaDiarioRepository diarioRepository; private final UsuarioRepository usuarioRepository; /** Devuelve todas las entradas del usuario, ordenadas de más reciente a más antigua. */ public List getEntradas(Long usuarioId) { return diarioRepository.findByUsuarioIdOrderByFechaDesc(usuarioId) .stream().map(EntradaDiarioDTO::from).collect(Collectors.toList()); } /** Devuelve la entrada de una fecha concreta, o null si no existe. */ public EntradaDiarioDTO getEntradaPorFecha(Long usuarioId, LocalDate fecha) { return diarioRepository.findByUsuarioIdAndFecha(usuarioId, fecha) .map(EntradaDiarioDTO::from) .orElse(null); } /** * Crea o actualiza (upsert) la entrada del usuario para la fecha indicada. * Si ya existe una entrada para ese día, la sobreescribe. */ @Transactional public EntradaDiarioDTO guardar(EntradaDiarioRequest request, Long usuarioId) { Usuario usuario = usuarioRepository.findById(usuarioId) .orElseThrow(() -> new IllegalArgumentException("Usuario no encontrado")); EntradaDiario entrada = diarioRepository .findByUsuarioIdAndFecha(usuarioId, request.getFecha()) .orElseGet(EntradaDiario::new); entrada.setUsuario(usuario); entrada.setFecha(request.getFecha()); entrada.setTitulo(request.getTitulo()); entrada.setTexto(request.getTexto()); entrada.setEstado(request.getEstado()); return EntradaDiarioDTO.from(diarioRepository.save(entrada)); } /** Elimina la entrada de una fecha concreta. Solo el propietario puede borrarla. */ @Transactional public void eliminar(Long entradaId, Long usuarioId) { EntradaDiario entrada = diarioRepository.findById(entradaId) .orElseThrow(() -> new IllegalArgumentException("Entrada no encontrada")); if (!entrada.getUsuario().getId().equals(usuarioId)) { throw new AccessDeniedException("No tienes permiso para eliminar esta entrada"); } diarioRepository.delete(entrada); } }