Concierge

 view release on metacpan or  search on metacpan

lib/Concierge/User.pm  view on Meta::CPAN

    $self->{user_data} = $options->{user_data} if $options->{user_data};

    # Store closures for backend access (if logged-in user)
    $self->{_get_user_data} = $options->{_get_user_data} if $options->{_get_user_data};
    $self->{_update_user_data} = $options->{_update_user_data} if $options->{_update_user_data};

    # Determine user type (for status methods)
    $self->{is_visitor} = !$options->{session} && !$options->{user_data};
    $self->{is_guest} = $options->{session} && !$options->{user_data};
    $self->{is_logged_in} = $options->{session} && $options->{user_data};

    return $self;  # Return blessed object directly (not wrapped)
}

# =============================================================================
# IDENTITY & METADATA - Direct scalar returns
# =============================================================================

sub user_id ($self) {
    return $self->{user_id};
}

sub user_key ($self) {
    return $self->{user_key};
}

sub session_id ($self) {
    return $self->{session_id};  # undef if visitor/no session
}

# =============================================================================
# STATUS METHODS - Direct boolean returns
# =============================================================================

sub is_visitor ($self) {
    return $self->{is_visitor} ? 1 : 0;
}

sub is_guest ($self) {
    return $self->{is_guest} ? 1 : 0;
}

sub is_logged_in ($self) {
    return $self->{is_logged_in} ? 1 : 0;
}

# =============================================================================
# SESSION ACCESS - Returns session object
# =============================================================================

sub session ($self) {
    return $self->{session};  # undef if no session (visitor)
}

sub get_session_data ($self) {
    return undef unless $self->{session};
    my $result = $self->{session}->get_data();
    return $result->{value} // {};
}

sub update_session_data ($self, $updates) {
    return undef unless $self->{session};

    my $result = $self->{session}->get_data();
    my $current = $result->{value} // {};

    # Merge updates into current data
    for my $key (keys %$updates) {
        $current->{$key} = $updates->{$key};
    }

    $self->{session}->set_data($current);
    $self->{session}->save();

    return 1;
}

# =============================================================================
# USER DATA - Quick access from memory snapshot
# =============================================================================

sub moniker ($self) {
    return $self->{user_data}{moniker};
}

sub email ($self) {
    return $self->{user_data}{email};
}

sub user_status ($self) {
    return $self->{user_data}{user_status};
}

sub access_level ($self) {
    return $self->{user_data}{access_level};
}

sub get_user_field ($self, $field) {
    return $self->{user_data}{$field};
}

# =============================================================================
# USER DATA - Backend operations via closures
# =============================================================================

sub refresh_user_data ($self) {
    # Fetch fresh data from backend, update memory snapshot
    return undef unless $self->{_get_user_data};

    my $result = $self->{_get_user_data}->();
    return undef unless $result->{success};

    $self->{user_data} = $result->{user};
    return 1;
}

sub update_user_data ($self, $updates) {
    # Update backend AND memory snapshot
    return undef unless $self->{_update_user_data};

    my $result = $self->{_update_user_data}->($updates);
    return undef unless $result->{success};

    # Update memory snapshot with new values
    for my $field (keys %$updates) {
        $self->{user_data}{$field} = $updates->{$field};
    }

    return 1;
}

1;

__END__

=head1 NAME

Concierge::User - User object enabled by Concierge

=head1 VERSION

v0.6.1

=head1 SYNOPSIS

    # User objects are created by Concierge lifecycle methods,
    # not directly by applications.

    my $login = $concierge->login_user({
        user_id  => 'alice',
        password => 'secret123',
    });
    my $user = $login->{user};

    # Identity
    say $user->user_id;       # "alice"
    say $user->user_key;      # random token
    say $user->session_id;    # random hex string

    # Status
    say $user->is_logged_in;  # 1
    say $user->is_guest;      # 0
    say $user->is_visitor;    # 0

    # User data (from memory snapshot)
    say $user->moniker;
    say $user->email;
    say $user->get_user_field('role');

    # Update user data (writes to backend and memory)
    $user->update_user_data({ theme => 'dark' });

    # Refresh from backend
    $user->refresh_user_data;

    # Session data (get, merge-update, save in one call)
    my $data = $user->get_session_data;



( run in 0.993 second using v1.01-cache-2.11-cpan-39bf76dae61 )