package med.voll.api.controller.consulta;
import jakarta.validation.Valid;
import med.voll.api.domain.consulta.agendamento.AgendamentoConsultas;
import med.voll.api.domain.consulta.cancelamento.CancelamentoConsultas;
import med.voll.api.domain.consulta.cancelamento.DadosCancelamento;
import med.voll.api.domain.consulta.agendamento.DadosConsultas;
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("consultas")
public class ConsultasController {
@Autowired
private AgendamentoConsultas consultas;
@Autowired
private CancelamentoConsultas cancelamentoConsultas;
@PostMapping
@Transactional
public ResponseEntity agenda(@RequestBody @Valid DadosConsultas dados){
var dto = consultas.agendar(dados);
return ResponseEntity.ok(dto);
}
@DeleteMapping
@Transactional
public ResponseEntity cancelar(@RequestBody @Valid DadosCancelamento dados){
cancelamentoConsultas.cancelar(dados);
return ResponseEntity.noContent().build();
}
}
package med.voll.api.domain.consulta.cancelamento;
import med.voll.api.domain.consulta.ConsultaRepository;
import med.voll.api.domain.validacoes.validacoesCancelamento.IValidacaoCancelamento;
import med.voll.api.infra.exception.ValidacaoExeption;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class CancelamentoConsultas {
@Autowired
private ConsultaRepository consultaRepository;
@Autowired
private List<IValidacaoCancelamento> cancelamentoList;
public void cancelar(DadosCancelamento dados){
if (!consultaRepository.existsById(dados.id())){
throw new ValidacaoExeption("Consulta com o id informado não existe");
}
cancelamentoList.forEach(c -> c.cancelar(dados));
var consulta = consultaRepository.getReferenceById(dados.id());
consulta.cancelar(dados.motivo());
}
}
package med.voll.api.domain.consulta.cancelamento;
public enum ConsultaCancelamentoMotivo {
PACIENTE_DESISTIU,
MEDICO_CANCELOU,
OUTROS;
}
package med.voll.api.domain.consulta.cancelamento;
import jakarta.validation.constraints.NotNull;
public record DadosCancelamento(
@NotNull
Long id,
@NotNull
ConsultaCancelamentoMotivo motivo) {
}
package med.voll.api.domain.validacoes.validacoesCancelamento;
import med.voll.api.domain.consulta.cancelamento.DadosCancelamento;
public interface IValidacaoCancelamento {
void cancelar(DadosCancelamento dados);
}
package med.voll.api.domain.validacoes.validacoesCancelamento;
import med.voll.api.domain.consulta.cancelamento.DadosCancelamento;
import med.voll.api.infra.exception.ValidacaoExeption;
import org.springframework.stereotype.Component;
@Component
public class ValidarCancelamentoMensagem implements IValidacaoCancelamento{
@Override
public void cancelar(DadosCancelamento dados) {
if (dados.motivo() == null){
throw new ValidacaoExeption("Motivo do cancelamento deve ser informado");
}
}
}
package med.voll.api.domain.validacoes.validacoesCancelamento;
import med.voll.api.domain.consulta.Consulta;
import med.voll.api.domain.consulta.ConsultaRepository;
import med.voll.api.domain.consulta.cancelamento.DadosCancelamento;
import med.voll.api.infra.exception.ValidacaoExeption;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;
@Component
public class ValidacaoCancelamento24Horas implements IValidacaoCancelamento{
@Autowired
private ConsultaRepository repository;
@Override
public void cancelar(DadosCancelamento dados){
Consulta consulta = repository.getReferenceById(dados.id());
if(LocalDateTime.now().plusHours(24).isAfter(consulta.getData())){
throw new ValidacaoExeption("Consulta só podem ser canceladas com 24 horas de antecedência");
}
}
}