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<CardInterface> getCardList() {
|
|
List<Card> cardList = this.cardRepository.findAll();
|
List<CardInterface> 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);
|
}
|
}
|