Solucionado (ver solução)
Solucionado
(ver solução)
28
respostas

Não esta salvando no banco de dados a consulta

Insira aqui a descrição dessa imagem para ajudar na acessibilidade fica so isso no terminal

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

28 respostas

Oi!

Manda aqui o código das suas classes Dto, Controller e Service. E verifica também no seu banco de dados se os registros estão cadastrados certinhos.

solução!

Deve ser nas classe AgendaDeConsultas que as mensagens de validação estão invertidas. Deveria estar assim:

if (!pacienteRepository.existsById(dados.idPaciente())) {
    throw new ValidacaoException("Id do paciente informado não existe!");
}

if (dados.idMedico() != null && !medicoRepository.existsById(dados.idMedico())) {
    throw new ValidacaoException("Id do médico informado não existe!");
}

Não esta salvando no banco de dados a consulta

Insira aqui a descrição dessa imagem para ajudar na acessibilidadeInsira aqui a descrição dessa imagem para ajudar na acessibilidade

Deu erro 403. Verifica se enviou o header com o token nessa requisição.

sim foi enviado

esta sendo enviado junto ao topico da requisição porem fica 403

Veja se é um dos casos citados aqui: https://cursos.alura.com.br/course/spring-boot-aplique-boas-praticas-proteja-api-rest/task/130894

olhei o topico mais não ajudou tipo quando fui executar la aparece isso no terminal: Hibernate: select u1_0.id, u1_0.login, u1_0.senha from usuarios u1_0 where u1_0.login=? 2023-07-27T17:14:11.063-03:00 WARN 1348 --- [nio-8080-exec-8] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot deserialize value of type java.time.LocalDateTime from String "2023-10-10T:00": Failed to deserialize java.time.LocalDateTime: (java.time.format.DateTimeParseException) Text '2023-10-10T:00' could not be parsed at index 11]

A data da consulta no json está sendo enviada no formato errado: 2023-10-10T:00 (está faltando a hora)

Deveria ser: 2023-10-10T10:00

Confere na sua interface ConsultaRespository se os métodos estão recebendo como parâmetro LocalDateTime e não LocalDate:

public interface ConsultaRepository extends JpaRepository<Consulta, Long> {

    boolean existsByPacienteIdAndDataBetween(Long idPaciente, LocalDateTime primeiroHorario, LocalDateTime ultimoHorario);

    boolean existsByMedicoIdAndDataAndMotivoCancelamentoIsNull(Long idMedico, LocalDateTime data);
}

package med.voll.api.domain.consulta;

import org.springframework.data.jpa.repository.JpaRepository;

import java.time.LocalDateTime;

public interface ConsultaRepository extends JpaRepository<Consulta, Long> {

boolean existsByPacienteIdAndDataBetween(Long idPaciente, LocalDateTime primeiroHorario, LocalDateTime ultimoHorario);

boolean existsByMedicoIdAndData(Long idMedico, LocalDateTime data);

} esta assim o meu

Em algum lugar no seu código está utilizando LocalDate ao invés de LocalDateTime.

Confere nas classes: DadosAgendamentoConsulta, Consulta e nas classes de validação de agendamento de consulta.

package med.voll.api.domain.consulta;

import jakarta.persistence.*; import lombok.AllArgsConstructor; import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.NoArgsConstructor; import med.voll.api.domain.medico.Medico; import med.voll.api.domain.paciente.Paciente;

import java.time.LocalDate; import java.time.LocalDateTime;

@Table(name = "consultas") @Entity(name = "Consulta") @Getter @NoArgsConstructor @AllArgsConstructor @EqualsAndHashCode(of = "id") public class Consulta {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "medico_id")
private Medico medico;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "paciente_id")
private Paciente paciente;

private LocalDate data;


public Consulta(Long id, Medico medico, Paciente paciente, LocalDateTime data) {
}

}

esse construtor ai public Consulta(Long id, Medico medico, Paciente paciente, LocalDateTime data) { } a ide me obrigou a colocar nessa classe pois la em AgendadeConsulta nesse trecho de codigo var consulta = new Consulta(null, medico, paciente, dados.data()); em dados.data ficava um erro tracejado

É o atributo data da sua classe Consulta que está como LocalDate. Altere para LocalDateTime:

private LocalDateTime data;

Com isso você vai poder apagar esse construtor.

modifiquei ai ja pra eh deu tudo o certo agora quando cadastro um novo paciente e um novo medico e atribuo la o agendamento ta caindo nesse problema "Paciente já possui uma Consulta agendada nesse dia " mesm colocando pra um dia e horario que nao tem ninguem

Verifica se o código da sua classe ValidadorPacienteSemOutraConsultaNoDia está certinho:

@Component
public class ValidadorPacienteSemOutraConsultaNoDia implements ValidadorAgendamentoDeConsulta {

    @Autowired
    private ConsultaRepository repository;

    public void validar(DadosAgendamentoConsulta dados) {
        var primeiroHorario = dados.data().withHour(7);
        var ultimoHorario = dados.data().withHour(18);
        var pacientePossuiOutraConsultaNoDia = repository.existsByPacienteIdAndDataBetween(dados.idPaciente(), primeiroHorario, ultimoHorario);
        if (pacientePossuiOutraConsultaNoDia) {
            throw new ValidacaoException("Paciente já possui uma consulta agendada nesse dia");
        }
    }

}

pronto ta funcionando tudo obg professor o senhor e fera

Top!

Bons estudos! :)

quando entro no endereço http://localhost:8080/swagger-ui.html o seguinte erro apareçe O acesso a localhost foi negadoVocê não tem autorização para ver esta página. HTTP ERROR 403

@Bean 
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { 
    return http
            .csrf(csrf -> csrf.disable())
            .sessionManagement(sm -> sm.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
            .authorizeHttpRequests(req -> { 
                req.requestMatchers(HttpMethod.POST, "/login").permitAll();
                req.requestMatchers("/v3/api-docs/", "/swagger-ui.html", "/swagger-ui/").permitAll(); 
                req.anyRequest().authenticated();
            })
            .addFilterBefore(securityFilter, UsernamePasswordAuthenticationFilter.class) .build();
}

'SecurityScheme' is abstract; cannot be instantiated e Cannot resolve symbol 'Type'

'SecurityScheme' is abstract; cannot be instantiated e Cannot resolve symbol 'Type' na classe SpringDocConfiguration

@Configuration 
public class SpringDocConfiguration {
    
    @Bean 
    public OpenAPI customOpenAPI() { 
        return new OpenAPI()
            .components(new Components()
                .addSecuritySchemes("bearer-key", new SecurityScheme()
                    .type(SecurityScheme.Type.HTTP)
                    .scheme("bearer")
                    .bearerFormat("JWT")));
        }
}

No curso foi utilizada a versão 2.0.2 da biblioteca:

<dependency>
    <groupId>org.springdoc</groupId>
    <artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
    <version>2.0.2</version>
</dependency>

Utilize essa mesma versão para evitar problemas.

mesmo usando esta versão continua os erros

o que faço mestre?

não estou conseguindo concluir a ultima etapa do curso por causa desse erro

Qual versão do Spring Boot no seu projeto?