package hu.unr.fiber.cardapi.hibernate; import java.util.ArrayList; import java.util.List; 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; @Component public class CardInteractor implements CardInteractorInterface { private CardRepository cardRepository; CardInteractor(CardRepository cardRepository) { this.cardRepository = cardRepository; } @Override public List getCardList() { List cardList = this.cardRepository.findAll(); List restCardList = new ArrayList<>(); for (Card card : cardList) { RestCard ce = new RestCard(card.getId()); restCardList.add(ce.update(card)); } return restCardList; } @Override public CardInterface getCardById(long id) throws CardNotFoundException { if (!this.cardRepository.existsById(id)) { throw new CardNotFoundException("No such card with id: #" + id); } Card c = this.cardRepository.getOne(id); RestCard ce = new RestCard(c.getId()); return ce.update(c); } @Override public void delete(long id) throws CardNotFoundException { try { Card c = this.cardRepository.getOne(id); this.cardRepository.delete(c); this.cardRepository.flush(); } catch (JpaObjectRetrievalFailureException e) { throw new CardNotFoundException(e.getMessage()); } } @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! ", CardInvalidUpdateException.CARD_ID_CHANGE); } 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); } } 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); if (id == null) { return null; } return this.cardRepository.getOne(id); } }