File Coverage

blib/lib/Net/Azure/NotificationHubs.pm
Criterion Covered Total %
statement 70 70 100.0
branch 13 14 92.8
condition 9 11 81.8
subroutine 15 15 100.0
pod 2 2 100.0
total 109 112 97.3


line stmt bran cond sub pod time code
1             package Net::Azure::NotificationHubs;
2 5     5   869138 use 5.008001;
  5         22  
3 5     5   40 use strict;
  5         12  
  5         178  
4 5     5   34 use warnings;
  5         11  
  5         299  
5 5     5   2965 use Net::Azure::Authorization::SAS;
  5         114633  
  5         295  
6 5     5   2787 use Net::Azure::NotificationHubs::Request;
  5         33  
  5         227  
7 5     5   69 use JSON;
  5         12  
  5         45  
8 5     5   4712 use HTTP::Tiny;
  5         332161  
  5         299  
9 5     5   44 use URI;
  5         11  
  5         116  
10 5     5   22 use Carp;
  5         12  
  5         412  
11 5     5   30 use String::CamelCase qw/camelize wordsplit/;
  5         11  
  5         393  
12             use Class::Accessor::Lite (
13 5         53 new => 0,
14             ro => [qw[
15             agent
16             serializer
17             api_version
18             authorizer
19             apns_expiry
20             hub_name
21             ]],
22 5     5   28 );
  5         9  
23              
24             our $VERSION = "0.11";
25             our $DEFAULT_API_VERSION = "2015-04";
26             our $DEFAULT_TIMEOUT = 60;
27              
28             sub new {
29 9     9 1 853547 my ($class, %param) = @_;
30            
31 9         80 $param{agent} = HTTP::Tiny->new(agent => sprintf('%s/%s', $class, $VERSION));
32 9         877 $param{serializer} = JSON->new->utf8(1);
33 9   66     97 $param{api_version} ||= $DEFAULT_API_VERSION || croak 'api_version is required';
      100        
34              
35 7 100       24 if (!defined $param{authorizer}) {
36 6         10 $param{authorizer} = eval {
37 6         44 Net::Azure::Authorization::SAS->new(connection_string => $param{connection_string});
38             };
39 6 100       1125 if ($@) {
40 1         7 croak $@;
41             };
42             }
43              
44 6         35 bless {%param}, $class;
45             }
46              
47             sub _uri {
48 7     7   12024 my ($self, $path, %params) = @_;
49 7   100     30 $path ||= '/';
50 7         29 my $uri = URI->new($self->authorizer->endpoint);
51 7         20540 $uri->scheme('https');
52 7         13259 $uri->path($path);
53 7         368 $uri->query_form(%params);
54 7         566 $uri;
55             }
56              
57             sub _req {
58 7     7   25580 my ($self, $path, $payload, %params) = @_;
59 7 100       69 croak 'path is reuired' if !defined $path;
60 6 100       32 croak 'payload is required' if !defined $payload;
61 5 100       32 croak 'payload is not hashref' if ref($payload) ne 'HASH';
62 4   66     28 $params{api_version} ||= $self->api_version;
63 4         43 my $uri = $self->_uri($path, %params);
64 4         21 my $auth = $self->authorizer->token($uri->as_string);
65 4         1454 my $data = $self->serializer->encode($payload);
66 4         88 my $req = Net::Azure::NotificationHubs::Request->new(
67             POST => $uri->as_string,
68             {
69             'Authorization' => $auth,
70             'Content-Type' => 'application/atom+xml;charset=utf-8',
71             },
72             $data,
73             );
74 4         394 $req->agent($self->agent);
75 4         71 $req;
76             }
77              
78             sub send {
79 2     2 1 8121 my ($self, $payload, %param) = @_;
80 2         11 my $path = sprintf "/%s/messages/", $self->hub_name;
81 2         27 my $req = $self->_req($path, $payload);
82 2         7 for my $key (keys %param) {
83 3 50       10 next if !defined $param{$key};
84 3         10 my $header_name = join('-', 'ServiceBusNotification', wordsplit(camelize($key)));
85 3         62 $req->header($header_name => $param{$key});
86             }
87 2 100       8 if ($param{format} eq 'apple') {
88 1         4 $req->header('ServiceBusNotification-Apns-Expiry' => $self->apns_expiry);
89             }
90 2         8 $req;
91             }
92              
93              
94             1;
95             __END__