Google-CloudTasks

 view release on metacpan or  search on metacpan

lib/Google/CloudTasks/Client.pm  view on Meta::CPAN

package Google::CloudTasks::Client;

use Mouse;
use WWW::Google::Cloud::Auth::ServiceAccount;
use LWP::UserAgent;
use HTTP::Request;
use URI;
use URI::QueryParam;
use JSON::XS;

our $VERSION = "0.01";

has base_url => (
    is => 'ro',
    isa => 'Str',
    default => 'https://cloudtasks.googleapis.com/',
);

has version => (
    is => 'ro',
    isa => 'Str',
    default => 'v2',
);

has credentials_path => (
    is => 'ro',
    isa => 'Str'
);

has auth => (
    is => 'ro',
    lazy_build => 1,
);

has ua => (
    is => 'ro',
    lazy => 1,
    default => sub { LWP::UserAgent->new() },
);

has is_debug => (
    is => 'ro',
    isa => 'Bool',
    default => 0,
);

no Mouse;

__PACKAGE__->meta->make_immutable;

sub _build_auth {
    my ($self) = @_;

    if (!$self->credentials_path) {
        die "attribute 'credentials_path' is required";
    }
    my $auth = WWW::Google::Cloud::Auth::ServiceAccount->new(
        credentials_path => $self->credentials_path,
    );
    return $auth;
}

sub request {
    my ($self, $method, $path, $content) = @_;

    my $url = $self->base_url . $self->version . '/' . $path;
    my $req = HTTP::Request->new($method, $url);
    $req->header('Content-Type' => 'application/json; charset=utf8');
    $req->header('Authorization' => 'Bearer ' . $self->auth->get_token);
    if ($content) {
        my $encoded_body = encode_json($content);
        $req->header('Content-Length' => length($encoded_body));
        $req->content($encoded_body);
    }

    if ($self->is_debug) {
        use Data::Dumper;
        print "Request : " . Dumper($req);
    }

    my $res = $self->ua->request($req);

    if ($res->is_success) {
        return decode_json($res->content);
    }
    else {
        die "Fail: " . $res->content;
    }
}

sub request_get {
    my ($self, $path) = @_;
    return $self->request(GET => $path);
}

sub request_post {
    my ($self, $path, $content) = @_;
    $content //= {};
    return $self->request(POST => $path, $content);
}

sub request_delete {
    my ($self, $path) = @_;
    return $self->request(DELETE => $path);
}

sub request_patch {
    my ($self, $path, $content) = @_;
    return $self->request(PATCH => $path, $content);
}

sub _make_query_param {
    my ($args, @keys) = @_;

    my $u = URI->new();
    for (@keys) {
        if (defined $args->{$_}) {
            $u->query_param($_ => $args->{$_});



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