File Coverage

blib/lib/WWW/StreamSend.pm
Criterion Covered Total %
statement 16 18 88.8
branch n/a
condition n/a
subroutine 6 6 100.0
pod n/a
total 22 24 91.6


line stmt bran cond sub pod time code
1             package WWW::StreamSend;
2              
3 1     1   42018 use 5.010001;
  1         4  
  1         37  
4 1     1   6 use strict;
  1         1  
  1         29  
5 1     1   5 use warnings;
  1         5  
  1         34  
6              
7 1     1   828 use AutoLoader qw(AUTOLOAD);
  1         1462  
  1         6  
8              
9 1     1   4417 use LWP::UserAgent;
  1         104011  
  1         40  
10 1     1   661 use XML::Simple;
  0            
  0            
11             use Carp ();
12              
13             use WWW::StreamSend::Audience;
14             use WWW::StreamSend::Subscriber;
15              
16             our $VERSION = '0.03';
17              
18             sub new {
19             my ($class, $params) = @_;
20              
21             Carp::croak("Options to WWW::StreamSend should be hash reference")
22             if ref($params) ne ref {};
23              
24             my $self = {
25             login_id => $params->{login_id} || $params->{login},
26             key => $params->{key},
27             ua => LWP::UserAgent->new,
28             xs => XML::Simple->new,
29             };
30              
31             $self->{ua}->agent("Mozilla/5.0");
32              
33             bless $self => $class;
34             return $self;
35             }
36              
37             sub get_emails {
38             my ($self) = @_;
39             my $res = $self->_send_request('emails');
40              
41             return $res->{content};
42             }
43              
44             sub get_subscribers {
45             my ($self, $params) = @_;
46             my $audience = $params->{audience};
47             my $id = $params->{subscriber_id};
48              
49             # /audiences/1/people.xml
50             my $res = $self->_send_request('audiences', $audience.'/people/'.$id);
51             return $res->{content};
52             }
53              
54             sub get_subscribers_count {
55             my ($self, $params) = @_;
56              
57             my $type = $params->{type} || 'active'; # possible variations: 'inactive', 'unsubscribed', 'pending'
58             my $xmldata = $self->get_field({field => 'audiences', id => $params->{id}});
59             my $ref = $self->{xs}->XMLin($xmldata, ForceArray=>1);
60              
61             return $ref->{audience}->[0]->{$type.'-people-count'}->[0]->{content};
62             }
63              
64             sub get_field {
65             my ($self, $params) = @_;
66             my $accepted_fields = {
67             emails => 'emails',
68             users => 'users',
69             audiences => 'audiences',
70             };
71             my $res = (ref $params eq ref {}) ?
72             $self->_send_request($accepted_fields->{$params->{field}}, $params->{id}) :
73             $self->_send_request($accepted_fields->{$params});
74             return $res->{content};
75             }
76              
77             sub get_people {
78             my ($self, $params) = @_;
79             }
80              
81             sub get_audience {
82             my ($self, $params) = @_;
83             my $res = (exists $params->{id}) ?
84             $self->_send_request('audiences', $params->{id}) :
85             $self->_send_request('audiences');
86              
87             if ($res->{code} == '200') {
88             my $xml = $res->{content};
89             my $data = XMLin($xml, ForceArray=>1);
90              
91             if ($data->{type} || $data->{type} eq 'array') {
92             my @ret = ();
93             foreach my $item (@{$data->{audience}}) {
94             my $audience = WWW::StreamSend::Audience->new({xml => '', data => $item});
95             push @ret, $audience;
96             }
97             return @ret;
98             }
99             else { # 1 audience
100             my $audience = WWW::StreamSend::Audience->new({xml => $xml, data => $data});
101             return $audience;
102             }
103             }
104             return;
105             }
106              
107             sub add_subscriber {
108             my ($self, $params) = @_;
109             my $res = $self->_send_request(
110             'audiences',
111             $params->{audience}.'/people',
112             {
113             'person' => {
114             'email-address' => $params->{'email-address'},
115             'first-name' => $params->{'first-name'},
116             'last-name' => $params->{'last-name'},
117             'deliver-welcome' => $params->{'deliver-welcome'} || 'true'
118             }
119             }
120             );
121              
122             return $res->{code} == 200 ? 1 : 0;
123             }
124              
125             sub _send_request {
126             # http://app.streamsend.com/docs/api/index.html
127             my ($self, $rest, $id, $postdata) = @_;
128              
129             my $url = 'https://app.streamsend.com/'.$rest;
130             $url.='/'.$id if $id;
131              
132             my $method = $postdata ? 'POST' : 'GET';
133              
134             my $req = HTTP::Request->new($method => $url);
135             $req->header(
136             Accept => 'application/xml',
137             );
138             $req->authorization_basic ($self->{login_id}, $self->{key});
139              
140             if ($postdata) {
141             $req->content_type('text/xml');
142             my $xml = $self->{xs}->XMLout($postdata, NoAttr => 1, RootName => undef);
143             $req->content("$xml");
144             }
145              
146             my $res = $self->{ua}->request($req);
147              
148             if ($res->is_success) {
149             return ({code => 200, content => $res->content});
150             }
151             else {
152             return ({code => $res->code, content => $res->status_line});
153             }
154             }
155              
156             # Autoload methods go after =cut, and are processed by the autosplit program.
157              
158             1;
159             __END__