71 lines
2.8 KiB
Java
Executable File
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);
|
|
}
|
|
}
|