package med.voll.api.controller;
import jakarta.validation.Valid;
import med.voll.api.paciente.*;
import org.springframework.beans.factory.annotation.Autowired;
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.*;
import org.springframework.web.util.UriComponentsBuilder;
@RestController
@RequestMapping("pacientes")
public class PacienteController {
@Autowired
private PacienteRepository repository;
@PostMapping
@Transactional
public ResponseEntity cadastrar(@RequestBody @Valid DadosCadastroPaciente dados, UriComponentsBuilder uriBuilder) {
var paciente = new Paciente(dados);
repository.save(paciente);
var uri = uriBuilder.path("/pacientes/{id}").buildAndExpand(paciente.getId()).toUri(); //encapsula o endereço da api
return ResponseEntity.created(uri).body(new DadosDetalhamentoPaciente(paciente));
}
@GetMapping
public ResponseEntity<Page<DadosListagemPaciente>> listar(@PageableDefault(size = 10, sort = {"nome"}) Pageable paginacao) {
var page = repository.findAllByAtivoTrue(paginacao).map(DadosListagemPaciente::new);
return ResponseEntity.ok(page);
}
@PutMapping
@Transactional
public ResponseEntity atualizar(@RequestBody @Valid DadosAtualizacaoPaciente dados) {
var paciente = repository.getReferenceById(dados.id());
paciente.atualizarInformacoes(dados);
return ResponseEntity.ok(new DadosDetalhamentoPaciente(paciente));
}
@DeleteMapping("/{id}")
@Transactional
public ResponseEntity excluir(@PathVariable Long id) {
var paciente = repository.getReferenceById(id);
paciente.excluir();
return ResponseEntity.noContent().build();
}
@GetMapping("/{id}")
public ResponseEntity detalhar(@PathVariable Long id) {
var paciente = repository.getReferenceById(id);
return ResponseEntity.ok(new DadosDetalhamentoPaciente(paciente));
}
}
package med.voll.api.paciente;
import med.voll.api.endereco.Endereco;
public record DadosDetalhamentoPaciente(Long id, String nome, String email, String cpf, String telefone, Endereco endereco) {
public DadosDetalhamentoPaciente(Paciente paciente){
this(paciente.getId(), paciente.getNome(), paciente.getEmail(), paciente.getCpf(), paciente.getTelefone(), paciente.getEndereco());
}
}