EnumValueValidator.java

package com.hwhub.backend.validation;

import com.hwhub.backend.domain.enums.CodeEnum;
import com.hwhub.backend.validation.annotation.EnumValue;
import jakarta.validation.ConstraintValidator;
import jakarta.validation.ConstraintValidatorContext;

public class EnumValueValidator implements ConstraintValidator<EnumValue, String> {

  private Class<? extends Enum<?>> enumClass;

  @Override
  public void initialize(EnumValue annotation) {
    this.enumClass = annotation.enumClass();
  }

  @Override
  public boolean isValid(String value, ConstraintValidatorContext context) {
    if (value == null) {
      return true; // 必須かどうかは @NotBlank などで別途制御
    }

    Object[] enumConstants = enumClass.getEnumConstants();
    if (enumConstants == null) {
      return false;
    }

    for (Object constant : enumConstants) {
      // CodeEnum を実装している場合は code でチェック
      if (constant instanceof CodeEnum codeEnum) {
        if (value.equals(codeEnum.getCode())) {
          return true;
        }
      } else {
        // fallback: enum.name() と比較(CodeEnumじゃないenum用)
        if (value.equals(((Enum<?>) constant).name())) {
          return true;
        }
      }
    }
    return false;
  }
}