PriceTargetRequest.kt

package com.distasilucas.cryptobalancetracker.model.request.pricetarget

import com.distasilucas.cryptobalancetracker.constants.CRYPTO_NAME_NOT_BLANK
import com.distasilucas.cryptobalancetracker.constants.CRYPTO_NAME_SIZE
import com.distasilucas.cryptobalancetracker.entity.PriceTarget
import com.distasilucas.cryptobalancetracker.validation.ValidCryptoName
import jakarta.validation.constraints.DecimalMax
import jakarta.validation.constraints.Digits
import jakarta.validation.constraints.NotBlank
import jakarta.validation.constraints.NotNull
import jakarta.validation.constraints.Positive
import jakarta.validation.constraints.Size
import java.math.BigDecimal

data class PriceTargetRequest(
  @field: NotBlank(message = CRYPTO_NAME_NOT_BLANK)
  @field: Size(min = 1, max = 64, message = CRYPTO_NAME_SIZE)
  @field: ValidCryptoName
  val cryptoNameOrId: String?,

  @field: NotNull(message = "Price target can not be null")
  @field: Digits(
    integer = 16,
    fraction = 12,
    message = "Price target must have up to {integer} digits in the integer part and up to {fraction} digits in the decimal part"
  )
  @field: DecimalMax(
    value = "9999999999999999.999999999999",
    message = "Price target must be less than or equal to 9999999999999999.999999999999"
  )
  @field: Positive(message = "Price target must be greater than 0")
  val priceTarget: BigDecimal?
) {

  fun toEntity(coingeckoCryptoId: String) = PriceTarget(coingeckoCryptoId = coingeckoCryptoId, target = priceTarget!!)
}