package Catmandu::Importer::MendeleyCatalog; use Catmandu::Sane; use Moo; use OAuth::Lite2::Client::ClientCredentials; use HTTP::Tiny; use JSON::XS; use Catmandu::Util qw(is_value); with 'Catmandu::Importer'; my $DOCUMENT_CONTENT_TYPE = 'application/vnd.mendeley-document.1+json'; my $CATALOG_SEARCH_PATH = '/search/catalog'; my $CATALOG_PATH = '/catalog'; my @QUERY_FIELDS = qw(title author source abstract); my @IDENTIFIER_FIELDS = qw(arxiv doi isbn issn pmid scopus filehash); has client_id => (is => 'ro', required => 1); has client_secret => (is => 'ro', required => 1); has client => (is => 'lazy'); has params => (is => 'ro', default => sub { +{} }); has path => (is => 'rwp', default => sub { $CATALOG_SEARCH_PATH }); sub BUILD { my ($self, $args) = @_; my @query_keys = grep { is_value($args->{$_}) } @QUERY_FIELDS; my @identifier_keys = grep { is_value($args->{$_}) } @IDENTIFIER_FIELDS; my $params = $self->params; $params->{view} = $args->{view} || 'all'; # get by id if (is_value($args->{id})) { $self->_set_path("$CATALOG_PATH/$args->{id}"); # query search } elsif (is_value($args->{query})) { $params->{query} = $args->{query}; $params->{limit} = $args->{limit} if is_value($args->{limit}); # fielded search } elsif (@query_keys) { $params->{$_} = $args->{$_} for @query_keys; $params->{limit} = $args->{limit} if is_value($args->{limit}); # identifier search } elsif (@identifier_keys) { $params->{$_} = $args->{$_} for @identifier_keys; $self->_set_path($CATALOG_PATH); } else { die "Missing required arguments"; } } sub _build_client { my ($self) = @_; OAuth::Lite2::Client::ClientCredentials->new( id => $self->client_id, secret => $self->client_secret, access_token_uri => 'https://api.mendeley.com/oauth/token', ); } sub generator { my ($self) = @_; sub { state $docs = $self->_get_documents; shift @$docs; }; } sub _get_documents { my ($self) = @_; my $token = $self->client->get_access_token->access_token; my $http = HTTP::Tiny->new; my $path = $self->path; my $params = $http->www_form_urlencode($self->params); my $res = $http->get("https://api.mendeley.com/$path?$params", { headers => { Accept => $DOCUMENT_CONTENT_TYPE, Authorization => sprintf(q{Bearer %s}, $token) } }); decode_json($res->{content}); } 1;