From 12abae6da924cb33858fbc9948fdf7a181e2038c Mon Sep 17 00:00:00 2001 From: Fibinger Ádám <adam.fibinger@wup.hu> Date: Tue, 12 Mar 2019 19:31:27 +0100 Subject: [PATCH] Decoupling final version --- src/main/java/hu/unr/fiber/cardapi/interfaces/CardInteractorInterface.java | 3 src/main/java/hu/unr/fiber/cardapi/CardController.java | 52 +++++------------ /dev/null | 15 ----- src/main/java/hu/unr/fiber/cardapi/interfaces/CardNotFoundException.java | 2 src/main/java/hu/unr/fiber/cardapi/rest/RestCard.java | 2 src/main/java/hu/unr/fiber/cardapi/hibernate/CardInteractor.java | 41 ++++++++++++- src/main/java/hu/unr/fiber/cardapi/interfaces/CardInvalidUpdateException.java | 16 +++++ src/main/java/hu/unr/fiber/cardapi/interfaces/CardDeleteInterface.java | 2 src/main/java/hu/unr/fiber/cardapi/interfaces/CardCreateInterface.java | 1 9 files changed, 73 insertions(+), 61 deletions(-) diff --git a/src/main/java/hu/unr/fiber/cardapi/CardController.java b/src/main/java/hu/unr/fiber/cardapi/CardController.java index 8de17cc..141cd21 100644 --- a/src/main/java/hu/unr/fiber/cardapi/CardController.java +++ b/src/main/java/hu/unr/fiber/cardapi/CardController.java @@ -1,16 +1,20 @@ package hu.unr.fiber.cardapi; +import java.net.URI; import java.util.List; -import hu.unr.fiber.cardapi.hibernate.CardNotFoundException; +import hu.unr.fiber.cardapi.interfaces.CardInvalidUpdateException; +import hu.unr.fiber.cardapi.interfaces.CardNotFoundException; import hu.unr.fiber.cardapi.interfaces.CardInterface; import hu.unr.fiber.cardapi.hibernate.CardInteractor; +import hu.unr.fiber.cardapi.rest.RestCard; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import org.springframework.web.server.ResponseStatusException; +import org.springframework.web.util.UriComponentsBuilder; @RestController public class CardController { @@ -58,57 +62,32 @@ return ResponseEntity.ok().body("OK"); } -/* + @PostMapping(value = "/card/{id}") public ResponseEntity<String> updateCard(@PathVariable("id") long id, @RequestBody RestCard updatedCardEntity, UriComponentsBuilder ucBuilder) { logger.info("POST /card/" + id + " called, card update."); try { this.cardService.update(id, updatedCardEntity); - } catch (CardInvalidUpdateException e){ - + } catch (CardInvalidUpdateException e) { + throw new ResponseStatusException(HttpStatus.BAD_REQUEST, e.getMessage()); + } catch (CardNotFoundException e) { + throw new ResponseStatusException(HttpStatus.NOT_FOUND, "No such card with id: #" + id, e); } - - - RestCard originalCardEntity = this.cardRepository.getOne(id); - - if (originalCardEntity.equals(updatedCardEntity)) { - return ResponseEntity.accepted().body("Update has no changes."); - } - - //card number updated, we have to check if its already exists - if (!originalCardEntity.getNumber().equals(updatedCardEntity.getNumber()) && this.getCardByNumber(updatedCardEntity.getNumber()) != null) { - logger.error("Unable to update card with id {}. A different RestCard with number {} already exist", originalCardEntity.getId(), updatedCardEntity.getNumber()); - return ResponseEntity.status(HttpStatus.CONFLICT).body("RestCard with number " + updatedCardEntity.getNumber() + " already exists."); - } - - originalCardEntity.update(updatedCardEntity); - this.cardRepository.flush(); return ResponseEntity.accepted().body("OK"); - } - - private RestCard getCardByNumber(String number) { - - Long id = cardRepository.findIdByNumber(number); - - if (id == null) { - return null; - } - - return cardRepository.getOne(id); } @PostMapping(value = "/card") public ResponseEntity<String> createCard(@RequestBody RestCard card, UriComponentsBuilder ucBuilder) { logger.info("Creating RestCard : {}", card.getNumber()); - if (this.getCardByNumber(card.getNumber()) != null) { - logger.error("Unable to create. A RestCard with number {} already exist", card.getNumber()); - return ResponseEntity.status(HttpStatus.CONFLICT).body("RestCard with number " + card.getNumber() + " already exists."); + try { + CardInterface c = this.cardService.create(card); + card.setId(c.getId()); + } catch (CardInvalidUpdateException e) { + throw new ResponseStatusException(HttpStatus.CONFLICT, e.getMessage()); } - - this.cardRepository.saveAndFlush(card); URI newCardURI = ucBuilder.path("/card/{id}").buildAndExpand(card.getId()).toUri(); @@ -116,5 +95,4 @@ .created(newCardURI) .body(newCardURI.toString()); } - */ } \ No newline at end of file diff --git a/src/main/java/hu/unr/fiber/cardapi/hibernate/CardInteractor.java b/src/main/java/hu/unr/fiber/cardapi/hibernate/CardInteractor.java index e1beedf..b8e72bc 100644 --- a/src/main/java/hu/unr/fiber/cardapi/hibernate/CardInteractor.java +++ b/src/main/java/hu/unr/fiber/cardapi/hibernate/CardInteractor.java @@ -5,6 +5,8 @@ import hu.unr.fiber.cardapi.interfaces.CardInteractorInterface; import hu.unr.fiber.cardapi.interfaces.CardInterface; +import hu.unr.fiber.cardapi.interfaces.CardInvalidUpdateException; +import hu.unr.fiber.cardapi.interfaces.CardNotFoundException; import hu.unr.fiber.cardapi.rest.RestCard; import org.springframework.orm.jpa.JpaObjectRetrievalFailureException; import org.springframework.stereotype.Component; @@ -35,7 +37,7 @@ @Override public CardInterface getCardById(long id) throws CardNotFoundException { if (!this.cardRepository.existsById(id)) { - throw new CardNotFoundException("No such card with id: #"+ id); + throw new CardNotFoundException("No such card with id: #" + id); } Card c = this.cardRepository.getOne(id); @@ -57,19 +59,48 @@ @Override public CardInterface update(long id, CardInterface updatedCard) throws CardInvalidUpdateException, CardNotFoundException { + if (updatedCard.validId() && (updatedCard.getId() != id)) { - throw new CardInvalidUpdateException("Card ID cannot be changed! ", updatedCard); + throw new CardInvalidUpdateException("Card ID cannot be changed! ", + CardInvalidUpdateException.CARD_ID_CHANGE); } - if (this.getCardByNumber(updatedCard.getNumber()) != null) { - throw new CardInvalidUpdateException("Given card number already exists", updatedCard); + Card oldCard = this.getCardByNumber(updatedCard.getNumber()); + + if (oldCard == null) { + oldCard = this.cardRepository.getOne(id); + } else { + if (oldCard.getId() != id) { + //The given card Number is already assigned to an another card with different ID + String message = "Cannot update card number, given card number already assigned to card with ID #" + oldCard.getId(); + throw new CardInvalidUpdateException(message, CardInvalidUpdateException.CARD_NUMBER_ALREADY_ASSIGNED); + } } - this.cardRepository.saveAndFlush((Card) updatedCard); + oldCard.update(updatedCard); + + this.cardRepository.saveAndFlush(oldCard); return this.getCardById(updatedCard.getId()); } + + @Override + public CardInterface create(CardInterface card) throws CardInvalidUpdateException { + Card duplicateNumberedCard = this.getCardByNumber(card.getNumber()); + if (duplicateNumberedCard != null) { + throw new CardInvalidUpdateException("Card with the same number already exists!", + CardInvalidUpdateException.CARD_NUMBER_ALREADY_ASSIGNED); + } + + Card c = new Card(); + c.update(card); + + this.cardRepository.saveAndFlush(c); + + return c; + } + private Card getCardByNumber(String number) { Long id = cardRepository.findIdByNumber(number); diff --git a/src/main/java/hu/unr/fiber/cardapi/hibernate/CardInvalidUpdateException.java b/src/main/java/hu/unr/fiber/cardapi/hibernate/CardInvalidUpdateException.java deleted file mode 100644 index 7a7a049..0000000 --- a/src/main/java/hu/unr/fiber/cardapi/hibernate/CardInvalidUpdateException.java +++ /dev/null @@ -1,15 +0,0 @@ -package hu.unr.fiber.cardapi.hibernate; - -import hu.unr.fiber.cardapi.interfaces.CardInterface; -import org.springframework.http.HttpStatus; -import org.springframework.web.bind.annotation.ResponseStatus; - -@ResponseStatus(value = HttpStatus.BAD_REQUEST) -public class CardInvalidUpdateException extends Exception { - CardInterface card; - - public CardInvalidUpdateException(String message, CardInterface modifiedCard) { - super(message); - this.card = modifiedCard; - } -} diff --git a/src/main/java/hu/unr/fiber/cardapi/interfaces/CardCreateInterface.java b/src/main/java/hu/unr/fiber/cardapi/interfaces/CardCreateInterface.java index f33c7cd..ddb170f 100644 --- a/src/main/java/hu/unr/fiber/cardapi/interfaces/CardCreateInterface.java +++ b/src/main/java/hu/unr/fiber/cardapi/interfaces/CardCreateInterface.java @@ -1,4 +1,5 @@ package hu.unr.fiber.cardapi.interfaces; public interface CardCreateInterface { + public CardInterface create(CardInterface card) throws Exception; } diff --git a/src/main/java/hu/unr/fiber/cardapi/interfaces/CardDeleteInterface.java b/src/main/java/hu/unr/fiber/cardapi/interfaces/CardDeleteInterface.java index ada0517..fb447fd 100644 --- a/src/main/java/hu/unr/fiber/cardapi/interfaces/CardDeleteInterface.java +++ b/src/main/java/hu/unr/fiber/cardapi/interfaces/CardDeleteInterface.java @@ -1,7 +1,5 @@ package hu.unr.fiber.cardapi.interfaces; -import hu.unr.fiber.cardapi.hibernate.CardNotFoundException; - public interface CardDeleteInterface { public void delete(long id) throws CardNotFoundException; } diff --git a/src/main/java/hu/unr/fiber/cardapi/interfaces/CardInteractorInterface.java b/src/main/java/hu/unr/fiber/cardapi/interfaces/CardInteractorInterface.java index ee7821c..3016004 100644 --- a/src/main/java/hu/unr/fiber/cardapi/interfaces/CardInteractorInterface.java +++ b/src/main/java/hu/unr/fiber/cardapi/interfaces/CardInteractorInterface.java @@ -4,6 +4,7 @@ CardByIdInterface, CardListBoundaryInterface, CardDeleteInterface, - CardModifyInterface { + CardModifyInterface, + CardCreateInterface { } diff --git a/src/main/java/hu/unr/fiber/cardapi/interfaces/CardInvalidUpdateException.java b/src/main/java/hu/unr/fiber/cardapi/interfaces/CardInvalidUpdateException.java new file mode 100644 index 0000000..b96371e --- /dev/null +++ b/src/main/java/hu/unr/fiber/cardapi/interfaces/CardInvalidUpdateException.java @@ -0,0 +1,16 @@ +package hu.unr.fiber.cardapi.interfaces; + +public class CardInvalidUpdateException extends Exception { + public static final int CARD_ID_CHANGE = 0; + public static final int CARD_NUMBER_ALREADY_ASSIGNED = 1; + + protected int code; + public CardInvalidUpdateException(String message, int code) { + super(message); + this.code = code; + } + + public int getCode() { + return code; + } +} diff --git a/src/main/java/hu/unr/fiber/cardapi/hibernate/CardNotFoundException.java b/src/main/java/hu/unr/fiber/cardapi/interfaces/CardNotFoundException.java similarity index 77% rename from src/main/java/hu/unr/fiber/cardapi/hibernate/CardNotFoundException.java rename to src/main/java/hu/unr/fiber/cardapi/interfaces/CardNotFoundException.java index 4d583be..c2318bc 100644 --- a/src/main/java/hu/unr/fiber/cardapi/hibernate/CardNotFoundException.java +++ b/src/main/java/hu/unr/fiber/cardapi/interfaces/CardNotFoundException.java @@ -1,4 +1,4 @@ -package hu.unr.fiber.cardapi.hibernate; +package hu.unr.fiber.cardapi.interfaces; public class CardNotFoundException extends Exception { public CardNotFoundException(String message) { diff --git a/src/main/java/hu/unr/fiber/cardapi/rest/RestCard.java b/src/main/java/hu/unr/fiber/cardapi/rest/RestCard.java index 6c8e865..8cd4b1a 100644 --- a/src/main/java/hu/unr/fiber/cardapi/rest/RestCard.java +++ b/src/main/java/hu/unr/fiber/cardapi/rest/RestCard.java @@ -1,5 +1,6 @@ package hu.unr.fiber.cardapi.rest; +import com.fasterxml.jackson.annotation.JsonCreator; import hu.unr.fiber.cardapi.interfaces.CardInterface; import java.util.Objects; @@ -24,6 +25,7 @@ .setNumber(number); } + @JsonCreator public RestCard(long id, String name, String number, String cardHolder) { this.setId(id) .setName(name) -- Gitblit v1.8.0