File Coverage

blib/lib/WebService/Prowl.pm
Criterion Covered Total %
statement 19 21 90.4
branch 1 2 50.0
condition n/a
subroutine 6 6 100.0
pod n/a
total 26 29 89.6


line stmt bran cond sub pod time code
1             package WebService::Prowl;
2              
3 1     1   5 use strict;
  1         2  
  1         37  
4 1     1   30 use 5.008_001; # for utf8::is_utf8()
  1         4  
  1         60  
5             our $VERSION = '0.07';
6              
7 1     1   1180 use LWP::UserAgent;
  1         50220  
  1         36  
8 1     1   9 use URI::Escape qw(uri_escape_utf8 uri_escape);
  1         2  
  1         103  
9 1     1   6 use Carp qw(croak);
  1         3  
  1         138  
10              
11             my $API_BASE_URL = 'https://api.prowlapp.com/publicapi/';
12              
13             BEGIN {
14 1     1   3 @WebService::Prowl::EXPORT = qw( LIBXML );
15 1 50       3 if ( eval { require XML::LibXML::Simple } ) {
  1         443  
16 0         0 *{WebService::Prowl::LIBXML} = sub() {1};
17             }
18             else {
19 1         418 require XML::Simple;
20 0           *{WebService::Prowl::LIBXML} = sub() {0};
21             }
22             }
23              
24             sub new {
25             my $class = shift;
26             my %params = @_;
27             my $apikey = $params{'apikey'};
28             return bless {
29             apikey => $params{'apikey'},
30             ua => LWP::UserAgent->new( agent => __PACKAGE__ . '/' . $VERSION ),
31             error => '',
32             $params{'providerkey'} ? (providerkey => $params{'providerkey'}) : (),
33             }, $class;
34             }
35              
36             sub ua { $_[0]->{ua} }
37              
38             sub error { $_[0]->{error} }
39              
40             sub _build_url {
41             my ( $self, $method, %params ) = @_;
42             if ($method eq 'verify') {
43             croak("apikey is required") unless $self->{apikey};
44             my $url = $API_BASE_URL . 'verify?apikey=' . $self->{apikey};
45             $url .= '&providerkey=' . $self->{providerkey} if $self->{providerkey};
46             return $url;
47             }
48             elsif ($method eq 'add') {
49             croak("apikey is required") unless $self->{apikey};
50             my @params = qw/priority application event description url/;
51             my $req_params = +{ map { $_ => delete $params{$_} } @params };
52              
53             croak("event name is required") unless $req_params->{event};
54             croak("application name is required") unless $req_params->{application};
55             croak("description is required") unless $req_params->{description};
56              
57             $req_params->{priority} ||= 0;
58              
59             ##XXX: validate url parameter???
60              
61             croak("priority must be an integer value in the range [-2, 2]")
62             if ( $req_params->{priority} !~ /^-?\d+$/
63             || $req_params->{priority} < -2
64             || $req_params->{priority} > 2 );
65              
66             my %query = (
67             apikey => $self->{apikey},
68             $self->{providerkey} ? (providerkey => $self->{providerkey}) : (),
69             map { $_ => $req_params->{$_} } @params,
70             );
71             my @out;
72             for my $k (keys %query) {
73             push @out, sprintf("%s=%s", _uri_escape($k), _uri_escape($query{$k}));
74             }
75             my $q = join ('&', @out);
76             return $API_BASE_URL . 'add?' . $q;
77             }
78             elsif ($method eq 'retrieve_token') {
79             croak("providerkey is required") unless $self->{providerkey};
80             return $API_BASE_URL . 'retrieve/token?providerkey=' . $self->{providerkey};
81             }
82             elsif ($method eq 'retrieve_apikey') {
83             croak("providerkey is required") unless $self->{providerkey};
84             my $token = $params{'token'};
85             croak("token is required") unless $token;
86             my $url = $API_BASE_URL . 'retrieve/apikey?providerkey=' . $self->{providerkey};
87             $url .= '&token=' . $token;
88             return $url;
89             }
90             }
91              
92             sub add {
93             my ( $self, %params, $cb ) = @_;
94             my $url = $self->_build_url('add', %params);
95             $self->_send_request($url, $cb);
96             }
97              
98             sub verify {
99             my ($self) = @_;
100             my $url = $self->_build_url('verify');
101             $self->_send_request($url);
102             }
103              
104             sub retrieve_token {
105             my ( $self, %params, $cb ) = @_;
106             my $url = $self->_build_url('retrieve_token', %params);
107             $self->_send_request($url, $cb);
108             }
109              
110             sub retrieve_apikey {
111             my ( $self, %params, $cb ) = @_;
112             my $url = $self->_build_url('retrieve_apikey', %params);
113             $self->_send_request($url, $cb);
114             }
115              
116             sub _send_request {
117             my ( $self, $url, $cb ) = @_;
118             my $res = $self->{ua}->get($url);
119             my $data = $self->_xmlin($res->content);
120             if ($res->is_error) {
121             $self->{error} =
122             $data->{error}
123             ? $data->{error}{code} . ': ' . $data->{error}{content}
124             : '';
125             return;
126             }
127             return $data;
128             }
129              
130             sub _xmlin {
131             my ( $self, $xml ) = @_;
132             if (LIBXML) {
133             return XML::LibXML::Simple->new->XMLin( $xml );
134             }
135             else {
136             return XML::Simple->new->XMLin( $xml );
137             }
138             }
139              
140             sub _uri_escape {
141             utf8::is_utf8($_[0]) ? uri_escape_utf8($_[0]) : uri_escape($_[0]);
142             }
143              
144             1;
145             __END__