diff --git a/README.md b/README.md index 49bf397..cc466b2 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ Veja mais informações das lições aprendidas na [Wiki](https://github.com/jal ## Conteúdo -* [API Rest]() +* [API Rest](https://github.com/jalussa-santos/formacao-spring-boot#api-rest) * [Boas práticas]() * [Desenvolvimento avançado]() @@ -21,6 +21,10 @@ Veja mais informações das lições aprendidas na [Wiki](https://github.com/jal * [Atualizando dados com Spring Data JPA](https://github.com/jalussa-santos/formacao-spring-boot/issues/21) * [Deletando dados com Spring Data JPA](https://github.com/jalussa-santos/formacao-spring-boot/issues/23) +>### Boas práticas +* [Padronizando retornos da API](https://github.com/jalussa-santos/formacao-spring-boot/issues/26) + + >### Tecnologias: * Java 17 diff --git a/spring-boot-api/src/main/java/com/formacao/springbootapi/controller/MedicoController.java b/spring-boot-api/src/main/java/com/formacao/springbootapi/controller/MedicoController.java index 24395cc..6903335 100644 --- a/spring-boot-api/src/main/java/com/formacao/springbootapi/controller/MedicoController.java +++ b/spring-boot-api/src/main/java/com/formacao/springbootapi/controller/MedicoController.java @@ -1,8 +1,13 @@ package com.formacao.springbootapi.controller; +import static org.springframework.http.ResponseEntity.created; +import static org.springframework.http.ResponseEntity.noContent; +import static org.springframework.http.ResponseEntity.ok; + import com.formacao.springbootapi.model.medico.CadastroMedicoDto; -import com.formacao.springbootapi.model.medico.DadosAtualizacaoMedicoDto; import com.formacao.springbootapi.model.medico.DadosListagemMedicoDto; +import com.formacao.springbootapi.model.medico.DadosMedicoRequestDto; +import com.formacao.springbootapi.model.medico.DadosMedicoResponseDto; import com.formacao.springbootapi.model.medico.Medico; import com.formacao.springbootapi.model.medico.MedicoRepository; import jakarta.validation.Valid; @@ -10,6 +15,7 @@ import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.web.PageableDefault; +import org.springframework.http.ResponseEntity; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; @@ -19,6 +25,7 @@ import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.util.UriComponentsBuilder; @RestController @RequestMapping("medicos") @@ -29,29 +36,50 @@ public class MedicoController { @PostMapping @Transactional - public void cadastrar(@RequestBody @Valid CadastroMedicoDto dados) { - repository.save(new Medico(dados)); + public ResponseEntity cadastrar(@RequestBody @Valid CadastroMedicoDto dados, + UriComponentsBuilder uriBuilder) { + + var medico = new Medico(dados); + repository.save(medico); + + var uri = uriBuilder.path("/medicos/{id}").buildAndExpand(medico.getId()).toUri(); + + return created(uri).body(new DadosMedicoResponseDto(medico)); } @GetMapping - public Page listar(@PageableDefault(size = 10, sort = {"nome"}) Pageable paginacao) { - return repository.findAllByAtivoTrue(paginacao) + public ResponseEntity> listar( + @PageableDefault(size = 10, sort = {"nome"}) Pageable paginacao) { + var page = repository.findAllByAtivoTrue(paginacao) .map(DadosListagemMedicoDto::new); + + return ok(page); } @PutMapping @Transactional - public void atualizar(@RequestBody @Valid DadosAtualizacaoMedicoDto dados) { + public ResponseEntity atualizar(@RequestBody @Valid DadosMedicoRequestDto dados) { var medico = repository.getReferenceById(dados.id()); medico.atualizarInformacoes(dados); + + return ok(new DadosMedicoResponseDto(medico)); } @DeleteMapping("/{id}") @Transactional - public void excluir(@PathVariable Long id) { + public ResponseEntity excluir(@PathVariable Long id) { var medico = repository.getReferenceById(id); medico.excluir(); + + return noContent().build(); + } + + @GetMapping("/{id}") + public ResponseEntity detalhar(@PathVariable Long id) { + + var medico = repository.getReferenceById(id); + return ok(new DadosMedicoResponseDto(medico)); } } \ No newline at end of file diff --git a/spring-boot-api/src/main/java/com/formacao/springbootapi/model/medico/DadosAtualizacaoMedicoDto.java b/spring-boot-api/src/main/java/com/formacao/springbootapi/model/medico/DadosMedicoRequestDto.java similarity index 85% rename from spring-boot-api/src/main/java/com/formacao/springbootapi/model/medico/DadosAtualizacaoMedicoDto.java rename to spring-boot-api/src/main/java/com/formacao/springbootapi/model/medico/DadosMedicoRequestDto.java index 27e182e..4f8b940 100644 --- a/spring-boot-api/src/main/java/com/formacao/springbootapi/model/medico/DadosAtualizacaoMedicoDto.java +++ b/spring-boot-api/src/main/java/com/formacao/springbootapi/model/medico/DadosMedicoRequestDto.java @@ -3,7 +3,7 @@ import com.formacao.springbootapi.model.endereco.EnderecoDto; import jakarta.validation.constraints.NotNull; -public record DadosAtualizacaoMedicoDto( +public record DadosMedicoRequestDto( @NotNull Long id, String nome, diff --git a/spring-boot-api/src/main/java/com/formacao/springbootapi/model/medico/DadosMedicoResponseDto.java b/spring-boot-api/src/main/java/com/formacao/springbootapi/model/medico/DadosMedicoResponseDto.java new file mode 100644 index 0000000..bc02d1e --- /dev/null +++ b/spring-boot-api/src/main/java/com/formacao/springbootapi/model/medico/DadosMedicoResponseDto.java @@ -0,0 +1,14 @@ +package com.formacao.springbootapi.model.medico; + +import com.formacao.springbootapi.model.endereco.Endereco; + +public record DadosMedicoResponseDto(Long id, String nome, String email, String crm, + String telefone, Especialidade especialidade, + Endereco endereco) { + + public DadosMedicoResponseDto(Medico medico) { + this(medico.getId(), medico.getNome(), medico.getEmail(), medico.getCrm(), medico.getTelefone(), + medico.getEspecialidade(), medico.getEndereco()); + + } +} \ No newline at end of file diff --git a/spring-boot-api/src/main/java/com/formacao/springbootapi/model/medico/Medico.java b/spring-boot-api/src/main/java/com/formacao/springbootapi/model/medico/Medico.java index 7f3b500..4f29d93 100644 --- a/spring-boot-api/src/main/java/com/formacao/springbootapi/model/medico/Medico.java +++ b/spring-boot-api/src/main/java/com/formacao/springbootapi/model/medico/Medico.java @@ -46,7 +46,7 @@ public Medico(CadastroMedicoDto medico) { this.endereco = new Endereco(medico.endereco()); } - public void atualizarInformacoes(DadosAtualizacaoMedicoDto dados) { + public void atualizarInformacoes(DadosMedicoRequestDto dados) { if (dados.nome() != null) { this.nome = dados.nome();