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 )