package WWW::Asana::Request; BEGIN { $WWW::Asana::Request::AUTHORITY = 'cpan:GETTY'; } { $WWW::Asana::Request::VERSION = '0.003'; } # ABSTRACT: Asana Request Class use MooX qw( +HTTP::Request +JSON +URI +URI::QueryParam ); has api_key => ( is => 'ro', required => 1, ); has to => ( is => 'ro', required => 1, ); has to_type => ( is => 'ro', lazy => 1, builder => 1, ); sub _build_to_type { my ( $self ) = @_; if ( $self->to =~ /\[(\w+)\]/ ) { return $1; } else { return $self->to; } } has to_multi => ( is => 'ro', lazy => 1, builder => 1, ); sub _build_to_multi { my ( $self ) = @_; if ( $self->to =~ /\[(\w+)\]/ ) { return 1; } else { return 0; } } has uri => ( is => 'ro', required => 1, ); has data => ( is => 'ro', predicate => 'has_data', ); has params => ( is => 'ro', predicate => 'has_params', ); has codes => ( is => 'ro', predicate => 'has_codes', ); has method => ( is => 'ro', default => sub { 'GET' } ); has _http_request => ( is => 'ro', lazy => 1, builder => 1, ); sub http_request { shift->_http_request } has json => ( is => 'ro', lazy => 1, builder => 1, ); sub _build_json { my $json = JSON->new; $json->allow_nonref; return $json; } sub _build__http_request { my ( $self ) = @_; my %data; %data = %{$self->data} if $self->has_data; my @params; @params = @{$self->params} if $self->has_params; if ($self->to_multi) { my $type = $self->to_type; if ($type eq 'Task') { push @params, [ opt_fields => join(',',qw( assignee assignee_status created_at completed completed_at due_on modified_at name notes )) ]; } elsif ($type eq 'Story') { push @params, [ opt_fields => join(',',qw( created_at created_by text target source type )) ]; } elsif ($type eq 'Project') { push @params, [ opt_fields => join(',',qw( created_at modified_at name notes )) ]; } elsif ($type eq 'Tag') { push @params, [ opt_fields => join(',',qw( created_at name notes )) ]; } elsif ($type eq 'User') { push @params, [ opt_fields => join(',',qw( name email )) ]; } elsif ($type eq 'Workspace') { push @params, [ opt_fields => join(',',qw( name )) ]; } } if ($self->has_data) { $data{$_} = $self->data->{$_} for (keys %{$self->data}); } my @headers; my $uri; my $body; my $u = URI->new($self->uri); $u->query_param(@{$_}) for @params; $uri = $u->as_string; if ($self->method ne 'GET') { push @headers, ('Content-type', 'application/json'); $body = $self->json->encode({ data => $self->data }); } elsif (%data) { warn 'Request includes %data but is a GET request'; } my $request = HTTP::Request->new( $self->method, $uri, \@headers, defined $body ? $body : (), ); $request->authorization_basic($self->api_key,""); # use DDP; # p($self->method); # p($uri); # p($body); # p(%data); # p(@params); # p($request->uri->as_string); # p($request->content); return $request; } 1; __END__ =pod =head1 NAME WWW::Asana::Request - Asana Request Class =head1 VERSION version 0.003 =head1 AUTHOR Torsten Raudssus =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2012 by Torsten Raudssus. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut