diff --git a/src/main/java/org/springframework/samples/petclinic/rest/advice/ExceptionControllerAdvice.java b/src/main/java/org/springframework/samples/petclinic/rest/advice/ExceptionControllerAdvice.java index 943068b4d8b10c998af006a61f716d203fdffcdc..a49745d009c389af72bbf23a7d1cddf61f88fed3 100644 --- a/src/main/java/org/springframework/samples/petclinic/rest/advice/ExceptionControllerAdvice.java +++ b/src/main/java/org/springframework/samples/petclinic/rest/advice/ExceptionControllerAdvice.java @@ -52,10 +52,17 @@ public class ExceptionControllerAdvice { return ResponseEntity.badRequest().body(respJSONstring); } + /** + * Handles exception thrown by Bean Validation on controller methods parameters + * + * @param ex The thrown exception + * @param request the current web request + * @return an empty response entity + */ @ExceptionHandler(MethodArgumentNotValidException.class) @ResponseStatus(code = BAD_REQUEST) @ResponseBody - public ResponseEntity<Object> handleMethodArgumentNotValidException(MethodArgumentNotValidException ex, WebRequest request) { + public ResponseEntity<Void> handleMethodArgumentNotValidException(MethodArgumentNotValidException ex, WebRequest request) { BindingErrorsResponse errors = new BindingErrorsResponse(); BindingResult bindingResult = ex.getBindingResult(); HttpHeaders headers = new HttpHeaders(); diff --git a/src/main/java/org/springframework/samples/petclinic/rest/controller/OwnerRestController.java b/src/main/java/org/springframework/samples/petclinic/rest/controller/OwnerRestController.java index 3bb2b6488fc3fb7e99016c1417a92c59bd1e5e3c..80ce1e5a9da7bbacc00ecab3850b28069373d687 100644 --- a/src/main/java/org/springframework/samples/petclinic/rest/controller/OwnerRestController.java +++ b/src/main/java/org/springframework/samples/petclinic/rest/controller/OwnerRestController.java @@ -16,6 +16,7 @@ package org.springframework.samples.petclinic.rest.controller; +import io.swagger.annotations.ApiParam; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -29,10 +30,14 @@ import org.springframework.samples.petclinic.rest.api.OwnersApi; import org.springframework.samples.petclinic.rest.dto.*; import org.springframework.samples.petclinic.service.ClinicService; import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.CrossOrigin; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; import org.springframework.web.util.UriComponentsBuilder; import javax.transaction.Transactional; +import javax.validation.constraints.Min; import java.util.Collection; import java.util.List; @@ -117,9 +122,9 @@ public class OwnerRestController implements OwnersApi { } @PreAuthorize("hasRole(@roles.OWNER_ADMIN)") - @RequestMapping(value = "/owners/{ownerId}", method = RequestMethod.DELETE, produces = "application/json") @Transactional - public ResponseEntity<Void> deleteOwner(@PathVariable("ownerId") int ownerId) { + @Override + public ResponseEntity<OwnerDto> deleteOwner(@Min(0) @ApiParam(value = "The ID of the owner.", required = true) @PathVariable("ownerId") Integer ownerId) { Owner owner = this.clinicService.findOwnerById(ownerId); if (owner == null) { return new ResponseEntity<>(HttpStatus.NOT_FOUND); @@ -145,7 +150,7 @@ public class OwnerRestController implements OwnersApi { @PreAuthorize("hasRole(@roles.OWNER_ADMIN)") @Override - public ResponseEntity<VisitDto> addVisit(Integer ownerId, Integer petId, VisitFieldsDto visitFieldsDto) { + public ResponseEntity<VisitDto> addVisitToOwner(Integer ownerId, Integer petId, VisitFieldsDto visitFieldsDto) { HttpHeaders headers = new HttpHeaders(); Visit visit = visitMapper.toVisit(visitFieldsDto); Pet pet = new Pet(); diff --git a/src/main/java/org/springframework/samples/petclinic/rest/controller/PetRestController.java b/src/main/java/org/springframework/samples/petclinic/rest/controller/PetRestController.java index 5d75adaf979182dd4439deb0d7b90599ea8402ba..10311d24222e3250e22c67feaf9778f9fddb146f 100644 --- a/src/main/java/org/springframework/samples/petclinic/rest/controller/PetRestController.java +++ b/src/main/java/org/springframework/samples/petclinic/rest/controller/PetRestController.java @@ -17,25 +17,20 @@ package org.springframework.samples.petclinic.rest.controller; import io.swagger.annotations.ApiParam; -import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.samples.petclinic.mapper.PetMapper; import org.springframework.samples.petclinic.model.Pet; import org.springframework.samples.petclinic.rest.api.PetsApi; import org.springframework.samples.petclinic.rest.dto.PetDto; -import org.springframework.samples.petclinic.rest.dto.PetTypeDto; import org.springframework.samples.petclinic.service.ClinicService; import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.*; import javax.transaction.Transactional; import javax.validation.Valid; import javax.validation.constraints.Min; import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; import java.util.List; /** @@ -44,7 +39,7 @@ import java.util.List; @RestController @CrossOrigin(exposedHeaders = "errors, content-type") -@RequestMapping("api/pets") +@RequestMapping("api") public class PetRestController implements PetsApi { private final ClinicService clinicService; @@ -57,18 +52,16 @@ public class PetRestController implements PetsApi { } @PreAuthorize("hasRole(@roles.OWNER_ADMIN)") - @RequestMapping(value = "/{petId}", method = RequestMethod.GET, produces = "application/json") @Override - public ResponseEntity<PetDto> getPet(@Min(0)@ApiParam(value = "The ID of the pet.",required=true) @PathVariable("petId") Integer petId){ + public ResponseEntity<PetDto> getPet(@Min(0) @ApiParam(value = "The ID of the pet.", required = true) @PathVariable("petId") Integer petId) { PetDto pet = petMapper.toPetDto(this.clinicService.findPetById(petId)); if (pet == null) { - return new ResponseEntity<PetDto>(HttpStatus.NOT_FOUND); + return new ResponseEntity<>(HttpStatus.NOT_FOUND); } - return new ResponseEntity<PetDto>(pet, HttpStatus.OK); + return new ResponseEntity<>(pet, HttpStatus.OK); } @PreAuthorize("hasRole(@roles.OWNER_ADMIN)") - @RequestMapping(value = "", method = RequestMethod.GET, produces = "application/json") @Override public ResponseEntity<List<PetDto>> listPets() { List<PetDto> pets = new ArrayList<>(petMapper.toPetsDto(this.clinicService.findAllPets())); @@ -78,17 +71,10 @@ public class PetRestController implements PetsApi { return new ResponseEntity<>(pets, HttpStatus.OK); } - @PreAuthorize("hasRole(@roles.OWNER_ADMIN)") - @RequestMapping(value = "/pettypes", method = RequestMethod.GET, produces = "application/json") - public ResponseEntity<Collection<PetTypeDto>> getPetTypes() { - return new ResponseEntity<Collection<PetTypeDto>>(petMapper.toPetTypeDtos(this.clinicService.findPetTypes()), HttpStatus.OK); - } @PreAuthorize("hasRole(@roles.OWNER_ADMIN)") - @RequestMapping(value = "/{petId}", method = RequestMethod.PUT, produces = "application/json") @Override - public ResponseEntity<PetDto> updatePet(@Min(0)@ApiParam(value = "The ID of the pet.",required=true) @PathVariable("petId") Integer petId,@ApiParam(value = "The pet" ,required=true ) @Valid @RequestBody PetDto petDto) { - BindingErrorsResponse errors = new BindingErrorsResponse(); + public ResponseEntity<PetDto> updatePet(@Min(0) @ApiParam(value = "The ID of the pet.", required = true) @PathVariable("petId") Integer petId, @ApiParam(value = "The pet", required = true) @Valid @RequestBody PetDto petDto) { Pet currentPet = this.clinicService.findPetById(petId); if (currentPet == null) { return new ResponseEntity<>(HttpStatus.NOT_FOUND); @@ -101,10 +87,9 @@ public class PetRestController implements PetsApi { } @PreAuthorize("hasRole(@roles.OWNER_ADMIN)") - @RequestMapping(value = "/{petId}", method = RequestMethod.DELETE, produces = "application/json") @Transactional @Override - public ResponseEntity<PetDto> deletePet(@Min(0)@ApiParam(value = "The ID of the pet.",required=true) @PathVariable("petId") Integer petId) { + public ResponseEntity<PetDto> deletePet(@Min(0) @ApiParam(value = "The ID of the pet.", required = true) @PathVariable("petId") Integer petId) { Pet pet = this.clinicService.findPetById(petId); if (pet == null) { return new ResponseEntity<>(HttpStatus.NOT_FOUND); diff --git a/src/main/java/org/springframework/samples/petclinic/rest/controller/PetTypeRestController.java b/src/main/java/org/springframework/samples/petclinic/rest/controller/PetTypeRestController.java index 88f98544140b8acc7250e100c1d0d5182bf54f8a..98fdb53c9deaa5e911b21f49b25b40840240c62b 100644 --- a/src/main/java/org/springframework/samples/petclinic/rest/controller/PetTypeRestController.java +++ b/src/main/java/org/springframework/samples/petclinic/rest/controller/PetTypeRestController.java @@ -52,8 +52,7 @@ public class PetTypeRestController implements PettypesApi { @PreAuthorize("hasAnyRole(@roles.OWNER_ADMIN, @roles.VET_ADMIN)") @Override public ResponseEntity<List<PetTypeDto>> listPetTypes() { - List<PetType> petTypes = new ArrayList<>(); - petTypes.addAll(this.clinicService.findAllPetTypes()); + List<PetType> petTypes = new ArrayList<>(this.clinicService.findAllPetTypes()); if (petTypes.isEmpty()) { return new ResponseEntity<>(HttpStatus.NOT_FOUND); } @@ -83,7 +82,6 @@ public class PetTypeRestController implements PettypesApi { @PreAuthorize("hasRole(@roles.VET_ADMIN)") @Override public ResponseEntity<PetTypeDto> updatePetType(@Min(0) @ApiParam(value = "The ID of the pet type.", required = true) @PathVariable("petTypeId") Integer petTypeId, @ApiParam(value = "The pet type", required = true) @Valid @RequestBody PetTypeDto petTypeDto) { - PetType currentPetType = this.clinicService.findPetTypeById(petTypeId); if (currentPetType == null) { return new ResponseEntity<>(HttpStatus.NOT_FOUND); @@ -94,7 +92,6 @@ public class PetTypeRestController implements PettypesApi { } @PreAuthorize("hasRole(@roles.VET_ADMIN)") - @RequestMapping(value = "/pettypes/{petTypeId}", method = RequestMethod.DELETE, produces = "application/json") @Transactional @Override public ResponseEntity<PetTypeDto> deletePetType(@Min(0) @ApiParam(value = "The ID of the pet type.", required = true) @PathVariable("petTypeId") Integer petTypeId) { diff --git a/src/main/java/org/springframework/samples/petclinic/rest/controller/SpecialtyRestController.java b/src/main/java/org/springframework/samples/petclinic/rest/controller/SpecialtyRestController.java index 6ebf9896c5793831d00fe107ef06acfc9cfa6346..51f8dfa81e61c97c999274a417380d3ed9149aaf 100644 --- a/src/main/java/org/springframework/samples/petclinic/rest/controller/SpecialtyRestController.java +++ b/src/main/java/org/springframework/samples/petclinic/rest/controller/SpecialtyRestController.java @@ -41,7 +41,7 @@ import java.util.List; @RestController @CrossOrigin(exposedHeaders = "errors, content-type") -@RequestMapping("api/specialties") +@RequestMapping("api") public class SpecialtyRestController implements SpecialtiesApi { private final ClinicService clinicService; @@ -54,7 +54,6 @@ public class SpecialtyRestController implements SpecialtiesApi { } @PreAuthorize("hasRole(@roles.VET_ADMIN)") - @RequestMapping(value = "", method = RequestMethod.GET, produces = "application/json") @Override public ResponseEntity<List<SpecialtyDto>> listSpecialties() { List<SpecialtyDto> specialties = new ArrayList<SpecialtyDto>(); @@ -66,7 +65,6 @@ public class SpecialtyRestController implements SpecialtiesApi { } @PreAuthorize("hasRole(@roles.VET_ADMIN)") - @RequestMapping(value = "/{specialtyId}", method = RequestMethod.GET, produces = "application/json") @Override public ResponseEntity<SpecialtyDto> getSpecialty(@Min(0) @ApiParam(value = "The ID of the pet.", required = true) @PathVariable("specialtyId") Integer specialtyId) { Specialty specialty = this.clinicService.findSpecialtyById(specialtyId); @@ -77,10 +75,8 @@ public class SpecialtyRestController implements SpecialtiesApi { } @PreAuthorize("hasRole(@roles.VET_ADMIN)") - @RequestMapping(value = "", method = RequestMethod.POST, produces = "application/json") @Override public ResponseEntity<SpecialtyDto> addSpecialty(@ApiParam(value = "The specialty", required = true) @Valid @RequestBody SpecialtyDto specialtyDto) { - BindingErrorsResponse errors = new BindingErrorsResponse(); HttpHeaders headers = new HttpHeaders(); Specialty specialty = specialtyMapper.toSpecialty(specialtyDto); this.clinicService.saveSpecialty(specialty); @@ -89,7 +85,6 @@ public class SpecialtyRestController implements SpecialtiesApi { } @PreAuthorize("hasRole(@roles.VET_ADMIN)") - @RequestMapping(value = "/{specialtyId}", method = RequestMethod.PUT, produces = "application/json") @Override public ResponseEntity<SpecialtyDto> updateSpecialty(@Min(0) @ApiParam(value = "The ID of the specialty.", required = true) @PathVariable("specialtyId") Integer specialtyId, @ApiParam(value = "The pet", required = true) @Valid @RequestBody SpecialtyDto specialtyDto) { Specialty currentSpecialty = this.clinicService.findSpecialtyById(specialtyId); @@ -102,7 +97,6 @@ public class SpecialtyRestController implements SpecialtiesApi { } @PreAuthorize("hasRole(@roles.VET_ADMIN)") - @RequestMapping(value = "/{specialtyId}", method = RequestMethod.DELETE, produces = "application/json") @Transactional @Override public ResponseEntity<SpecialtyDto> deleteSpecialty(@Min(0) @ApiParam(value = "The ID of the specialty.", required = true) @PathVariable("specialtyId") Integer specialtyId) { diff --git a/src/main/java/org/springframework/samples/petclinic/rest/controller/UserRestController.java b/src/main/java/org/springframework/samples/petclinic/rest/controller/UserRestController.java index 1c499cb9649aff246670063fbdc4164f503c061c..2a5d024f1cab046a18fa484de7c7d991b0880a1d 100644 --- a/src/main/java/org/springframework/samples/petclinic/rest/controller/UserRestController.java +++ b/src/main/java/org/springframework/samples/petclinic/rest/controller/UserRestController.java @@ -19,20 +19,22 @@ package org.springframework.samples.petclinic.rest.controller; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -import org.springframework.samples.petclinic.rest.api.UsersApi; -import org.springframework.samples.petclinic.rest.dto.UserDto; import org.springframework.samples.petclinic.mapper.UserMapper; import org.springframework.samples.petclinic.model.User; +import org.springframework.samples.petclinic.rest.api.UsersApi; +import org.springframework.samples.petclinic.rest.dto.UserDto; import org.springframework.samples.petclinic.service.UserService; import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.validation.BindingResult; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.CrossOrigin; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; import javax.validation.Valid; @RestController @CrossOrigin(exposedHeaders = "errors, content-type") -@RequestMapping("api/users") +@RequestMapping("api") public class UserRestController implements UsersApi { private final UserService userService; @@ -45,7 +47,6 @@ public class UserRestController implements UsersApi { @PreAuthorize( "hasRole(@roles.ADMIN)" ) - @RequestMapping(value = "", method = RequestMethod.POST, produces = "application/json") @Override public ResponseEntity<UserDto> addUser(@RequestBody @Valid UserDto userDto) { HttpHeaders headers = new HttpHeaders(); 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 9c67a1c31a19456d92acf4047b3fc49ddeb9ecd2..78e6e78313b3cc35aafd0badf2931f62f796582c 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 @@ -67,7 +67,6 @@ public class VetRestController implements VetsApi { } @PreAuthorize("hasRole(@roles.VET_ADMIN)") - @RequestMapping(value = "/vets/{vetId}", method = RequestMethod.GET, produces = "application/json") @Override public ResponseEntity<VetDto> getVet(@Min(0)@ApiParam(value = "The ID of the vet.",required=true) @PathVariable("vetId") Integer vetId) { Vet vet = this.clinicService.findVetById(vetId); @@ -78,7 +77,6 @@ public class VetRestController implements VetsApi { } @PreAuthorize("hasRole(@roles.VET_ADMIN)") - @RequestMapping(value = "/vets", method = RequestMethod.POST, produces = "application/json") @Override public ResponseEntity<VetDto> addVet(@ApiParam(value = "The vet" ,required=true ) @Valid @RequestBody VetDto vetDto) { HttpHeaders headers = new HttpHeaders(); @@ -89,7 +87,6 @@ public class VetRestController implements VetsApi { } @PreAuthorize("hasRole(@roles.VET_ADMIN)") - @RequestMapping(value = "/vets/{vetId}", method = RequestMethod.PUT, produces = "application/json") @Override public ResponseEntity<VetDto> updateVet(@Min(0)@ApiParam(value = "The ID of the vet.",required=true) @PathVariable("vetId") Integer vetId,@ApiParam(value = "The vet" ,required=true ) @Valid @RequestBody VetDto vetDto) { Vet currentVet = this.clinicService.findVetById(vetId); @@ -107,7 +104,6 @@ public class VetRestController implements VetsApi { } @PreAuthorize("hasRole(@roles.VET_ADMIN)") - @RequestMapping(value = "/vets/{vetId}", method = RequestMethod.DELETE, produces = "application/json") @Transactional @Override public ResponseEntity<VetDto> deleteVet(@Min(0)@ApiParam(value = "The ID of the vet.",required=true) @PathVariable("vetId") Integer vetId) { diff --git a/src/main/java/org/springframework/samples/petclinic/rest/controller/VisitRestController.java b/src/main/java/org/springframework/samples/petclinic/rest/controller/VisitRestController.java index 1bad23b49b0c117603bd0ba29f000b559f238377..e0c0b2ad3e5d48a101642a8a7896346ceb5bedf7 100644 --- a/src/main/java/org/springframework/samples/petclinic/rest/controller/VisitRestController.java +++ b/src/main/java/org/springframework/samples/petclinic/rest/controller/VisitRestController.java @@ -16,22 +16,24 @@ package org.springframework.samples.petclinic.rest.controller; +import io.swagger.annotations.ApiParam; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -import org.springframework.samples.petclinic.rest.dto.VisitDto; import org.springframework.samples.petclinic.mapper.VisitMapper; import org.springframework.samples.petclinic.model.Visit; +import org.springframework.samples.petclinic.rest.api.VisitsApi; +import org.springframework.samples.petclinic.rest.dto.VisitDto; import org.springframework.samples.petclinic.service.ClinicService; import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.*; import org.springframework.web.util.UriComponentsBuilder; import javax.transaction.Transactional; import javax.validation.Valid; +import javax.validation.constraints.Min; import java.util.ArrayList; -import java.util.Collection; +import java.util.List; /** * @author Vitaliy Fedoriv @@ -39,8 +41,8 @@ import java.util.Collection; @RestController @CrossOrigin(exposedHeaders = "errors, content-type") -@RequestMapping("api/visits") -public class VisitRestController { +@RequestMapping("api") +public class VisitRestController implements VisitsApi { private final ClinicService clinicService; @@ -53,54 +55,39 @@ public class VisitRestController { @PreAuthorize("hasRole(@roles.OWNER_ADMIN)") - @RequestMapping(value = "", method = RequestMethod.GET, produces = "application/json") - public ResponseEntity<Collection<VisitDto>> getAllVisitDtos() { - Collection<Visit> visits = new ArrayList<>(); - - visits.addAll(this.clinicService.findAllVisits()); + @Override + public ResponseEntity<List<VisitDto>> listVisits() { + List<Visit> visits = new ArrayList<>(this.clinicService.findAllVisits()); if (visits.isEmpty()) { - return new ResponseEntity<Collection<VisitDto>>(HttpStatus.NOT_FOUND); + return new ResponseEntity<>(HttpStatus.NOT_FOUND); } - return new ResponseEntity<Collection<VisitDto>>(visitMapper.toVisitsDto(visits), HttpStatus.OK); + return new ResponseEntity<>(new ArrayList<>(visitMapper.toVisitsDto(visits)), HttpStatus.OK); } @PreAuthorize("hasRole(@roles.OWNER_ADMIN)") - @RequestMapping(value = "/{visitId}", method = RequestMethod.GET, produces = "application/json") - public ResponseEntity<VisitDto> getVisitDto(@PathVariable("visitId") int visitId) { + @Override + public ResponseEntity<VisitDto> getVisit(@Min(0) @ApiParam(value = "The ID of the visit.", required = true) @PathVariable("visitId") Integer visitId) { Visit visit = this.clinicService.findVisitById(visitId); if (visit == null) { - return new ResponseEntity<VisitDto>(HttpStatus.NOT_FOUND); + return new ResponseEntity<>(HttpStatus.NOT_FOUND); } - return new ResponseEntity<VisitDto>(visitMapper.toVisitDto(visit), HttpStatus.OK); + return new ResponseEntity<>(visitMapper.toVisitDto(visit), HttpStatus.OK); } @PreAuthorize("hasRole(@roles.OWNER_ADMIN)") - @RequestMapping(value = "", method = RequestMethod.POST, produces = "application/json") - public ResponseEntity<VisitDto> addVisit(@RequestBody @Valid VisitDto visitDto, BindingResult bindingResult, UriComponentsBuilder ucBuilder) { - BindingErrorsResponse errors = new BindingErrorsResponse(); + @Override + public ResponseEntity<VisitDto> addVisit(@ApiParam(value = "The visit", required = true) @Valid @RequestBody VisitDto visitDto) { HttpHeaders headers = new HttpHeaders(); - if (bindingResult.hasErrors() || (visitDto == null)) { - errors.addAllErrors(bindingResult); - headers.add("errors", errors.toJSON()); - return new ResponseEntity<VisitDto>(headers, HttpStatus.BAD_REQUEST); - } Visit visit = visitMapper.toVisit(visitDto); this.clinicService.saveVisit(visit); visitDto = visitMapper.toVisitDto(visit); - headers.setLocation(ucBuilder.path("/api/visits/{id}").buildAndExpand(visit.getId()).toUri()); + headers.setLocation(UriComponentsBuilder.newInstance().path("/api/visits/{id}").buildAndExpand(visit.getId()).toUri()); return new ResponseEntity<>(visitDto, headers, HttpStatus.CREATED); } @PreAuthorize("hasRole(@roles.OWNER_ADMIN)") - @RequestMapping(value = "/{visitId}", method = RequestMethod.PUT, produces = "application/json") - public ResponseEntity<VisitDto> updateVisit(@PathVariable("visitId") int visitId, @RequestBody @Valid VisitDto visitDto, BindingResult bindingResult) { - BindingErrorsResponse errors = new BindingErrorsResponse(); - HttpHeaders headers = new HttpHeaders(); - if (bindingResult.hasErrors() || (visitDto == null)) { - errors.addAllErrors(bindingResult); - headers.add("errors", errors.toJSON()); - return new ResponseEntity<>(headers, HttpStatus.BAD_REQUEST); - } + @Override + public ResponseEntity<VisitDto> updateVisit(@Min(0) @ApiParam(value = "The ID of the visit.", required = true) @PathVariable("visitId") Integer visitId, @ApiParam(value = "The visit", required = true) @Valid @RequestBody VisitDto visitDto) { Visit currentVisit = this.clinicService.findVisitById(visitId); if (currentVisit == null) { return new ResponseEntity<>(HttpStatus.NOT_FOUND); @@ -112,12 +99,12 @@ public class VisitRestController { } @PreAuthorize("hasRole(@roles.OWNER_ADMIN)") - @RequestMapping(value = "/{visitId}", method = RequestMethod.DELETE, produces = "application/json") @Transactional - public ResponseEntity<Void> deleteVisit(@PathVariable("visitId") int visitId) { + @Override + public ResponseEntity<VisitDto> deleteVisit(@Min(0) @ApiParam(value = "The ID of the visit.", required = true) @PathVariable("visitId") Integer visitId) { Visit visit = this.clinicService.findVisitById(visitId); if (visit == null) { - return new ResponseEntity<Void>(HttpStatus.NOT_FOUND); + return new ResponseEntity<>(HttpStatus.NOT_FOUND); } this.clinicService.deleteVisit(visit); return new ResponseEntity<>(HttpStatus.NO_CONTENT); diff --git a/src/main/resources/openapi.yml b/src/main/resources/openapi.yml index 67df4474842e5ea5b4e5d04d21e593b311bbc5d3..9bac1e38c2e0affdb4f0d7999ff7693910111c8e 100755 --- a/src/main/resources/openapi.yml +++ b/src/main/resources/openapi.yml @@ -230,6 +230,60 @@ paths: application/json: schema: $ref: '#/components/schemas/RestError' + + delete: + tags: + - owner + operationId: deleteOwner + summary: Delete an owner by ID + description: Returns the owner or a 404 error. + parameters: + - name: ownerId + in: path + description: The ID of the owner. + required: true + schema: + type: integer + format: int32 + minimum: 0 + example: 1 + responses: + 200: + description: Owner details found and returned. + headers: + ETag: + description: An ID for this version of the response. + schema: + type: string + content: + application/json: + schema: + $ref: '#/components/schemas/Owner' + 304: + description: Not modified. + headers: + ETag: + description: An ID for this version of the response. + schema: + type: string + 400: + description: Bad request. + content: + application/json: + schema: + $ref: '#/components/schemas/RestError' + 404: + description: Owner not found. + content: + application/json: + schema: + $ref: '#/components/schemas/RestError' + 500: + description: Server error. + content: + application/json: + schema: + $ref: '#/components/schemas/RestError' /owners/{ownerId}/pets: post: tags: @@ -268,7 +322,7 @@ paths: schema: $ref: '#/components/schemas/RestError' 404: - description: Owner not found. + description: Pet not found. content: application/json: schema: @@ -331,7 +385,7 @@ paths: schema: $ref: '#/components/schemas/RestError' 404: - description: Owner not found. + description: Pet not found. content: application/json: schema: @@ -400,7 +454,7 @@ paths: post: tags: - visit - operationId: addVisit + operationId: addVisitToOwner summary: Adds a vet visit description: Records the details of a new vet visit. parameters: @@ -694,7 +748,7 @@ paths: schema: $ref: '#/components/schemas/RestError' 404: - description: Owner not found. + description: Pet type not found. content: application/json: schema: @@ -779,7 +833,7 @@ paths: schema: $ref: '#/components/schemas/RestError' 404: - description: Owner not found. + description: Pet not found. content: application/json: schema: @@ -833,7 +887,7 @@ paths: schema: $ref: '#/components/schemas/RestError' 404: - description: Owner not found. + description: Pet not found. content: application/json: schema: @@ -893,7 +947,7 @@ paths: schema: $ref: '#/components/schemas/RestError' 404: - description: Owner not found. + description: Pet not found. content: application/json: schema: @@ -946,7 +1000,258 @@ paths: schema: $ref: '#/components/schemas/RestError' 404: - description: Owner not found. + description: Pet not found. + content: + application/json: + schema: + $ref: '#/components/schemas/RestError' + 500: + description: Server error. + content: + application/json: + schema: + $ref: '#/components/schemas/RestError' + /visits: + get: + tags: + - visit + operationId: listVisits + summary: Lists visits + description: Returns an array of visit . + responses: + 200: + description: visits found and returned. + headers: + ETag: + description: An ID for this version of the response. + schema: + type: string + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/Visit' + 304: + description: Not modified. + headers: + ETag: + description: An ID for this version of the response. + schema: + type: string + 500: + description: Server error. + content: + application/json: + schema: + $ref: '#/components/schemas/RestError' + post: + tags: + - visit + operationId: addVisit + summary: Create a visit + description: Creates a visit. + requestBody: + description: The visit + content: + application/json: + schema: + $ref: '#/components/schemas/Visit' + required: true + responses: + 200: + description: visit created successfully. + headers: + ETag: + description: An ID for this version of the response. + schema: + type: string + content: + application/json: + schema: + $ref: '#/components/schemas/Visit' + 304: + description: Not modified. + headers: + ETag: + description: An ID for this version of the response. + schema: + type: string + 400: + description: Bad request. + content: + application/json: + schema: + $ref: '#/components/schemas/RestError' + 404: + description: Visit not found. + content: + application/json: + schema: + $ref: '#/components/schemas/RestError' + 500: + description: Server error. + content: + application/json: + schema: + $ref: '#/components/schemas/RestError' + /visits/{visitId}: + get: + tags: + - visit + operationId: getVisit + summary: Get a visit by ID + description: Returns the visit or a 404 error. + parameters: + - name: visitId + in: path + description: The ID of the visit. + required: true + schema: + type: integer + format: int32 + minimum: 0 + example: 1 + responses: + 200: + description: Visit details found and returned. + headers: + ETag: + description: An ID for this version of the response. + schema: + type: string + content: + application/json: + schema: + $ref: '#/components/schemas/Visit' + 304: + description: Not modified. + headers: + ETag: + description: An ID for this version of the response. + schema: + type: string + 400: + description: Bad request. + content: + application/json: + schema: + $ref: '#/components/schemas/RestError' + 404: + description: Visit not found. + content: + application/json: + schema: + $ref: '#/components/schemas/RestError' + 500: + description: Server error. + content: + application/json: + schema: + $ref: '#/components/schemas/RestError' + put: + tags: + - visit + operationId: updateVisit + summary: Update a visit by ID + description: Returns the visit or a 404 error. + parameters: + - name: visitId + in: path + description: The ID of the visit. + required: true + schema: + type: integer + format: int32 + minimum: 0 + example: 1 + requestBody: + description: The visit + content: + application/json: + schema: + $ref: '#/components/schemas/Visit' + required: true + responses: + 200: + description: Visit details found and returned. + headers: + ETag: + description: An ID for this version of the response. + schema: + type: string + content: + application/json: + schema: + $ref: '#/components/schemas/Visit' + 304: + description: Not modified. + headers: + ETag: + description: An ID for this version of the response. + schema: + type: string + 400: + description: Bad request. + content: + application/json: + schema: + $ref: '#/components/schemas/RestError' + 404: + description: Visit not found. + content: + application/json: + schema: + $ref: '#/components/schemas/RestError' + 500: + description: Server error. + content: + application/json: + schema: + $ref: '#/components/schemas/RestError' + delete: + tags: + - visit + operationId: deleteVisit + summary: Delete a visit by ID + description: Returns the visit or a 404 error. + parameters: + - name: visitId + in: path + description: The ID of the visit. + required: true + schema: + type: integer + format: int32 + minimum: 0 + example: 1 + responses: + 200: + description: Visit details found and returned. + headers: + ETag: + description: An ID for this version of the response. + schema: + type: string + content: + application/json: + schema: + $ref: '#/components/schemas/Visit' + 304: + description: Not modified. + headers: + ETag: + description: An ID for this version of the response. + schema: + type: string + 400: + description: Bad request. + content: + application/json: + schema: + $ref: '#/components/schemas/RestError' + 404: + description: Visit not found. content: application/json: schema: @@ -1030,7 +1335,7 @@ paths: schema: $ref: '#/components/schemas/RestError' 404: - description: Owner not found. + description: Specialty not found. content: application/json: schema: @@ -1282,7 +1587,7 @@ paths: schema: $ref: '#/components/schemas/RestError' 404: - description: Owner not found. + description: Vet not found. content: application/json: schema: @@ -1336,7 +1641,7 @@ paths: schema: $ref: '#/components/schemas/RestError' 404: - description: Owner not found. + description: Vet not found. content: application/json: schema: @@ -1396,7 +1701,7 @@ paths: schema: $ref: '#/components/schemas/RestError' 404: - description: Owner not found. + description: Vet not found. content: application/json: schema: @@ -1449,7 +1754,7 @@ paths: schema: $ref: '#/components/schemas/RestError' 404: - description: Owner not found. + description: Vet not found. content: application/json: schema: diff --git a/src/test/java/org/springframework/samples/petclinic/rest/controller/OwnerRestControllerTests.java b/src/test/java/org/springframework/samples/petclinic/rest/controller/OwnerRestControllerTests.java index 63ab72d69c392ba4e99e022dcb6e02e00b834a26..6f0bcff39a2f350364174342e885f526153c4328 100644 --- a/src/test/java/org/springframework/samples/petclinic/rest/controller/OwnerRestControllerTests.java +++ b/src/test/java/org/springframework/samples/petclinic/rest/controller/OwnerRestControllerTests.java @@ -25,15 +25,14 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.http.MediaType; +import org.springframework.samples.petclinic.mapper.OwnerMapper; import org.springframework.samples.petclinic.mapper.VisitMapper; -import org.springframework.samples.petclinic.model.Visit; +import org.springframework.samples.petclinic.model.Owner; import org.springframework.samples.petclinic.rest.advice.ExceptionControllerAdvice; import org.springframework.samples.petclinic.rest.dto.OwnerDto; import org.springframework.samples.petclinic.rest.dto.PetDto; import org.springframework.samples.petclinic.rest.dto.PetTypeDto; import org.springframework.samples.petclinic.rest.dto.VisitDto; -import org.springframework.samples.petclinic.mapper.OwnerMapper; -import org.springframework.samples.petclinic.model.Owner; import org.springframework.samples.petclinic.service.ClinicService; import org.springframework.samples.petclinic.service.clinicService.ApplicationTestConfig; import org.springframework.security.test.context.support.WithMockUser; @@ -339,8 +338,8 @@ class OwnerRestControllerTests { ObjectMapper mapper = new ObjectMapper(); mapper.registerModule(new JavaTimeModule()); String newOwnerAsJSON = mapper.writeValueAsString(newOwnerDto); - given(this.clinicService.findOwnerById(-1)).willReturn(null); - this.mockMvc.perform(delete("/api/owners/-1") + given(this.clinicService.findOwnerById(999)).willReturn(null); + this.mockMvc.perform(delete("/api/owners/999") .content(newOwnerAsJSON).accept(MediaType.APPLICATION_JSON_VALUE).contentType(MediaType.APPLICATION_JSON_VALUE)) .andExpect(status().isNotFound()); } diff --git a/src/test/java/org/springframework/samples/petclinic/rest/controller/PetRestControllerTests.java b/src/test/java/org/springframework/samples/petclinic/rest/controller/PetRestControllerTests.java index 7a17ed72a293e90d5acedf8007a9dc4a3594d82b..fbe963b8a10cd0ca19b823a07f04a76538074398 100644 --- a/src/test/java/org/springframework/samples/petclinic/rest/controller/PetRestControllerTests.java +++ b/src/test/java/org/springframework/samples/petclinic/rest/controller/PetRestControllerTests.java @@ -25,20 +25,18 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.http.MediaType; +import org.springframework.samples.petclinic.mapper.PetMapper; +import org.springframework.samples.petclinic.model.Pet; import org.springframework.samples.petclinic.rest.advice.ExceptionControllerAdvice; -import org.springframework.samples.petclinic.rest.controller.PetRestController; import org.springframework.samples.petclinic.rest.dto.OwnerDto; import org.springframework.samples.petclinic.rest.dto.PetDto; import org.springframework.samples.petclinic.rest.dto.PetTypeDto; -import org.springframework.samples.petclinic.mapper.PetMapper; -import org.springframework.samples.petclinic.model.Pet; import org.springframework.samples.petclinic.service.ClinicService; import org.springframework.samples.petclinic.service.clinicService.ApplicationTestConfig; import org.springframework.security.test.context.support.WithMockUser; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.web.WebAppConfiguration; import org.springframework.test.web.servlet.MockMvc; -import org.springframework.test.web.servlet.result.MockMvcResultHandlers; import org.springframework.test.web.servlet.setup.MockMvcBuilders; import java.text.SimpleDateFormat; @@ -215,7 +213,7 @@ class PetRestControllerTests { ObjectMapper mapper = new ObjectMapper(); mapper.registerModule(new JavaTimeModule()); String newPetAsJSON = mapper.writeValueAsString(newPet); - given(this.clinicService.findPetById(-1)).willReturn(null); + given(this.clinicService.findPetById(999)).willReturn(null); this.mockMvc.perform(delete("/api/pets/999") .content(newPetAsJSON).accept(MediaType.APPLICATION_JSON_VALUE).contentType(MediaType.APPLICATION_JSON_VALUE)) .andExpect(status().isNotFound()); diff --git a/src/test/java/org/springframework/samples/petclinic/rest/controller/VisitRestControllerTests.java b/src/test/java/org/springframework/samples/petclinic/rest/controller/VisitRestControllerTests.java index 0cad10e3f223270fddd909652c653998bbfe02c1..74217cc5f7480256a3a0536f108b2dc2d20a3408 100644 --- a/src/test/java/org/springframework/samples/petclinic/rest/controller/VisitRestControllerTests.java +++ b/src/test/java/org/springframework/samples/petclinic/rest/controller/VisitRestControllerTests.java @@ -31,7 +31,6 @@ import org.springframework.samples.petclinic.model.Pet; import org.springframework.samples.petclinic.model.PetType; import org.springframework.samples.petclinic.model.Visit; import org.springframework.samples.petclinic.rest.advice.ExceptionControllerAdvice; -import org.springframework.samples.petclinic.rest.controller.VisitRestController; import org.springframework.samples.petclinic.service.ClinicService; import org.springframework.samples.petclinic.service.clinicService.ApplicationTestConfig; import org.springframework.security.test.context.support.WithMockUser; @@ -131,8 +130,8 @@ class VisitRestControllerTests { @Test @WithMockUser(roles="OWNER_ADMIN") void testGetVisitNotFound() throws Exception { - given(this.clinicService.findVisitById(-1)).willReturn(null); - this.mockMvc.perform(get("/api/visits/-1") + given(this.clinicService.findVisitById(999)).willReturn(null); + this.mockMvc.perform(get("/api/visits/999") .accept(MediaType.APPLICATION_JSON)) .andExpect(status().isNotFound()); } @@ -246,8 +245,8 @@ class VisitRestControllerTests { ObjectMapper mapper = new ObjectMapper(); mapper.registerModule(new JavaTimeModule()); String newVisitAsJSON = mapper.writeValueAsString(visitMapper.toVisitDto(newVisit)); - given(this.clinicService.findVisitById(-1)).willReturn(null); - this.mockMvc.perform(delete("/api/visits/-1") + given(this.clinicService.findVisitById(999)).willReturn(null); + this.mockMvc.perform(delete("/api/visits/999") .content(newVisitAsJSON).accept(MediaType.APPLICATION_JSON_VALUE).contentType(MediaType.APPLICATION_JSON_VALUE)) .andExpect(status().isNotFound()); }