recursos-catolicos/backend/src/main/java/es/recursoscatolicos/controller/DiarioController.java

70 lines
2.7 KiB
Java

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