PriceTarget.java
package com.distasilucas.cryptobalancetracker.entity;
import com.distasilucas.cryptobalancetracker.model.response.pricetarget.PriceTargetResponse;
import jakarta.persistence.Entity;
import jakarta.persistence.Id;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToOne;
import jakarta.persistence.Table;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import java.io.Serializable;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.UUID;
@Entity
@Table(name = "PriceTargets")
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class PriceTarget implements Serializable {
@Id
private String id;
private BigDecimal target;
@ManyToOne
@JoinColumn(name = "crypto_id")
private Crypto crypto;
public PriceTarget(BigDecimal target, Crypto crypto) {
this.id = UUID.randomUUID().toString();
this.target = target;
this.crypto = crypto;
}
public PriceTargetResponse toPriceTargetResponse() {
var change = calculateChangeNeeded();
return new PriceTargetResponse(id, crypto.getCryptoInfo().getName(), crypto.getLastKnownPrices().getLastKnownPrice().toPlainString(), target.toPlainString(), change);
}
private float calculateChangeNeeded() {
var currentPrice = crypto.getLastKnownPrices().getLastKnownPrice();
var change = target.subtract(currentPrice)
.divide(currentPrice, 3, RoundingMode.HALF_UP)
.multiply(new BigDecimal("100"))
.setScale(2, RoundingMode.HALF_UP);
return isChangeNeededGreaterThanMaxFloat(change) ? 9999999F : change.floatValue();
}
private boolean isChangeNeededGreaterThanMaxFloat(BigDecimal change) {
return change.compareTo(new BigDecimal("9999999")) > 0;
}
}