Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Dúvida sobre DTO

Estou com dificuldades para entender o seguinte:

Por que não fazemos igual no primeiro código? No caso, declarando um construtor public Medico(DadosListagemMedico dadosListagemMedico) na classe Medico?? Não entendi por que temos que criar um construtor no record DadosListagemMedico. Poderiam me explicar o que está sendo feito, de fato?

package med.voll.api.entity;

import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.NoArgsConstructor;
import med.voll.api.dto.medico.DadosCadastroMedico;
import med.voll.api.entity.enums.Especialidade;

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

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String nome;
    private String email;
    private String telefone;
    private String crm;

    @Enumerated(EnumType.STRING)
    private Especialidade especialidade;

    @Embedded
    private Endereco endereco;

    public Medico(DadosCadastroMedico dadosCadastroMedico) {
        this.nome = dadosCadastroMedico.nome();
        this.email = dadosCadastroMedico.email();
        this.telefone = dadosCadastroMedico.telefone();
        this.crm = dadosCadastroMedico.crm();
        this.especialidade = dadosCadastroMedico.especialidade();
        this.endereco = new Endereco(dadosCadastroMedico.endereco());
    }
}
package med.voll.api.dto.medico;

import med.voll.api.entity.Medico;
import med.voll.api.entity.enums.Especialidade;

public record DadosListagemMedico(
        String nome,
        String email,
        String crm,
        Especialidade especialidade) {

    public DadosListagemMedico(Medico medico) {
        this(medico.getNome(), medico.getEmail(), medico.getCrm(), medico.getEspecialidade());
    }
}
1 resposta
solução!

Oii, Lucas!

A diferença entre declarar um construtor na classe Medico e criar um construtor no record DadosListagemMedico está relacionada ao uso de DTO (Data Transfer Object) na API.

No caso da classe Medico, o construtor public Medico(DadosCadastroMedico dadosCadastroMedico) é utilizado para receber os dados de cadastro de um médico e criar uma instância da classe Medico com esses dados. Ou seja, ele é responsável por mapear os dados do DTO DadosCadastroMedico para a entidade Medico.

Já no record DadosListagemMedico, o construtor public DadosListagemMedico(Medico medico) é utilizado para receber uma instância da classe Medico e criar uma instância do DTO DadosListagemMedico com os dados específicos que serão retornados na listagem de médicos. Ou seja, ele é responsável por mapear os atributos relevantes da entidade Medico para o DTO DadosListagemMedico.

Essa abordagem de utilizar DTOs na API é útil quando queremos retornar apenas um subconjunto específico de atributos da entidade original. No caso da listagem de médicos, por exemplo, é comum que não queiramos retornar todos os atributos da classe Medico, mas apenas os atributos relevantes para a listagem, como nome, email, CRM e especialidade.

Dessa forma, ao utilizar o construtor no record DadosListagemMedico, estamos criando uma instância do DTO com os atributos relevantes da entidade Medico, permitindo assim retornar apenas esses dados na listagem.

Espero ter ajudado e bons estudos :)