package Pcore::API::Facebook;
use Pcore -const, -class, -res;
use Pcore::Util::Data qw[to_uri from_json];
use Pcore::Util::Scalar qw[is_plain_arrayref];
with qw[
Pcore::API::Facebook::User
Pcore::API::Facebook::Marketing
];
has token => ( required => 1 );
has max_threads => 1;
has _semaphore => sub ($self) { Coro::Semaphore->new( $self->{max_threads} ) }, is => 'lazy';
const our $DEFAULT_LIMIT => 500;
sub _req ( $self, $method, $path, $params = undef, $data = undef ) {
# block thread
my $guard = $self->{max_threads} && $self->_semaphore->guard;
my $url = "https://graph.facebook.com/$path?access_token=$self->{token}";
my $limit;
if ($params) {
$limit = delete $params->{limit};
$params->{fields} = join ',', $params->{fields}->@* if is_plain_arrayref $params->{fields};
$url .= '&' . to_uri $params;
}
if ($limit) {
$url .= "&limit=$limit";
}
else {
$url .= "&limit=$DEFAULT_LIMIT";
}
my $result = res 200;
GET_NEXT_PAGE:
my $res = P->http->request(
method => $method,
url => $url,
data => $data,
);
my $res_data = $res->{data} ? from_json $res->{data} : undef;
if ($res) {
if ($res_data) {
if ( $res_data->{paging} || is_plain_arrayref $res_data->{data} ) {
push $result->{data}->@*, $res_data->{data}->@*;
# get all records
if ( !$limit && ( $url = $res_data->{paging}->{next} ) ) {
goto GET_NEXT_PAGE;
}
}
else {
$result->{data} = $res_data;
}
}
}
# request error
else {
$result = res [ $res->{status}, $res_data->{error}->{message} ];
}
return $result;
}
1;
## -----SOURCE FILTER LOG BEGIN-----
##
## PerlCritic profile "pcore-script" policy violations:
## +------+----------------------+----------------------------------------------------------------------------------------------------------------+
## | Sev. | Lines | Policy |
## |======+======================+================================================================================================================|
## | 3 | 19 | Subroutines::ProhibitUnusedPrivateSubroutines - Private subroutine/method '_req' declared but not used |
## +------+----------------------+----------------------------------------------------------------------------------------------------------------+
##
## -----SOURCE FILTER LOG END-----
__END__
=pod
=encoding utf8
=head1 NAME
Pcore::API::Facebook
=head1 SYNOPSIS
=head1 DESCRIPTION
=head1 ATTRIBUTES
=head1 METHODS
=head1 SEE ALSO
=cut