File Coverage

blib/lib/Apertur/SDK/Resource/Polling.pm
Criterion Covered Total %
statement 11 36 30.5
branch 0 6 0.0
condition 0 15 0.0
subroutine 4 8 50.0
pod 4 5 80.0
total 19 70 27.1


line stmt bran cond sub pod time code
1             package Apertur::SDK::Resource::Polling;
2              
3 1     1   7 use strict;
  1         2  
  1         79  
4 1     1   9 use warnings;
  1         3  
  1         86  
5              
6 1     1   7 use Time::HiRes qw(sleep time);
  1         2  
  1         12  
7              
8             sub new {
9 3     3 0 7 my ($class, %args) = @_;
10 3         15 return bless { http => $args{http} }, $class;
11             }
12              
13             sub list {
14 0     0 1   my ($self, $uuid) = @_;
15 0           return $self->{http}->request('GET', "/api/v1/upload-sessions/$uuid/poll");
16             }
17              
18             sub download {
19 0     0 1   my ($self, $uuid, $image_id) = @_;
20             return $self->{http}->request_raw(
21 0           'GET', "/api/v1/upload-sessions/$uuid/images/$image_id",
22             );
23             }
24              
25             sub ack {
26 0     0 1   my ($self, $uuid, $image_id) = @_;
27             return $self->{http}->request(
28 0           'POST', "/api/v1/upload-sessions/$uuid/images/$image_id/ack",
29             );
30             }
31              
32             sub poll_and_process {
33 0     0 1   my ($self, $uuid, $handler, %options) = @_;
34              
35 0   0       my $interval = $options{interval} || 3;
36 0   0       my $timeout = $options{timeout} || 0;
37 0           my $start = time();
38              
39 0           while (1) {
40 0 0 0       if ($timeout > 0 && (time() - $start) >= $timeout) {
41 0           last;
42             }
43              
44 0           my $result = $self->list($uuid);
45 0   0       my $images = $result->{images} || [];
46              
47 0           for my $image (@$images) {
48 0 0 0       if ($timeout > 0 && (time() - $start) >= $timeout) {
49 0           return;
50             }
51 0           my $data = $self->download($uuid, $image->{id});
52 0           $handler->($image, $data);
53 0           $self->ack($uuid, $image->{id});
54             }
55              
56 0 0 0       if ($timeout > 0 && (time() - $start) >= $timeout) {
57 0           last;
58             }
59              
60 0           sleep($interval);
61             }
62              
63 0           return;
64             }
65              
66             1;
67              
68             __END__