package org.knowm.xchange.coinbase.dto.merchant; // NOTE: Order of imports matters. put fasterxml ones before xchange. Fails when compiling with Maven for some reason. import java.io.IOException; import java.util.Date; import java.util.List; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.ObjectCodec; import com.fasterxml.jackson.databind.DeserializationContext; import com.fasterxml.jackson.databind.JsonDeserializer; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.fasterxml.jackson.databind.annotation.JsonSerialize; import org.knowm.xchange.coinbase.dto.CoinbaseBaseResponse; import org.knowm.xchange.coinbase.dto.marketdata.CoinbaseMoney; import org.knowm.xchange.coinbase.dto.merchant.CoinbaseButton.CoinbaseButtonInfo; import org.knowm.xchange.coinbase.dto.merchant.CoinbaseOrder.CoinbaseOrderStatus.CoinbaseOrderStatusDeserializer; import org.knowm.xchange.coinbase.dto.serialization.CoinbaseCentsDeserializer; import org.knowm.xchange.coinbase.dto.serialization.EnumFromStringHelper; import org.knowm.xchange.coinbase.dto.serialization.EnumLowercaseJsonSerializer; import org.knowm.xchange.utils.jackson.ISO8601DateDeserializer; /** * @author jamespedwards42 */ public class CoinbaseOrder extends CoinbaseBaseResponse { @JsonProperty("order") private CoinbaseOrderInfo order; private CoinbaseOrder(@JsonProperty("order") final CoinbaseOrderInfo order, @JsonProperty("success") final boolean success, @JsonProperty("errors") final List<String> errors) { super(success, errors); this.order = order; } public String getId() { return order.getId(); } public Date getCreatedAt() { return order.getCreatedAt(); } public CoinbaseOrderStatus getStatus() { return order.getStatus(); } public CoinbaseMoney getTotalBTC() { return order.getTotalBTC(); } public CoinbaseMoney getTotalNative() { return order.getTotalNative(); } public String getCustom() { return order.getCustom(); } public String getReceiveAddress() { return order.getReceiveAddress(); } public CoinbaseButton getButton() { return order.getButton(); } public CoinbaseOrderTransaction getTransaction() { return order.getTransaction(); } @Override public String toString() { return "CoinbaseOrder [order=" + order + "]"; } @JsonDeserialize(using = CoinbaseOrderStatusDeserializer.class) @JsonSerialize(using = EnumLowercaseJsonSerializer.class) public enum CoinbaseOrderStatus { NEW, COMPLETED, CANCELED; static class CoinbaseOrderStatusDeserializer extends JsonDeserializer<CoinbaseOrderStatus> { private static final EnumFromStringHelper<CoinbaseOrderStatus> FROM_STRING_HELPER = new EnumFromStringHelper<CoinbaseOrderStatus>( CoinbaseOrderStatus.class); @Override public CoinbaseOrderStatus deserialize(JsonParser jsonParser, DeserializationContext ctxt) throws IOException, JsonProcessingException { ObjectCodec oc = jsonParser.getCodec(); JsonNode node = oc.readTree(jsonParser); String jsonString = node.textValue(); return FROM_STRING_HELPER.fromJsonString(jsonString); } } } private static class CoinbaseOrderInfo { private final String id; private final Date createdAt; private final CoinbaseOrderStatus status; private final CoinbaseMoney totalBTC; private final CoinbaseMoney totalNative; private final String custom; private final String receiveAddress; private final CoinbaseButton button; private final CoinbaseOrderTransaction transaction; private CoinbaseOrderInfo(@JsonProperty("id") final String id, @JsonProperty("created_at") @JsonDeserialize(using = ISO8601DateDeserializer.class) final Date createdAt, @JsonProperty("status") final CoinbaseOrderStatus status, @JsonProperty("total_btc") @JsonDeserialize(using = CoinbaseCentsDeserializer.class) final CoinbaseMoney totalBTC, @JsonProperty("total_native") @JsonDeserialize(using = CoinbaseCentsDeserializer.class) final CoinbaseMoney totalNative, @JsonProperty("custom") final String custom, @JsonProperty("receive_address") final String receiveAddress, @JsonProperty("button") final CoinbaseButtonInfo button, @JsonProperty("transaction") final CoinbaseOrderTransaction transaction) { this.id = id; this.createdAt = createdAt; this.status = status; this.totalBTC = totalBTC; this.totalNative = totalNative; this.custom = custom; this.receiveAddress = receiveAddress; this.button = new CoinbaseButton(button); this.transaction = transaction; } public String getId() { return id; } public Date getCreatedAt() { return createdAt; } public CoinbaseOrderStatus getStatus() { return status; } public CoinbaseMoney getTotalBTC() { return totalBTC; } public CoinbaseMoney getTotalNative() { return totalNative; } public String getCustom() { return custom; } public String getReceiveAddress() { return receiveAddress; } public CoinbaseButton getButton() { return button; } public CoinbaseOrderTransaction getTransaction() { return transaction; } @Override public String toString() { return "CoinbaseOrderInfo [id=" + id + ", createdAt=" + createdAt + ", status=" + status + ", totalBTC=" + totalBTC + ", totalNative=" + totalNative + ", custom=" + custom + ", receiveAddress=" + receiveAddress + ", button=" + button + ", transaction=" + transaction + "]"; } } public static class CoinbaseOrderTransaction { private final String id; private final String hash; private final int confirmations; private CoinbaseOrderTransaction(@JsonProperty("id") final String id, @JsonProperty("hash") final String hash, @JsonProperty("confirmations") final int confirmations) { this.id = id; this.hash = hash; this.confirmations = confirmations; } public String getId() { return id; } public String getHash() { return hash; } public int getConfirmations() { return confirmations; } @Override public String toString() { return "CoinbaseOrderTransaction [id=" + id + ", hash=" + hash + ", confirmations=" + confirmations + "]"; } } }