ELab-Client
view release on metacpan or search on metacpan
lib/ELab/Client.pm view on Meta::CPAN
package ELab::Client;
# ABSTRACT: Access the eLabFTW API with Perl
$ELab::Client::VERSION = '0.020';
use strict;
use warnings;
use Moose;
use MooseX::NonMoose;
use MooseX::Params::Validate;
use JSON;
use HTTP::Request::Common qw '';
extends 'REST::Client';
has host => (
is => 'ro',
isa => 'Str',
required => 1,
);
has token => (
is => 'ro',
isa => 'Str',
required => 1,
);
has endpoint => (
is => 'ro',
isa => 'Str',
default => 'api/v1/'
);
sub get_backup_zip {
my $self = shift;
my $datespan = shift;
return $self->elab_get("backupzip/$datespan");
}
sub get_items_types {
my $self = shift;
return decode_json $self->elab_get("items_types/");
}
sub get_item_types {
return get_items_types(@_);
}
sub get_status {
my $self = shift;
return decode_json $self->elab_get("status/");
}
sub get_experiment_states {
return get_status(@_);
}
sub add_link_to_experiment {
my $self = shift;
my $id = shift;
my (%args) = validated_hash(
\@_,
link => { isa => 'Str' },
);
return decode_json $self->elab_post("experiments/$id", $self->buildQuery(%args));
}
sub add_link_to_item {
my $self = shift;
my $id = shift;
my (%args) = validated_hash(
\@_,
link => { isa => 'Str' },
);
return decode_json $self->elab_post("items/$id", $self->buildQuery(%args));
}
lib/ELab/Client.pm view on Meta::CPAN
my $id = shift;
return decode_json $self->elab_get("templates/$id");
}
sub post_experiment {
my $self = shift;
my $id = shift;
my (%args) = validated_hash(
\@_,
category => { isa => 'Str', optional => 1 },
title => { isa => 'Str', optional => 1 },
date => { isa => 'Str', optional => 1 },
body => { isa => 'Str', optional => 1 },
bodyappend => { isa => 'Str', optional => 1 },
);
return decode_json $self->elab_post("experiments/$id", $self->buildQuery(%args));
}
sub post_item {
my $self = shift;
my $id = shift;
my (%args) = validated_hash(
\@_,
category => { isa => 'Str', optional => 1 },
title => { isa => 'Str', optional => 1 },
date => { isa => 'Str', optional => 1 },
body => { isa => 'Str', optional => 1 },
bodyappend => { isa => 'Str', optional => 1 },
);
return decode_json $self->elab_post("items/$id", $self->buildQuery(%args));
}
sub post_template {
my $self = shift;
my $id = shift;
my (%args) = validated_hash(
\@_,
title => { isa => 'Str', optional => 1 },
date => { isa => 'Str', optional => 1 },
body => { isa => 'Str', optional => 1 },
);
return decode_json $self->elab_post("templates/$id", $self->buildQuery(%args));
}
sub upload_to_experiment {
my $self = shift;
my $id = shift;
my (%args) = validated_hash(
\@_,
file => { isa => 'Str' },
);
my $request = HTTP::Request::Common::POST(
$self->host().$self->endpoint()."experiments/$id",
{
file => [ $args{file} ]
},
Content_Type => 'form-data',
Authorization => $self->token(),
);
return decode_json $self->getUseragent()->request($request)->decoded_content();
}
sub upload_to_item {
my $self = shift;
my $id = shift;
my (%args) = validated_hash(
\@_,
file => { isa => 'Str' },
);
my $request = HTTP::Request::Common::POST(
$self->host().$self->endpoint()."items/$id",
{
file => [ $args{file} ]
},
Content_Type => 'form-data',
Authorization => $self->token(),
);
return decode_json $self->getUseragent()->request($request)->decoded_content();
}
sub create_event {
my $self = shift;
my $id = shift;
my (%args) = validated_hash(
\@_,
start => { isa => 'Str' },
end => { isa => 'Str' },
title => { isa => 'Str' },
);
return decode_json $self->elab_post("events/$id", $self->buildQuery(%args));
}
sub destroy_event {
my $self = shift;
my $id = shift;
return decode_json $self->elab_delete("events/$id");
}
sub get_all_events {
my $self = shift;
return decode_json $self->elab_get("events/");
}
sub get_event {
my $self = shift;
my $id = shift;
return decode_json $self->elab_get("events/$id");
}
sub BUILD {
my $self = shift;
my $args = shift;
$self->addHeader('Authorization', $self->token());
}
sub elab_get {
my $self = shift;
my $url = shift;
my $result = $self->GET($self->endpoint().$url);
return undef unless $result->responseCode() eq '200';
return $result->responseContent();
}
sub elab_delete {
my $self = shift;
my $url = shift;
my $result = $self->DELETE($self->endpoint().$url);
return undef unless $result->responseCode() eq '200';
return $result->responseContent();
}
sub elab_post {
my $self = shift;
my $url = shift;
my $data = shift;
$data =~ s/^\?//; # buildQuery starts with "?" (makes no sense here)
my $headers = { 'Content-Type' => 'application/x-www-form-urlencoded' };
my $result = $self->POST($self->endpoint().$url, $data, $headers);
return undef unless $result->responseCode() eq '200';
return $result->responseContent();
}
no Moose;
__PACKAGE__->meta->make_immutable;
1;
__END__
=pod
=encoding UTF-8
=head1 NAME
ELab::Client - Access the eLabFTW API with Perl
=head1 VERSION
version 0.020
=head1 SYNOPSYS
use ELab::Client;
my $elab = ELab::Client->new(
host => 'https://elab.somewhere.de/',
token => 'ae...d4',
);
my $e = $elab->post_experiment(4,
title => "Replacement experiment title",
body => "Replacement body text"
);
=head1 METHODS
=head2 API interface
This interface is intended to be compatible to the elabapy Python client.
=head3 get_backup_zip($datespan)
use File::Slurp;
write_file('backup.zip', get_backup_zip('20200101-20210101'));
Generates a zip file with all experiments changed in a given time period.
The period is specified as FROM-TO in the format YYYYMMDD-YYYYMMDD.
Requires sysadmin permissions.
=head3 get_items_types()
my $t = $elab->get_items_types();
Returns a list of database item types with their type id's.
The return value is an array reference, with the array items being hash
( run in 0.888 second using v1.01-cache-2.11-cpan-524268b4103 )