1 <?php
2 /**
3 * Copyright 2012-2014 Rackspace US, Inc.
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17
18 namespace OpenCloud\DNS\Resource;
19
20 use OpenCloud\Common\Http\Message\Formatter;
21
22 /**
23 * The Domain class represents a single domain
24 *
25 * Note that the `Subdomain` class is defined in this same file because of
26 * mutual dependencies.
27 */
28 class Domain extends AbstractResource
29 {
30 public $id;
31 public $accountId;
32 public $ttl;
33 public $updated;
34 public $emailAddress;
35 public $created;
36 public $name;
37 public $comment;
38
39 protected static $json_name = false;
40 protected static $json_collection_name = 'domains';
41 protected static $url_resource = 'domains';
42
43 protected $createKeys = array(
44 'name',
45 'emailAddress',
46 'ttl',
47 'comment'
48 );
49
50 protected $updateKeys = array(
51 'emailAddress',
52 'ttl',
53 'comment'
54 );
55
56 private $records = array();
57 private $subdomains = array();
58
59 /**
60 * returns a Record object
61 *
62 * Note that this method is available at the DNS level, but only for
63 * PTR records.
64 *
65 * @return Record
66 */
67 public function record($info = null)
68 {
69 $resource = new Record($this->getService());
70 $resource->setParent($this)->populate($info);
71
72 return $resource;
73 }
74
75 /**
76 * returns a Collection of Record objects
77 *
78 * @param array $filter query-string parameters
79 * @return \OpenCloud\Collection
80 */
81 public function recordList($filter = array())
82 {
83 $url = $this->getUrl(Record::resourceName(), $filter);
84
85 return $this->getParent()->collection(
86 'OpenCloud\DNS\Resource\Record', $url, $this
87 );
88 }
89
90 /**
91 * returns a Subdomain object (child of current domain)
92 *
93 */
94 public function subdomain($info = array())
95 {
96 $resource = new Subdomain($this->getService());
97 $resource->setParent($this)->populate($info);
98
99 return $resource;
100 }
101
102 /**
103 * returns a Collection of subdomains
104 *
105 * The subdomains are all `DNS:Domain` objects that are children of
106 * the current domain.
107 *
108 * @param array $filter key/value pairs for query string parameters
109 * return \OpenCloud\Collection
110 */
111 public function subdomainList($filter = array())
112 {
113 $url = $this->getUrl(Subdomain::resourceName(), $filter);
114
115 return $this->getParent()->collection(
116 'OpenCloud\DNS\Resource\Subdomain', $url, $this
117 );
118 }
119
120 /**
121 * Adds a new record to the list (for multiple record creation)
122 *
123 * @api
124 * @param Record $rec the record to add
125 * @return integer the number of records
126 */
127 public function addRecord(Record $record)
128 {
129 $this->records[] = $record;
130
131 return count($this->records);
132 }
133
134 /**
135 * adds a new subdomain (for multiple subdomain creation)
136 *
137 * @api
138 * @param Subdomain $subd the subdomain to add
139 * @return integer the number of subdomains
140 */
141 public function addSubdomain(Subdomain $subdomain)
142 {
143 $this->subdomains[] = $subdomain;
144
145 return count($this->subdomains);
146 }
147
148 /**
149 * returns changes since a specified date/time
150 *
151 * @param string $since the date or time
152 * @return DNS\Changes
153 */
154 public function changes($since = null)
155 {
156 $url = clone $this->getUrl();
157 $url->addPath('changes');
158
159 if ($since) {
160 $url->setQuery(array('since' => $since));
161 }
162
163 $response = $this->getService()
164 ->getClient()
165 ->get($url)
166 ->send();
167
168 return Formatter::decode($response);
169 }
170
171 /**
172 * exports the domain
173 *
174 * @return AsyncResponse
175 */
176 public function export()
177 {
178 return $this->getService()->asyncRequest($this->getUrl('export'));
179 }
180
181 /**
182 * clones the domain to the specified target domain
183 *
184 * @param string $newdomain the new domain to create from this domain
185 * @param boolean $sub to clone subdomains as well
186 * @param boolean $comments Replace occurrences of the reference domain
187 * name with the new domain name in comments
188 * @param boolean $email Replace occurrences of the reference domain
189 * name with the new domain name in email addresses on the cloned
190 * (new) domain.
191 * @param boolean $records Replace occurrences of the reference domain
192 * name with the new domain name in data fields (of records) on the
193 * cloned (new) domain. Does not affect NS records.
194 * @return AsyncResponse
195 */
196 public function cloneDomain(
197 $newDomainName,
198 $subdomains = true,
199 $comments = true,
200 $email = true,
201 $records = true
202 ) {
203 $url = $this->getUrl();
204 $url->addPath('clone');
205 $url->setQuery(array(
206 'cloneName' => $newDomainName,
207 'cloneSubdomains' => $subdomains,
208 'modifyComment' => $comments,
209 'modifyEmailAddress' => $email,
210 'modifyRecordData' => $records
211 ));
212
213 return $this->getService()->asyncRequest($url, 'POST');
214 }
215
216 /**
217 * handles creation of multiple records at Create()
218 *
219 * @return \stdClass
220 */
221 protected function createJson()
222 {
223 $object = parent::createJson();
224
225 // add records, if any
226 if (count($this->records)) {
227 $recordsObject = (object) array('records' => array());
228
229 foreach ($this->records as $record) {
230 $recordObject = new \stdClass;
231 foreach ($record->getCreateKeys() as $key) {
232 if (isset($record->$key)) {
233 $recordObject->$key = $record->$key;
234 }
235 }
236 $recordsObject->records[] = $recordObject;
237 }
238 $object->domains[0]->recordsList = $recordsObject;
239 }
240
241 // add subdomains, if any
242 if (count($this->subdomains)) {
243 $subdomainsObject = (object) array('domains' => array());
244
245 foreach ($this->subdomains as $subdomain) {
246 $subdomainObject = new \stdClass;
247 foreach ($subdomain->getCreateKeys() as $key) {
248 if (isset($subdomain->$key)) {
249 $subdomainObject->$key = $subdomain->$key;
250 }
251 }
252 $subdomainsObject->domains[] = $subdomainObject;
253 }
254 $object->domains[0]->subdomains = $subdomainsObject;
255 }
256
257 return $object;
258 }
259 }
260