Olá,
Estou desenvolvendo uma API Rest que registra a permanência de hóspedes em um hotel. Tenho uma classe Hospedagem onde tem os atributos hospede, quarto, dataEntrada, dataSaida, valor. Quando vou fazer o check-in do hóspede, eu entro com o hóspede, quarto e a data de entrada (LocalDateTime, pois preciso registrar também o horário de entrada e saída) e estou validando os dados usando o Bean Validation.
Meu problema está na anotação @Future, pois não quero que o usuário "espertinho" registre um hóspede com data ou hora retroativa. Então no DTO DadosCheckin, no atributo dataEntrada eu adicionei a anotação @Future, mas se eu tentar adicionar uma anterior a de hoje, ele deixa. É necessário adicionar mais alguma informação além da anotação @Future?
Em relação a hora, a anotação @Future também faz esse tratamento ou só funciona com a data? Tipo agora é 13/10/2023 e são 10:07, se eu tentar incluir um hospede com a dada de entrada como 13/10/2023 as 10:25 (que teoricamente seria passado), a anotação @Future vai impedir? Aqui não está funcionando. Segue abaixo as minhas classes e DTOs:
Entidade Hospedagem:
package br.com.syshotel.api.domain.hospedagem;
import br.com.syshotel.api.domain.hospede.Hospede;
import br.com.syshotel.api.domain.quarto.Quarto;
import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.NoArgsConstructor;
import java.math.BigDecimal;
import java.time.LocalDateTime;
@Table(name = "hospedagem")
@Entity(name = "Hospedagem")
@Getter
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(of = "id")
public class Hospedagem {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "hospede_id")
private Hospede hospede;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "quarto_id")
private Quarto quarto;
@Column(name = "data_entrada")
private LocalDateTime dataEntrada;
@Column(name = "data_saida")
private LocalDateTime dataSaida;
private BigDecimal valor;
public Hospedagem(LocalDateTime data, Hospede hospede, Quarto quarto) {
this.hospede = hospede;
this.quarto = quarto;
this.dataEntrada = data;
}
}
DTO Checkin
package br.com.syshotel.api.domain.hospedagem;
import br.com.syshotel.api.domain.hospede.Hospede;
import br.com.syshotel.api.domain.quarto.Quarto;
import jakarta.validation.constraints.Future;
import jakarta.validation.constraints.NotNull;
import lombok.NonNull;
import java.time.LocalDateTime;
public record DadosCheckIn(
@NotNull
Long hospedeId,
@NotNull
Long quartoId,
@NotNull @Future
LocalDateTime dataEntrada
) {
}
Hospedagem (Service)
package br.com.syshotel.api.domain.hospedagem;
import br.com.syshotel.api.domain.hospede.HospedeRepository;
import br.com.syshotel.api.domain.quarto.QuartoRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class HospedagemService {
@Autowired
private HospedagemRepository respository;
@Autowired
private HospedeRepository hospedeRepository;
@Autowired
private QuartoRepository quartoRepository;
public Hospedagem hospedar(DadosCheckIn dados) {
var hospede = hospedeRepository.findById(dados.hospedeId()).get();
var quarto = quartoRepository.findById(dados.quartoId()).get();
var hospedagem = new Hospedagem(dados.dataEntrada(), hospede, quarto);
respository.save(hospedagem);
return hospedagem;
}
}
Hospedagem Controller
package br.com.syshotel.api.controller;
import br.com.syshotel.api.domain.hospedagem.DadosCheckIn;
import br.com.syshotel.api.domain.hospedagem.DadosDetalharHospedagem;
import br.com.syshotel.api.domain.hospedagem.HospedagemService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("hospedagem")
public class HospedagemController {
@Autowired
private HospedagemService service;
@PostMapping
@Transactional
public ResponseEntity checkIn(@RequestBody DadosCheckIn dados){
var hospedagem = service.hospedar(dados);
return ResponseEntity.ok(new DadosDetalharHospedagem(hospedagem));
}
}
Agradeço desde já.