API REST en Spring Boot: Consultar Eventos por Tipo, Cancelar Eventos y Crear Reservas
GET por tipo
GET /api/eventos/por-tipo/{idTipo}
Repositorio
extends JpaRepository<Evento, Long>
findByTipoIdTipo(Long idTipo);
Servicio
List<Evento> findByTipo(Long idTipo);
@Service
@Autowired EventoRepository eventoRepository;
return eventoRepository.findByTipoIdTipo(idTipo);
Controlador
@RestController
@RequestMapping("/api/eventos")
@GetMapping("/por-tipo/{idTipo}")
public ResponseEntity<List<EventoDto>> porTipo(@PathVariable Long idTipo){
List<Evento> lista = eventoService.findByTipo(idTipo);
return ResponseEntity.ok(lista.stream().map(EventoDto::convertirADto).toList());
}
DTO
- Long idEvento
- String nombre
- LocalDate fechaInicio
- Double precio
- String estadoEvento
- String nombreTipo
dto.setNombreTipo(e.getTipo() != null ? e.getTipo().getNombre() : null);
JSON
[{"idEvento":1,"nombre":"Concierto","fechaInicio":"2026-06-15","precio":25.0,"estadoEvento":"ACTIVO","nombreTipo":"Música"}]
PATCH cancelar evento
PATCH /api/admin/eventos/{id}/cancelar
Repositorio
extends JpaRepository<Evento, Long>
Servicio
Evento cancelarEvento(Long idEvento);
@Service
@Autowired EventoRepository eventoRepository;
Evento e = eventoRepository.findById(idEvento).orElse(null);
if(e == null) return null;
e.setEstadoEvento("CANCELADO");
return eventoRepository.save(e);
Controlador
@RestController
@RequestMapping("/api/admin/eventos")
@PatchMapping("/{id}/cancelar")
@PreAuthorize("hasRole('ADMON')")
public ResponseEntity<?> cancelar(@PathVariable Long id){
Evento e = eventoService.cancelarEvento(id);
if(e == null) return ResponseEntity.status(404).body("No existe");
return ResponseEntity.ok(EventoDto.convertirADto(e));
}
DTO
- Long idEvento
- String nombre
- LocalDate fechaInicio
- Double precio
- String estadoEvento
- String nombreTipo
JSON
{"idEvento":1,"nombre":"Concierto","fechaInicio":"2026-06-15","precio":25.0,"estadoEvento":"CANCELADO","nombreTipo":"Música"}
HTTP
- 200 OK
- 404 NOT FOUND
Capítulo 3: POST crear reserva
POST /api/clientes/reservas
Repositorios
- ReservaRepository extends JpaRepository<Reserva, Long>
- EventoRepository extends JpaRepository<Evento, Long>
- UsuarioRepository extends JpaRepository<Usuario, String>
Servicio
Reserva crearReserva(String username, Long idEvento, Integer cantidad);
@Service
@Autowired ReservaRepository reservaRepository;
@Autowired EventoRepository eventoRepository;
@Autowired UsuarioRepository usuarioRepository;
Evento evento = eventoRepository.findById(idEvento).orElse(null);
if(evento == null) return null;
if(!"ACTIVO".equals(evento.getEstadoEvento())) return null;
if(cantidad > 10) return null;
if(evento.getAforoMaximo() < cantidad) return null;
Usuario usuario = usuarioRepository.findById(username).orElse(null);
if(usuario == null) return null;
Reserva r = new Reserva();
r.setEvento(evento);
r.setUsuario(usuario);
r.setCantidad(cantidad);
r.setPrecioVenta(evento.getPrecio() * cantidad);
return reservaRepository.save(r);
Controlador
@RestController
@RequestMapping("/api/clientes/reservas")
@PostMapping
@PreAuthorize("hasRole('CLIENTE')")
public ResponseEntity<?> crear(@RequestBody ReservaDto dto, Authentication auth){
String username = auth.getName();
Reserva nueva = reservaService.crearReserva(username, dto.getIdEvento(), dto.getCantidad());
if(nueva == null) return ResponseEntity.status(409).body("No se pudo crear");
return ResponseEntity.status(201).body(ReservaDto.convertirADto(nueva));
}
DTO
- Long idReserva
- Integer cantidad
- Double precioVenta
- String observaciones
- String username
- Long idEvento
- String nombreEvento
dto.setUsername(r.getUsuario().getUsername());
dto.setIdEvento(r.getEvento().getIdEvento());
dto.setNombreEvento(r.getEvento().getNombre());
JSON de entrada
{"cantidad":3,"observaciones":"VIP","evento":{"idEvento":5}}
JSON de salida
{"idReserva":1,"cantidad":3,"precioVenta":75.0,"observaciones":"VIP","username":"cliente1","idEvento":5,"nombreEvento":"Concierto"}
HTTP
- 201 CREATED
- 400 BAD REQUEST
- 404 NOT FOUND
- 409 CONFLICT