App-PAIA
view release on metacpan or search on metacpan
lib/App/PAIA/Command.pm view on Meta::CPAN
$self->session->set( $_, $response->{$_} ) for qw(access_token patron scope);
$self->session->set( expires_at => time + $response->{expires_in} );
$self->session->set( auth => $auth );
$self->session->set( core => $self->core ) if defined $self->core;
$self->store_session;
return $response;
}
our %required_scopes = (
patron => 'read_patron',
items => 'read_items',
request => 'write_items',
renew => 'write_items',
cancel => 'write_items',
fees => 'read_fees',
change => 'change_password',
);
sub auto_login_for {
my ($self, $command) = @_;
my $scope = $required_scopes{$command};
if ( $self->not_authentificated($scope) ) {
# add to existing scopes (TODO: only if wanted)
my $new_scope = join ' ', split(' ',$self->scope // ''), $scope;
$self->logger->("auto-login with scope '$new_scope'");
$self->login( $new_scope );
if ( $self->scope and !$self->has_scope($scope) ) {
die "current scope '{$self->scope}' does not include $scope!\n";
}
}
}
sub store_session {
my ($self) = @_;
$self->session->store;
$self->token($self->session->get('access_token'))
if defined $self->session->get('access_token');
$self->scope($self->session->get('scope'))
if defined $self->session->get('scope');
$self->patron($self->session->get('patron'))
if defined $self->session->get('patron');
# TODO: expires_at?
}
sub core_request {
my ($self, $method, $command, $params) = @_;
my $core = $self->core // $self->usage_error("missing PAIA core server URL");
$self->auto_login_for($command);
my $patron = $self->patron // $self->usage_error("missing patron identifier");
my $url = "$core/".uri_escape($patron);
$url .= "/$command" if $command ne 'patron';
# save PAIA core URL in session
if ( ($self->session->get('core') // '') ne $core ) {
$self->session->set( core => $core );
$self->store_session;
# TODO: could we save new expiry as well?
}
my $json = $self->request( $method => $url, $params );
if ($json->{doc}) {
# TODO: more details about failed documents
my @errors = grep { defined $_ } map { $_->{error} } @{$json->{doc}};
if (@errors) {
die join("\n", @errors)."\n";;
}
}
return $json;
}
# used in command::renew and ::cancel
sub uri_list {
my $self = shift;
map {
/^((edition|item)=)?(.+)/;
my $uri = URI->new($3);
$self->usage_error("not an URI: $3") unless $uri and $uri->scheme;
my $d = { ($2 // "item") => "$uri" };
$d;
} @_;
}
# TODO:
sub description {
my ($class) = @_;
$class = ref $class if ref $class;
# classname to filename
(my $pm_file = $class) =~ s!::!/!g;
$pm_file .= '.pm';
$pm_file = $INC{$pm_file} or return '';
open my $input, "<", $pm_file or return '';
my $descr = "";
open my $output, ">", \$descr;
use Pod::Usage;
pod2usage( -input => $input,
-output => $output,
-exit => "NOEXIT", -verbose => 99,
-sections => "DESCRIPTION",
indent => 0,
);
$descr =~ s/Description:\n//m;
chomp $descr;
( run in 2.008 seconds using v1.01-cache-2.11-cpan-8f98c5d2c55 )