File Coverage

blib/lib/WWW/Hetzner/Cloud/API/RRSets.pm
Criterion Covered Total %
statement 71 71 100.0
branch 42 44 95.4
condition 2 4 50.0
subroutine 17 17 100.0
pod 10 10 100.0
total 142 146 97.2


line stmt bran cond sub pod time code
1             package WWW::Hetzner::Cloud::API::RRSets;
2             # ABSTRACT: Hetzner Cloud DNS RRSets (Records) API
3              
4             our $VERSION = '0.100';
5              
6 25     25   189 use Moo;
  25         47  
  25         170  
7 25     25   9576 use Carp qw(croak);
  25         73  
  25         1574  
8 25     25   12710 use WWW::Hetzner::Cloud::RRSet;
  25         94  
  25         1027  
9 25     25   176 use namespace::clean;
  25         50  
  25         115  
10              
11              
12             has client => (
13             is => 'ro',
14             required => 1,
15             weak_ref => 1,
16             );
17              
18             has zone_id => (
19             is => 'ro',
20             required => 1,
21             );
22              
23             sub _wrap {
24 25     25   64 my ($self, $data) = @_;
25 25         670 return WWW::Hetzner::Cloud::RRSet->new(
26             client => $self->client,
27             zone_id => $self->zone_id,
28             %$data,
29             );
30             }
31              
32             sub _wrap_list {
33 3     3   11 my ($self, $list) = @_;
34 3         9 return [ map { $self->_wrap($_) } @$list ];
  15         4728  
35             }
36              
37             sub _base_path {
38 14     14   41 my ($self) = @_;
39 14         133 return "/zones/" . $self->zone_id . "/rrsets";
40             }
41              
42              
43             sub list {
44 3     3 1 4215 my ($self, %params) = @_;
45              
46 3         21 my $result = $self->client->get($self->_base_path, params => \%params);
47 3   50     28 return $self->_wrap_list($result->{rrsets} // []);
48             }
49              
50              
51             sub get {
52 3     3 1 147 my ($self, $name, $type) = @_;
53 3 100       627 croak "Record name required" unless $name;
54 2 100       341 croak "Record type required" unless $type;
55              
56 1         4 my $path = $self->_base_path . "/$name/$type";
57 1         8 my $result = $self->client->get($path);
58 1         6 return $self->_wrap($result->{rrset});
59             }
60              
61              
62             sub create {
63 11     11 1 1711 my ($self, %params) = @_;
64              
65 11 100       276 croak "name required" unless $params{name};
66 10 100       166 croak "type required" unless $params{type};
67 9 100       191 croak "records required" unless $params{records};
68              
69             my $body = {
70             name => $params{name},
71             type => $params{type},
72             records => $params{records},
73 8         40 };
74              
75 8 100       32 $body->{ttl} = $params{ttl} if $params{ttl};
76              
77 8         43 my $result = $self->client->post($self->_base_path, $body);
78 8         51 return $self->_wrap($result->{rrset});
79             }
80              
81              
82             sub update {
83 3     3 1 158 my ($self, $name, $type, %params) = @_;
84 3 100       286 croak "Record name required" unless $name;
85 2 100       308 croak "Record type required" unless $type;
86              
87 1         2 my $body = {};
88 1 50       8 $body->{ttl} = $params{ttl} if exists $params{ttl};
89 1 50       4 $body->{records} = $params{records} if exists $params{records};
90              
91 1         5 my $path = $self->_base_path . "/$name/$type";
92 1         13 my $result = $self->client->put($path, $body);
93 1         6 return $self->_wrap($result->{rrset});
94             }
95              
96              
97             sub delete {
98 3     3 1 162 my ($self, $name, $type) = @_;
99 3 100       311 croak "Record name required" unless $name;
100 2 100       315 croak "Record type required" unless $type;
101              
102 1         4 my $path = $self->_base_path . "/$name/$type";
103 1         9 return $self->client->delete($path);
104             }
105              
106              
107             sub add_a {
108 4     4 1 178 my ($self, $name, $ip, %opts) = @_;
109 4 100       280 croak "name required" unless $name;
110 3 100       317 croak "IP address required" unless $ip;
111              
112 2         12 return $self->create(
113             name => $name,
114             type => 'A',
115             records => [{ value => $ip }],
116             %opts,
117             );
118             }
119              
120              
121             sub add_aaaa {
122 3     3 1 120 my ($self, $name, $ip, %opts) = @_;
123 3 100       333 croak "name required" unless $name;
124 2 100       193 croak "IPv6 address required" unless $ip;
125              
126 1         8 return $self->create(
127             name => $name,
128             type => 'AAAA',
129             records => [{ value => $ip }],
130             %opts,
131             );
132             }
133              
134              
135             sub add_cname {
136 3     3 1 110 my ($self, $name, $target, %opts) = @_;
137 3 100       202 croak "name required" unless $name;
138 2 100       192 croak "target required" unless $target;
139              
140 1         10 return $self->create(
141             name => $name,
142             type => 'CNAME',
143             records => [{ value => $target }],
144             %opts,
145             );
146             }
147              
148              
149             sub add_mx {
150 3     3 1 165 my ($self, $name, $mailserver, $priority, %opts) = @_;
151 3 100       213 croak "name required" unless $name;
152 2 100       231 croak "mailserver required" unless $mailserver;
153 1   50     6 $priority //= 10;
154              
155 1         11 return $self->create(
156             name => $name,
157             type => 'MX',
158             records => [{ value => "$priority $mailserver" }],
159             %opts,
160             );
161             }
162              
163              
164             sub add_txt {
165 3     3 1 206 my ($self, $name, $value, %opts) = @_;
166 3 100       197 croak "name required" unless $name;
167 2 100       211 croak "value required" unless $value;
168              
169 1         10 return $self->create(
170             name => $name,
171             type => 'TXT',
172             records => [{ value => $value }],
173             %opts,
174             );
175             }
176              
177              
178             1;
179              
180             __END__