User.java

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

import java.time.Instant;
import java.util.Objects;
import java.util.UUID;

public final class User {

    private final UUID id;
    private final UserEmail email;
    private final UserName name;
    private final AuthProvider provider;
    private final ProviderSubject providerSubject;
    private final Instant createdAt;

    private User(
            UUID id,
            UserEmail email,
            UserName name,
            AuthProvider provider,
            ProviderSubject providerSubject,
            Instant createdAt
    ) {
        this.id = Objects.requireNonNull(id, "id must not be null");
        this.email = Objects.requireNonNull(email, "email must not be null");
        this.name = Objects.requireNonNull(name, "name must not be null");
        this.provider = Objects.requireNonNull(provider, "provider must not be null");
        this.providerSubject = Objects.requireNonNull(providerSubject, "providerSubject must not be null");
        this.createdAt = Objects.requireNonNull(createdAt, "createdAt must not be null");
    }

    public static User registerKeycloak(
            UUID id,
            UserEmail email,
            UserName name,
            String providerSubject,
            Instant createdAt
    ) {
        return new User(id, email, name, AuthProvider.KEYCLOAK, ProviderSubject.from(providerSubject), createdAt);
    }

    public static User restore(
            UUID id,
            UserEmail email,
            UserName name,
            AuthProvider provider,
            String providerSubject,
            Instant createdAt
    ) {
        return new User(id, email, name, provider, ProviderSubject.from(providerSubject), createdAt);
    }

    public UUID getId() {
        return id;
    }

    public String getEmail() {
        return email.value();
    }

    public String getName() {
        return name.value();
    }

    public AuthProvider getProvider() {
        return provider;
    }

    public String getProviderSubject() {
        return providerSubject.value();
    }

    public Instant getCreatedAt() {
        return createdAt;
    }
}