API REST en Spring Boot: Consultar Eventos por Tipo, Cancelar Eventos y Crear Reservas

Informática4,77 KB

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

Descargar

PDF Word HTML