File Coverage

blib/lib/WebService/Pandora/Method.pm
Criterion Covered Total %
statement 39 77 50.6
branch 4 30 13.3
condition 1 3 33.3
subroutine 11 11 100.0
pod 3 3 100.0
total 58 124 46.7


line stmt bran cond sub pod time code
1             package WebService::Pandora::Method;
2              
3 4     4   26037 use strict;
  4         8  
  4         131  
4 4     4   23 use warnings;
  4         6  
  4         99  
5              
6 4     4   2110 use WebService::Pandora::Cryptor;
  4         42  
  4         2110  
7              
8 4     4   62136 use URI;
  4         40195  
  4         137  
9 4     4   3736 use JSON;
  4         68574  
  4         44  
10 4     4   7971 use HTTP::Request;
  4         105162  
  4         160  
11 4     4   15740 use LWP::UserAgent;
  4         204890  
  4         157  
12 4     4   104 use Data::Dumper;
  4         10  
  4         3321  
13              
14             ### constructor ###
15              
16             sub new {
17              
18 1     1 1 15 my $caller = shift;
19              
20 1         2 my $class = ref( $caller );
21 1 50       5 $class = $caller if ( !$class );
22              
23 1         16 my $self = {'name' => undef,
24             'partnerAuthToken' => undef,
25             'userAuthToken' => undef,
26             'partnerId' => undef,
27             'userId' => undef,
28             'syncTime' => undef,
29             'host' => undef,
30             'ssl' => 0,
31             'encrypt' => 1,
32             'cryptor' => undef,
33             'timeout' => 10,
34             'params' => {},
35             @_};
36              
37 1         4 bless( $self, $class );
38              
39             # create and store user agent object
40 1         16 $self->{'ua'} = LWP::UserAgent->new( timeout => $self->{'timeout'} );
41              
42             # create and store json object
43 1         5523 $self->{'json'} = JSON->new();
44              
45 1         6 return $self;
46             }
47              
48             ### getters/setters ###
49              
50             sub error {
51              
52 2     2 1 786 my ( $self, $error ) = @_;
53              
54 2 100       9 $self->{'error'} = $error if ( defined( $error ) );
55              
56 2         8 return $self->{'error'};
57             }
58              
59             ### public methods ###
60              
61             sub execute {
62              
63 1     1 1 9 my ( $self ) = @_;
64              
65             # make sure both name and host were given
66 1 50 33     13 if ( !defined( $self->{'name'} ) || !defined( $self->{'host'} ) ) {
67              
68 1         6 $self->error( 'Both the name and host must be provided to the constructor.' );
69 1         3 return;
70             }
71              
72             # craft the json data accordingly
73 0           my $json_data = {};
74              
75 0 0         if ( defined( $self->{'userAuthToken'} ) ) {
76              
77 0           $json_data->{'userAuthToken'} = $self->{'userAuthToken'};
78             }
79              
80 0 0         if ( defined( $self->{'syncTime'} ) ) {
81              
82 0           $json_data->{'syncTime'} = int( $self->{'syncTime'} );
83             }
84              
85             # merge the two required params with the additional user-supplied args
86 0           $json_data = {%$json_data, %{$self->{'params'}}};
  0            
87              
88             # encode it to json
89 0           $json_data = $self->{'json'}->encode( $json_data );
90              
91             # encrypt it, if needed
92 0 0         if ( $self->{'encrypt'} ) {
93              
94 0           $json_data = $self->{'cryptor'}->encrypt( $json_data );
95              
96             # detect error decrypting
97 0 0         if ( !defined( $json_data ) ) {
98              
99 0           $self->error( 'An error occurred encrypting our JSON data: ' . $self->{'cryptor'}->error() );
100 0           return;
101             }
102             }
103              
104             # http or https?
105 0 0         my $protocol = ( $self->{'ssl'} ) ? 'https://' : 'http://';
106              
107             # craft the full URL, protocol + host + path
108 0           my $url = $protocol . $self->{'host'} . '/services/json/';
109              
110             # create URI object
111 0           my $uri = URI->new( $url );
112              
113             # create all url params for POST request
114 0           my $url_params = ['method' => $self->{'name'}];
115              
116             # set user_auth_token if provided
117 0 0         if ( defined( $self->{'userAuthToken'} ) ) {
    0          
118              
119 0           push( @$url_params, 'auth_token' => $self->{'userAuthToken'} );
120             }
121              
122             # set partner_auth_token if provided and user_auth_token was not
123             elsif ( defined( $self->{'partnerAuthToken'} ) ) {
124              
125 0           push( @$url_params, 'auth_token' => $self->{'partnerAuthToken'} );
126             }
127              
128             # set partner_id if provided
129 0 0         if ( defined( $self->{'partnerId'} ) ) {
130              
131 0           push( @$url_params, 'partner_id' => $self->{'partnerId'} );
132             }
133              
134             # set user_id if provided
135 0 0         if ( defined( $self->{'userId'} ) ) {
136              
137 0           push( @$url_params, 'user_id' => $self->{'userId'} );
138             }
139              
140             # add the params to the URI
141 0           $uri->query_form( $url_params );
142              
143             # create and store the POST request accordingly
144 0           my $request = HTTP::Request->new( 'POST', $uri );
145              
146             # json data is the POST content
147 0           $request->content( $json_data );
148              
149             # issue the HTTP request
150 0           my $response = $self->{'ua'}->request( $request );
151              
152             # handle request error
153 0 0         if ( !$response->is_success() ) {
154              
155 0           $self->error( $response->status_line() );
156 0           return;
157             }
158              
159             # decode the raw content of the response
160 0           my $content = $response->decoded_content();
161              
162             # decode the JSON content
163 0           $json_data = $self->{'json'}->decode( $content );
164              
165             # handle pandora error
166 0 0         if ( $json_data->{'stat'} ne 'ok' ) {
167              
168 0           $self->error( "$self->{'name'} error $json_data->{'code'}: $json_data->{'message'}" );
169 0           return;
170             }
171              
172             # return all result data, if any exists
173 0 0         return $json_data->{'result'} if ( defined( $json_data->{'result'} ) );
174              
175             # otherwise just return a true value to indicate success
176 0           return 1;
177             }
178              
179             1;