File Coverage

blib/lib/WWW/Foursquare/Request.pm
Criterion Covered Total %
statement 77 97 79.3
branch 15 26 57.6
condition 2 8 25.0
subroutine 13 15 86.6
pod 0 4 0.0
total 107 150 71.3


line stmt bran cond sub pod time code
1             package WWW::Foursquare::Request;
2              
3 3     3   24536 use strict;
  3         7  
  3         108  
4 3     3   15 use warnings;
  3         5  
  3         132  
5              
6 3     3   735 use WWW::Foursquare::Config;
  3         6  
  3         336  
7 3     3   1515 use WWW::Foursquare::Response;
  3         9  
  3         97  
8 3     3   4211 use LWP::UserAgent;
  3         329897  
  3         112  
9 3     3   36 use URI::Escape;
  3         10  
  3         3410  
10              
11             sub new {
12 2     2 0 18 my ($class, $params) = @_;
13              
14 2         5 my $self = {};
15 2         6 bless $self, $class;
16 2         11 $self->{access_token} = $params->{access_token};
17 2         5 $self->{client_id} = $params->{client_id};
18 2         6 $self->{client_secret} = $params->{client_secret};
19 2         5 $self->{debug} = $params->{debug};
20 2         6 $self->{GET} = [];
21 2         19 $self->{ua} = LWP::UserAgent->new();
22              
23 2         6720 return $self;
24             }
25              
26             sub GET {
27 7     7 0 2382 my ($self, $path, $params) = @_;
28              
29             # add request to multi list
30 7 100       31 return $self->MULTI('GET', $path, $params) if delete $params->{multi};
31 2 50       9 my $is_show_request = 1 if delete $params->{show_request};
32              
33             # add auth params
34 2         24 $self->_add_auth_to_params($params);
35              
36 2         6 my $query = $self->_params_to_str($params);
37 2         8 my $result_url = sprintf "%s%s?%s", $API_ENDPOINT, $path, $query;
38              
39             # debug request
40 2 50       15 $self->_debug('GET', $result_url) if $self->{debug};
41              
42             # for testing url request
43 2 50       13 return $result_url if $is_show_request;
44              
45 0         0 my $res = $self->{ua}->get($result_url);
46 0         0 return $self->_response($res);
47             }
48              
49             sub POST {
50 1     1 0 729 my ($self, $path, $params) = @_;
51              
52 1 50       5 my $is_show_request = 1 if delete $params->{show_request};
53              
54             # add auth params
55 1         4 $self->_add_auth_to_params($params);
56              
57 1         5 my $query = $self->_params_to_auth($params);
58 1         4 my $result_url = sprintf "%s%s?%s", $API_ENDPOINT, $path, $query;
59            
60             # debug request
61 1 50       5 $self->_debug('POST', $result_url, $params) if $self->{debug};
62              
63             # for testing url request
64 1 50       5 return $result_url if $is_show_request;
65              
66             # convert hash to array (because of LWP)
67 0         0 my @params = map { $_ => $params->{$_} } keys %$params;
  0         0  
68              
69 0         0 my $res = $self->{ua}->post($result_url, Content_Type => 'form-data', Content => [ @params ]);
70 0         0 return $self->_response($res);
71             }
72              
73             sub MULTI {
74 5     5 0 9 my ($self, $method, $path, $params) = @_;
75              
76             # internal type error
77 5 50       31 return 'error' if ($method !~ /^GET|POST$/);
78              
79 5         7 my $force = delete $params->{force};
80 5         11 my $query = $self->_params_to_str($params);
81 5 50       17 my $url = $query
82             ? sprintf("/%s?%s", $path, $query)
83             : sprintf("/%s", $path);
84              
85 5         5 push @{$self->{$method}}, $url;
  5         11  
86            
87             # send multi request
88 5 100 66     7 if (@{ $self->{$method} } >= 5 || $force) {
  5         24  
89              
90 1         2 my $request = join ',', @{$self->{$method}};
  1         3  
91 1         3 $params->{requests} = $request;
92 1         3 delete $self->{$method};
93              
94 1         18 return $self->$method('multi', $params);
95             }
96             # put request to queue
97             else {
98              
99 4         4 return scalar(@{ $self->{$method} });
  4         14  
100             }
101             }
102              
103             sub _response {
104 0     0   0 my ($self, $res) = @_;
105              
106 0         0 return WWW::Foursquare::Response->new()->process($res);
107             }
108              
109             sub _add_auth_to_params {
110 3     3   5 my ($self, $params) = @_;
111              
112 3 50       12 if ($self->{userless}) {
113              
114 0         0 $params->{client_id} = $self->{client_id};
115 0         0 $params->{client_secret} = $self->{client_secret};
116             }
117             else {
118              
119 3         8 $params->{oauth_token} = $self->{access_token};
120             }
121 3         8 $params->{v} = $API_VERSION;
122             }
123              
124             sub _debug {
125 0     0   0 my ($self, $type, $url, $params) = @_;
126              
127 0         0 my $param_text;
128 0         0 for my $key ($params) {
129              
130 0   0     0 my $value = $params->{$key} || '';
131 0         0 $param_text .= sprintf "[%s] = [%s]\n", $key, $value;
132             }
133            
134 0         0 warn "Request: $type";
135 0         0 warn "Url: $url";
136              
137 0 0 0     0 if ($type =~ /post/ && $param_text) {
138              
139 0         0 warn "Params: ";
140 0         0 warn $param_text;
141             }
142             }
143              
144             sub _params_to_str {
145 7     7   9 my ($self, $params) = @_;
146              
147 7         23 my %copy_params = %$params;
148 7         12 delete $copy_params{show_request};
149              
150 7         21 my $query = join '&', map { $_.'='.uri_escape($copy_params{$_}) } sort keys %copy_params;
  7         275  
151 7         40 return $query;
152             }
153              
154             sub _params_to_auth {
155 1     1   3 my ($self, $params) = @_;
156              
157 1         3 my @auth = qw(client_id client_secret oauth_token v);
158 1         2 my @exists;
159             PARAM:
160 1         2 for my $param (@auth) {
161            
162 4 100       24 next PARAM if not exists $params->{$param};
163 2         10 push @exists, $param.'='.uri_escape($params->{$param});
164             }
165 1         13 my $query = join '&', @exists;
166 1         3 return $query;
167             }
168              
169              
170             1;