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}";
    }



( run in 1.069 second using v1.01-cache-2.11-cpan-39bf76dae61 )