Hetula-Client
    
    
  
  
  
view release on metacpan or search on metacpan
META.json
META.yml
Makefile.PL
README
README.md
bin/hetula-client
dist.ini
lib/Hetula/Client.pm
t/00-load.t
t/01-usage.t
t/credentials
t/ssns.txt
t/ssnsWithContext.txt
bin/hetula-client view on Meta::CPAN
use IO::Prompter {
  prompt_password => [-timeout=>120, -echo=>'*'],
  prompt_string   => [-timeout=>120],
};
my %args;
Getopt::Long::GetOptions(
  'a|action:s'          => \$args{action},
  'c|credentials:s'     => \$args{credentials},
  'l|list'              => \$args{listActions},
  'o|organization:s'    => \$args{organization},
  'p|password:s'        => \$args{password},
  'u|username:s'        => \$args{username},
  'url=s'               => \$args{baseURL},
  'a|action:s'          => \$args{action},
  'version'             => sub { Getopt::Long::VersionMessage() },
  'h|help'              => sub {
  print <<HELP;
bin/hetula-client view on Meta::CPAN
For more information, see
  perldoc Hetula::Client
  -a --action String
      Instead of using the built-in menu, trigger a single action from the
      commandline.
      Give the action name with the necessary parameters,
      eg. ssnsBatchAddFromFile(/tmp/ssns.txt,/tmp/ssns.results.txt)
          userDisableAccount(username)
  -c --credentials File
      Where to read the username and password, is more secure than passing them
      as commandline arguments directly.
      These credentials overload any other parameters given.
      The credentials file must consist of up to 4 lines, with each line
      specifying the following commandline argument replacements:
        username
        password
        organization
        url
  -l --list
      List actions that can be invoked with --action
  -o --organization String
      Code of the Hetula organization we are operating on behalf.
  
  -p --password String
      Login to Hetula with this. Avoid using this, will be asked securely if
      not supplied. Use --credentials instead.
  -u --username String
      Login to Hetula with this.
  --url String
      base url of the Hetula instance to connect to.
      ex. https://hetula.example.com
  -v level
        Verbose output to the STDOUT,
bin/hetula-client view on Meta::CPAN
  exit 0;
},
) or die("Error in command line arguments: $! $@"); #EO Getopt::Long::GetOptions()
if ($args{listActions}) {
  listActions();
  exit 0;
}
Hetula::Client::slurpCredentials($args{credentials}, \%args) if $args{credentials};
Hetula::Client::_detectKohaEnvironment(\%args); #If using Koha, try to get the configurations from Koha's config
$args{username}     = prompt_string(  "Hetula username:").''     unless $args{username};
$args{password}     = prompt_password("Hetula password:").''     unless $args{password};
$args{organization} = prompt_string(  "Hetula organization:").'' unless $args{organization};
$args{baseURL}      = prompt_string(  "Hetula base URL:").''     unless $args{baseURL};
my $hc = Hetula::Client->new({
lib/Hetula/Client.pm view on Meta::CPAN
##External modules
use Mojo::UserAgent;
use Storable;
use Regexp::Common;
use Data::Printer;
=head3 new
 @param1 {HASHRef} baseURL => https://hetula.example.com
                   credentials => filepath, Where to load the credentials file.
                                  see slurpCredentials() for more info.
=cut
sub new($class, $params) {
  slurpCredentials($params->{credentials}, $params) if ($params->{credentials});
  _detectKohaEnvironment($params);
  die("Hetula::Client::BadParam - parameter 'baseURL' is missing") unless $params->{baseURL};
  die("Hetula::Client::BadParam - parameter 'baseURL' '$params->{baseURL}' is not a valid URI") unless $params->{baseURL} =~ /$RE{URI}{HTTP}{-scheme=>qr!https?!}/;
  my $s = bless(Storable::dclone($params), $class);
  $s->{ua} = Mojo::UserAgent->new() unless $s->{ua};
  return $s;
}
=head2 API Access methods
=head3 login
See Hetula API doc for endpoint POST /api/v1/auth
 @param1 {HASHRef} username => String || undef if given via credentials during construction,
                   password => String || undef if given via credentials during construction,
                   organization => String || undef if given via credentials during construction,
=cut
sub login($s, $params={}) {
  $params->{username} = $s->{username} unless $params->{username};
  $params->{password} = $s->{password} unless $params->{password};
  $params->{organization} = $s->{organization} unless $params->{organization};
  my $tx = $s->ua->post( $s->baseURL().'/api/v1/auth', {Accept => '*/*'}, json => $params );
  my $json = _handleResponse($tx);
lib/Hetula/Client.pm view on Meta::CPAN
  die("Hetula::Client::BadParameter - parameter 'id' or 'username' is missing") unless ($id);
  my $tx = $s->ua->delete( $s->baseURL()."/api/v1/users/$id/password", {Accept => '*/*'} );
  return _handleResponse($tx);
}
=head2 HELPERS
=head3 slurpCredentials
@static
Reads the contents of a credentials file.
The credentials file must consist of up to 4 lines, with each line
specifying the following commandline argument replacements:
  username
  password
  organization
  url
 @param1 {String} Path to the credentials file
 @param2 {HASHRef} Optional, HASHRef where to inject the found credentials
=cut
sub slurpCredentials($credentialsFile, $injectHere=undef) {
  open(my $FH, '<:encoding(UTF-8)', $credentialsFile) or die("Couldn't read '$credentialsFile': $!");
  my $username     = <$FH>; if ($username)     { chomp($username);     $injectHere->{username}     = $username     if $username && $injectHere; }
  my $password     = <$FH>; if ($password)     { chomp($password);     $injectHere->{password}     = $password     if $password && $injectHere; }
  my $organization = <$FH>; if ($organization) { chomp($organization); $injectHere->{organization} = $organization if $organization && $injectHere; }
  my $baseURL      = <$FH>; if ($baseURL)      { chomp($baseURL);      $injectHere->{baseURL}      = $baseURL      if $baseURL && $injectHere; }
  return ($username, $password, $organization, $baseURL);
}
=head2 ATTRIBUTES
=head3 ua
t/01-usage.t view on Meta::CPAN
use File::Slurp;
use File::Temp;
use Hetula::Client;
#$ENV{HETULA_DEBUG} = 1;
#$ENV{MOJO_INSECURE} = 1;
$ENV{MOJO_LOG_LEVEL} = 'info';
## Get credentials to use. Alternatively one can temporarily test with real credentials this predesigned test suite.
my $realCredentials = 0;
my $credentialsFile = "$FindBin::Bin/credentials";
my @credentials = File::Slurp::read_file($credentialsFile, chomp => 1);
my $username     = $credentials[0];
my $password     = $credentials[1];
my $organization = $credentials[2];
my $baseURL      = $credentials[3];
if ($realCredentials) { #test with real credentials here
  $username     = '';
  $password     = '';
  $organization = '';
  $baseURL      = '';
}
## Credentials dealt with.
my $hc = Hetula::Client->new({baseURL => $baseURL});
mockServer($hc) unless $realCredentials;
my $resp = $hc->login({username => 'master', password => 'blaster', organization => $organization});
ok($resp->{error}, "Login failed - Using bad credentials, got error '$resp->{error}'");
$resp = $hc->login({username => $username, password => $password, organization => $organization});
ok(! $resp->{error}, "Login success");
$resp = $hc->loginActive();
ok(! $resp->{error}, "Login active");
t/01-usage.t view on Meta::CPAN
$resp = $hc->userDisableAccount({username => $username});
ok(! $resp->{error}, "User disable account succeeded");
$resp = $hc->userChangePassword({username => $username, password => $password});
ok(! $resp->{error}, "User change password succeeded");
subtest "New Hetula::Client with a credentials file", sub {
  plan tests => 1;
  my $hc = Hetula::Client->new({baseURL => $baseURL, credentials => $credentialsFile});
  mockServer($hc) unless $realCredentials;
  $resp = $hc->login();
  ok(! $resp->{error}, "Login success");
};
subtest "ssnsBatchAddFromFile()", sub {
  plan tests => 11;
  my ($FH, $tempFilename) = File::Temp::tempfile();
( run in 1.150 second using v1.01-cache-2.11-cpan-c333fce770f )