Concierge-Sessions

 view release on metacpan or  search on metacpan

lib/Concierge/Sessions/File.pm  view on Meta::CPAN

        return { success => 0, message => "Cannot close session file: $!" };
    }

    return { success => 1, session_id => $session_id };
}

sub get_session_info {
    my ($self, $session_id) = @_;

    unless ($session_id) {
        return { success => 0, message => "Session ID required to retrieve session from File backend" };
    }

    my $session_file = File::Spec->catfile($self->{storage_dir}, $session_id);

    unless (-f $session_file) {
        return { success => 0, message => "Session file not found" };
    }

    my $fh;
    unless (open $fh, '<', $session_file) {
        return { success => 0, message => "Cannot read session file: $!" };
    }

    # Read entire file (pretty JSON spans multiple lines)
    local $/;
    my $json = <$fh>;
    unless (close $fh) {
        return { success => 0, message => "Error closing session file: $!" };
    }
    unless (defined $json) {
        close $fh;
        return { success => 0, message => "Session file is empty" };
    }

    # Decode JSON
    my $session_info;
    eval {
        $session_info = JSON::PP->new->utf8->decode($json);
    };
    if ($@) {
        return { success => 0, message => "Invalid JSON in session file: $@" };
    }

    unless ($session_info->{session_id} && $session_info->{created_at} && $session_info->{expires_at}) {
        return { success => 0, message => "Invalid session file: missing system status fields" };
    }

    # Check expiration (skip if indefinite)
    if ($session_info->{expires_at} ne 'indefinite' && time() > $session_info->{expires_at}) {
        return { success => 0, message => "Session expired" };
    }

    return {
        success => 1,
        message => "Session info retrieved",
        info => $session_info
    };
}

sub update_session {
    my ($self, $session_id, $updates) = @_;

    unless ($session_id) {
        return { success => 0, message => "Session ID required to update session in File backend" };
    }

    unless ($updates) {
        return { success => 1, message => "No updates specified for File backend session update" };
    }

    my $session_file = File::Spec->catfile($self->{storage_dir}, $session_id);
    my $fh;
    unless (open $fh, '+<', $session_file) {
        return { success => 0, message => "Cannot open or update session file: $!" };
    }

    # Read entire file (pretty JSON spans multiple lines)
    local $/;
    my $json = <$fh>;
    my $session_info;
    if ($json) {
		eval {
			$session_info = JSON::PP->new->utf8->decode($json);
		};
		if ($@) {
			return { success => 0, message => "Invalid JSON in session file: $@" };
		}
	}

    # Apply updates
    if (exists $updates->{data}) {
        $session_info->{data} = $updates->{data} || {};
    }

    if (exists $updates->{expires_at}) {
        $session_info->{expires_at} = $updates->{expires_at};
    }

    # Always update last_updated timestamp
    $session_info->{last_updated} = time();

    # Encode to JSON with pretty formatting and write to file with trailing newline
    my $new_json = JSON::PP->new->utf8->pretty->encode($session_info);
    $fh->truncate(0);
    seek $fh, 0, 0;
    unless (print $fh $new_json, "\n") {
        close $fh;
        return { success => 0, message => "Cannot write to session file: $!" };
    }

    unless (close $fh) {
        return { success => 0, message => "Cannot close session file: $!" };
    }

    return { success => 1 };
}

sub delete_session {
    my ($self, $session_id) = @_;



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