PlatformRequest.kt

package com.distasilucas.cryptobalancetracker.model.request.platform

import com.distasilucas.cryptobalancetracker.constants.PLATFORM_NAME_REGEX
import com.distasilucas.cryptobalancetracker.entity.Platform
import jakarta.validation.Constraint
import jakarta.validation.ConstraintValidator
import jakarta.validation.ConstraintValidatorContext
import jakarta.validation.constraints.NotBlank
import java.util.UUID
import kotlin.reflect.KClass

data class PlatformRequest(
  @field: NotBlank(message = "Platform name cannot be null or blank")
  @field: ValidPlatformName
  val name: String?
) {

  fun toEntity(id: String = UUID.randomUUID().toString()): Platform {
    return Platform(id, name = name!!.uppercase())
  }
}

@Constraint(validatedBy = [PlatformNameValidator::class])
@Target(AnnotationTarget.FIELD)
@Retention(AnnotationRetention.RUNTIME)
annotation class ValidPlatformName(
  val message: String = "Platform name must be 1-24 characters long, no numbers, special characters or whitespace allowed",
  val groups: Array<KClass<*>> = [],
  val payload: Array<KClass<out Any>> = []
)

class PlatformNameValidator : ConstraintValidator<ValidPlatformName, String> {

  override fun isValid(value: String?, context: ConstraintValidatorContext?): Boolean {
    val regex = PLATFORM_NAME_REGEX.toRegex()

    return value?.let { value.matches(regex) } ?: false
  }
}