Amazon-CreatorsAPI
view release on metacpan or search on metacpan
lib/Amazon/CreatorsAPI.pm view on Meta::CPAN
package Amazon::CreatorsAPI;
use strict;
use warnings;
use Carp qw/croak/;
use JSON qw//;
use HTTP::Tiny;
use Amazon::CreatorsAPI::Auth;
use Class::Accessor::Lite (
ro => [qw/
credential_id
credential_secret
credential_version
partner_tag
marketplace
ua
auth_manager
operation_endpoint
/],
);
our $VERSION = '0.01';
our $JSON = JSON->new;
sub new {
my $class = shift;
my $credential_id = shift or croak 'credential_id is required';
my $credential_secret = shift or croak 'credential_secret is required';
my $credential_version = shift or croak 'credential_version is required';
my $opt = shift || +{};
if (!$opt->{ua}) {
$opt->{ua} = HTTP::Tiny->new;
}
bless +{
credential_id => $credential_id,
credential_secret => $credential_secret,
credential_version => $credential_version,
partner_tag => $opt->{partner_tag} || '',
marketplace => $opt->{marketplace} || 'www.amazon.com',
ua => $opt->{ua},
auth_manager => Amazon::CreatorsAPI::Auth->new(
$credential_id,
$credential_secret,
$credential_version,
$opt,
),
operation_endpoint => $opt->{operation_endpoint} || 'https://creatorsapi.amazon/catalog/v1',
}, $class;
}
sub get_browse_nodes {
return shift->operation('getBrowseNodes', @_);
}
sub get_items {
return shift->operation('getItems', @_);
}
sub get_variations {
return shift->operation('getVariations', @_);
}
sub search_items {
return shift->operation('searchItems', @_);
}
sub operation {
my $self = shift;
my $operation = shift || '';
my $params = shift || +{};
my $res = $self->ua->request(
'POST',
$self->operation_endpoint . '/' . $operation,
{
'headers' => {
'Authorization' => $self->_auth_header,
'Content-Type' => 'application/json',
'x-marketplace' => $self->marketplace,
},
'content' => $JSON->encode({
partnerTag => $self->partner_tag,
marketplace => $self->marketplace,
%{$params},
}),
},
);
if (!$res->{success}) {
croak "failed $operation status:$res->{status} "
. ($res->{reason} || 'reason_unknown')
. ", $res->{content}";
}
my $res_data = +{};
eval {
$res_data = $JSON->decode($res->{content});
};
if (my $e = $@) {
croak "could not JSON decode, $e : " . $res->{content};
}
return $res_data;
}
sub _auth_header {
my $self = shift;
my $am = $self->auth_manager;
my $token = $am->get_access_token;
return "Bearer $token" . (
!$am->is_lwa ? ', Version ' . $self->credential_version : ''
);
}
1;
__END__
=encoding UTF-8
=head1 NAME
Amazon::CreatorsAPI - The Amazon Creators API Helper
=head1 SYNOPSIS
use Amazon::CreatorsAPI;
use Data::Dumper;
my $api = Amazon::CreatorsAPI->new(
"{credential_id}",
( run in 2.617 seconds using v1.01-cache-2.11-cpan-63c85eba8c4 )