package es.recursoscatolicos.controller; import es.recursoscatolicos.dto.EntradaDiarioDTO; import es.recursoscatolicos.dto.EntradaDiarioRequest; import es.recursoscatolicos.model.Usuario; import es.recursoscatolicos.service.DiarioService; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; import org.springframework.format.annotation.DateTimeFormat; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.security.access.AccessDeniedException; import org.springframework.security.core.annotation.AuthenticationPrincipal; import org.springframework.web.bind.annotation.*; import java.time.LocalDate; import java.util.List; @RestController @RequestMapping("/diario") @RequiredArgsConstructor public class DiarioController { private final DiarioService diarioService; /** GET /diario — todas las entradas del usuario autenticado */ @GetMapping public ResponseEntity> getEntradas( @AuthenticationPrincipal Usuario usuario) { return ResponseEntity.ok(diarioService.getEntradas(usuario.getId())); } /** GET /diario/{fecha} — entrada de un día concreto (yyyy-MM-dd) */ @GetMapping("/{fecha}") public ResponseEntity getEntradaPorFecha( @PathVariable @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate fecha, @AuthenticationPrincipal Usuario usuario) { EntradaDiarioDTO dto = diarioService.getEntradaPorFecha(usuario.getId(), fecha); return dto != null ? ResponseEntity.ok(dto) : ResponseEntity.notFound().build(); } /** POST /diario — crea o actualiza la entrada del día indicado (upsert) */ @PostMapping public ResponseEntity guardar( @Valid @RequestBody EntradaDiarioRequest request, @AuthenticationPrincipal Usuario usuario) { try { EntradaDiarioDTO dto = diarioService.guardar(request, usuario.getId()); return ResponseEntity.status(HttpStatus.CREATED).body(dto); } catch (IllegalArgumentException e) { return ResponseEntity.badRequest().body(e.getMessage()); } } /** DELETE /diario/{id} — elimina una entrada por su id */ @DeleteMapping("/{id}") public ResponseEntity eliminar( @PathVariable Long id, @AuthenticationPrincipal Usuario usuario) { try { diarioService.eliminar(id, usuario.getId()); return ResponseEntity.noContent().build(); } catch (IllegalArgumentException e) { return ResponseEntity.notFound().build(); } catch (AccessDeniedException e) { return ResponseEntity.status(HttpStatus.FORBIDDEN).build(); } } }