// Path: microservices-orders/src/main/java/com/idugalic/orders/payment/domain/CreditCard.java
// @Entity
// @JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.NONE)
// public class CreditCard {
// 
// 	@Id
// 	@GeneratedValue(strategy = GenerationType.AUTO)
// 	@Column(name = "id")
// 	private Long id;
// 
// 	@Version
// 	@Column(name = "version")
// 	private Integer version;
// 
// 	@JsonUnwrapped
// 	private CreditCardNumber number;
// 
// 	private String cardHolderName;
// 
// 	private Months expiryMonth;
// 	private Years expiryYear;
// 
// 	public CreditCard(CreditCardNumber number, String cardHolderName, Months expiryMonth, Years expiryYear) {
// 		super();
// 		this.number = number;
// 		this.cardHolderName = cardHolderName;
// 		this.expiryMonth = expiryMonth;
// 		this.expiryYear = expiryYear;
// 	}
// 
// 	/**
// 	 * Returns whether the {@link CreditCard} is currently valid.
// 	 * 
// 	 * @return
// 	 */
// 	@JsonIgnore
// 	public boolean isValid() {
// 		return isValid(new LocalDate());
// 	}
// 
// 	/**
// 	 * Returns whether the {@link CreditCard} is valid for the given date.
// 	 * 
// 	 * @param date
// 	 * @return
// 	 */
// 	public boolean isValid(LocalDate date) {
// 		return date == null ? false : getExpirationDate().isAfter(date);
// 	}
// 
// 	/**
// 	 * Returns the {@link LocalDate} the {@link CreditCard} expires.
// 	 * 
// 	 * @return will never be {@literal null}.
// 	 */
// 	public LocalDate getExpirationDate() {
// 		return new LocalDate(expiryYear.getYears(), expiryMonth.getMonths(), 1);
// 	}
// 
// 	/**
// 	 * Protected setter to allow binding the expiration date.
// 	 * 
// 	 * @param date
// 	 */
// 	protected void setExpirationDate(LocalDate date) {
// 
// 		this.expiryYear = Years.years(date.getYear());
// 		this.expiryMonth = Months.months(date.getMonthOfYear());
// 	}
// 
// 	public Long getId() {
// 		return id;
// 	}
// 
// 	public void setId(Long id) {
// 		this.id = id;
// 	}
// 
// 	public Integer getVersion() {
// 		return version;
// 	}
// 
// 	public void setVersion(Integer version) {
// 		this.version = version;
// 	}
// 
// 	public CreditCardNumber getNumber() {
// 		return number;
// 	}
// 
// 	public void setNumber(CreditCardNumber number) {
// 		this.number = number;
// 	}
// 
// 	public String getCardHolderName() {
// 		return cardHolderName;
// 	}
// 
// 	public void setCardHolderName(String cardHolderName) {
// 		this.cardHolderName = cardHolderName;
// 	}
// 
// }
// 
// Path: microservices-orders/src/main/java/com/idugalic/orders/payment/domain/CreditCardNumber.java
// @Embeddable
// public class CreditCardNumber {
// 
// 	private static final String regex = "[0-9]{16}";
// 
// 	@Column(unique = true)
// 	private String number;
// 
// 	/**
// 	 * Creates a new {@link CreditCardNumber}.
// 	 * 
// 	 * @param number
// 	 *            must not be {@literal null} and be a 16 digit numerical only
// 	 *            String.
// 	 */
// 	public CreditCardNumber(String number) {
// 
// 		if (!isValid(number)) {
// 			throw new IllegalArgumentException(String.format("Invalid credit card NUMBER %s!", number));
// 		}
// 
// 		this.number = number;
// 	}
// 
// 	public CreditCardNumber() {
// 		super();
// 	}
// 
// 	/**
// 	 * Returns whether the given {@link String} is a valid
// 	 * {@link CreditCardNumber}.
// 	 * 
// 	 * @param number
// 	 * @return
// 	 */
// 	public static boolean isValid(String number) {
// 		return number == null ? false : number.matches(regex);
// 	}
// 
// 	public String getNumber() {
// 		return number;
// 	}
// 
// 	public void setNumber(String number) {
// 		this.number = number;
// 	}
// 
// }


import org.springframework.data.repository.CrudRepository;
import org.springframework.data.rest.core.annotation.RepositoryRestResource;
import com.idugalic.orders.payment.domain.CreditCard;
import com.idugalic.orders.payment.domain.CreditCardNumber;
package com.idugalic.orders.payment.repository;



/**
 * Repository to access {@link CreditCard} instances.
 * 
 */
@RepositoryRestResource(exported = false)
public interface CreditCardRepository extends CrudRepository<CreditCard, Long> {

	/**
	 * Returns the {@link CreditCard} assicaiated with the given
	 * {@link CreditCardNumber}.
	 * 
	 * @param number
	 *            must not be {@literal null}.
	 * @return
	 */
// Path: microservices-orders/src/main/java/com/idugalic/orders/payment/domain/CreditCard.java
// @Entity
// @JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.NONE)
// public class CreditCard {
// 
// 	@Id
// 	@GeneratedValue(strategy = GenerationType.AUTO)
// 	@Column(name = "id")
// 	private Long id;
// 
// 	@Version
// 	@Column(name = "version")
// 	private Integer version;
// 
// 	@JsonUnwrapped
// 	private CreditCardNumber number;
// 
// 	private String cardHolderName;
// 
// 	private Months expiryMonth;
// 	private Years expiryYear;
// 
// 	public CreditCard(CreditCardNumber number, String cardHolderName, Months expiryMonth, Years expiryYear) {
// 		super();
// 		this.number = number;
// 		this.cardHolderName = cardHolderName;
// 		this.expiryMonth = expiryMonth;
// 		this.expiryYear = expiryYear;
// 	}
// 
// 	/**
// 	 * Returns whether the {@link CreditCard} is currently valid.
// 	 * 
// 	 * @return
// 	 */
// 	@JsonIgnore
// 	public boolean isValid() {
// 		return isValid(new LocalDate());
// 	}
// 
// 	/**
// 	 * Returns whether the {@link CreditCard} is valid for the given date.
// 	 * 
// 	 * @param date
// 	 * @return
// 	 */
// 	public boolean isValid(LocalDate date) {
// 		return date == null ? false : getExpirationDate().isAfter(date);
// 	}
// 
// 	/**
// 	 * Returns the {@link LocalDate} the {@link CreditCard} expires.
// 	 * 
// 	 * @return will never be {@literal null}.
// 	 */
// 	public LocalDate getExpirationDate() {
// 		return new LocalDate(expiryYear.getYears(), expiryMonth.getMonths(), 1);
// 	}
// 
// 	/**
// 	 * Protected setter to allow binding the expiration date.
// 	 * 
// 	 * @param date
// 	 */
// 	protected void setExpirationDate(LocalDate date) {
// 
// 		this.expiryYear = Years.years(date.getYear());
// 		this.expiryMonth = Months.months(date.getMonthOfYear());
// 	}
// 
// 	public Long getId() {
// 		return id;
// 	}
// 
// 	public void setId(Long id) {
// 		this.id = id;
// 	}
// 
// 	public Integer getVersion() {
// 		return version;
// 	}
// 
// 	public void setVersion(Integer version) {
// 		this.version = version;
// 	}
// 
// 	public CreditCardNumber getNumber() {
// 		return number;
// 	}
// 
// 	public void setNumber(CreditCardNumber number) {
// 		this.number = number;
// 	}
// 
// 	public String getCardHolderName() {
// 		return cardHolderName;
// 	}
// 
// 	public void setCardHolderName(String cardHolderName) {
// 		this.cardHolderName = cardHolderName;
// 	}
// 
// }
// 
// Path: microservices-orders/src/main/java/com/idugalic/orders/payment/domain/CreditCardNumber.java
// @Embeddable
// public class CreditCardNumber {
// 
// 	private static final String regex = "[0-9]{16}";
// 
// 	@Column(unique = true)
// 	private String number;
// 
// 	/**
// 	 * Creates a new {@link CreditCardNumber}.
// 	 * 
// 	 * @param number
// 	 *            must not be {@literal null} and be a 16 digit numerical only
// 	 *            String.
// 	 */
// 	public CreditCardNumber(String number) {
// 
// 		if (!isValid(number)) {
// 			throw new IllegalArgumentException(String.format("Invalid credit card NUMBER %s!", number));
// 		}
// 
// 		this.number = number;
// 	}
// 
// 	public CreditCardNumber() {
// 		super();
// 	}
// 
// 	/**
// 	 * Returns whether the given {@link String} is a valid
// 	 * {@link CreditCardNumber}.
// 	 * 
// 	 * @param number
// 	 * @return
// 	 */
// 	public static boolean isValid(String number) {
// 		return number == null ? false : number.matches(regex);
// 	}
// 
// 	public String getNumber() {
// 		return number;
// 	}
// 
// 	public void setNumber(String number) {
// 		this.number = number;
// 	}
// 
// }


// Path: microservices-orders/src/main/java/com/idugalic/orders/payment/repository/CreditCardRepository.java
import org.springframework.data.repository.CrudRepository;
import org.springframework.data.rest.core.annotation.RepositoryRestResource;
import com.idugalic.orders.payment.domain.CreditCard;
import com.idugalic.orders.payment.domain.CreditCardNumber;

package com.idugalic.orders.payment.repository;



/**
 * Repository to access {@link CreditCard} instances.
 * 
 */
@RepositoryRestResource(exported = false)
public interface CreditCardRepository extends CrudRepository<CreditCard, Long> {

	/**
	 * Returns the {@link CreditCard} assicaiated with the given
	 * {@link CreditCardNumber}.
	 * 
	 * @param number
	 *            must not be {@literal null}.
	 * @return
	 */
	CreditCard findByNumber(CreditCardNumber number);