UserEmail.java

package com.project.auth.domain.user.model;

import com.project.auth.domain.user.exception.InvalidUserEmailException;

import java.util.Locale;
import java.util.regex.Pattern;

public record UserEmail(String value) {

    private static final Pattern EMAIL_PATTERN = Pattern.compile(
            "^[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,}$",
            Pattern.CASE_INSENSITIVE
    );

    public UserEmail {
        if (value == null || value.isBlank()) {
            throw new InvalidUserEmailException();
        }
    }

    public static UserEmail from(String rawEmail) {
        if (rawEmail == null || rawEmail.isBlank()) {
            throw new InvalidUserEmailException();
        }

        String normalizedEmail = rawEmail.trim().toLowerCase(Locale.ROOT);
        if (!EMAIL_PATTERN.matcher(normalizedEmail).matches()) {
            throw new InvalidUserEmailException();
        }

        return new UserEmail(normalizedEmail);
    }
}