From 2db3bcb169067869246bdf9f754baac6c255849a Mon Sep 17 00:00:00 2001 From: Antoine Rey <antoine.rey@free.fr> Date: Wed, 29 Dec 2021 11:29:47 +0100 Subject: [PATCH] Fix Vet creation from the POST /vets API --- .../samples/petclinic/mapper/VetMapper.java | 3 ++ .../rest/controller/VetRestController.java | 11 ++++--- src/main/resources/openapi.yml | 33 ++++++++++++------- 3 files changed, 31 insertions(+), 16 deletions(-) diff --git a/src/main/java/org/springframework/samples/petclinic/mapper/VetMapper.java b/src/main/java/org/springframework/samples/petclinic/mapper/VetMapper.java index 98d08945..3c25e514 100644 --- a/src/main/java/org/springframework/samples/petclinic/mapper/VetMapper.java +++ b/src/main/java/org/springframework/samples/petclinic/mapper/VetMapper.java @@ -3,6 +3,7 @@ package org.springframework.samples.petclinic.mapper; import org.mapstruct.Mapper; import org.springframework.samples.petclinic.rest.dto.VetDto; import org.springframework.samples.petclinic.model.Vet; +import org.springframework.samples.petclinic.rest.dto.VetFieldsDto; import java.util.Collection; @@ -13,6 +14,8 @@ import java.util.Collection; public interface VetMapper { Vet toVet(VetDto vetDto); + Vet toVet(VetFieldsDto vetFieldsDto); + VetDto toVetDto(Vet vet); Collection<VetDto> toVetDtos(Collection<Vet> vets); diff --git a/src/main/java/org/springframework/samples/petclinic/rest/controller/VetRestController.java b/src/main/java/org/springframework/samples/petclinic/rest/controller/VetRestController.java index 7c614432..1e3f0f81 100644 --- a/src/main/java/org/springframework/samples/petclinic/rest/controller/VetRestController.java +++ b/src/main/java/org/springframework/samples/petclinic/rest/controller/VetRestController.java @@ -24,6 +24,7 @@ import org.springframework.samples.petclinic.mapper.SpecialtyMapper; import org.springframework.samples.petclinic.mapper.VetMapper; import org.springframework.samples.petclinic.model.Specialty; import org.springframework.samples.petclinic.model.Vet; +import org.springframework.samples.petclinic.rest.dto.VetFieldsDto; import org.springframework.samples.petclinic.service.ClinicService; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.BindingResult; @@ -77,18 +78,18 @@ public class VetRestController implements VetsApi { @PreAuthorize("hasRole(@roles.VET_ADMIN)") @RequestMapping(value = "/vets", method = RequestMethod.POST, produces = "application/json") - public ResponseEntity<VetDto> addVet(@RequestBody @Valid VetDto vetDto, BindingResult bindingResult, UriComponentsBuilder ucBuilder) { + public ResponseEntity<VetDto> addVet(@RequestBody @Valid VetFieldsDto vetFieldsDto, BindingResult bindingResult, UriComponentsBuilder ucBuilder) { BindingErrorsResponse errors = new BindingErrorsResponse(); HttpHeaders headers = new HttpHeaders(); - if (bindingResult.hasErrors() || (vetDto == null)) { + if (bindingResult.hasErrors() || (vetFieldsDto == null)) { errors.addAllErrors(bindingResult); headers.add("errors", errors.toJSON()); - return new ResponseEntity<VetDto>(headers, HttpStatus.BAD_REQUEST); + return new ResponseEntity<>(headers, HttpStatus.BAD_REQUEST); } - Vet vet = vetMapper.toVet(vetDto); + Vet vet = vetMapper.toVet(vetFieldsDto); this.clinicService.saveVet(vet); headers.setLocation(ucBuilder.path("/api/vets/{id}").buildAndExpand(vet.getId()).toUri()); - return new ResponseEntity<VetDto>(vetMapper.toVetDto(vet), headers, HttpStatus.CREATED); + return new ResponseEntity<>(vetMapper.toVetDto(vet), headers, HttpStatus.CREATED); } @PreAuthorize("hasRole(@roles.VET_ADMIN)") diff --git a/src/main/resources/openapi.yml b/src/main/resources/openapi.yml index b03cc296..7289509d 100755 --- a/src/main/resources/openapi.yml +++ b/src/main/resources/openapi.yml @@ -733,19 +733,11 @@ components: - id - type - visits - Vet: - title: Vet - description: A veterinarian. + VetFields: + title: VetFields + description: Editable fields of a veterinarian. type: object properties: - id: - title: ID - description: The ID of the vet. - type: integer - format: int32 - minimum: 0 - example: 1 - readOnly: true firstName: title: First name description: The first name of the vet. @@ -768,6 +760,25 @@ components: type: array items: $ref: '#/components/schemas/Specialty' + required: + - firstName + - lastName + - specialties + Vet: + title: Vet + description: A veterinarian. + allOf: + - $ref: '#/components/schemas/VetFields' + - type: object + properties: + id: + title: ID + description: The ID of the vet. + type: integer + format: int32 + minimum: 0 + example: 1 + readOnly: true required: - id - firstName -- GitLab