recursos-catolicos/backend/src/main/java/es/recursoscatolicos/service/DiarioService.java

71 lines
2.8 KiB
Java
Executable File

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<EntradaDiarioDTO> 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);
}
}