diff --git a/src/Helper.php b/src/Helper.php index 7b39c53..46c5c6f 100644 --- a/src/Helper.php +++ b/src/Helper.php @@ -2,6 +2,7 @@ namespace Exonet\Powerdns; +use Exonet\Powerdns\Resources\Comment; use Exonet\Powerdns\Resources\Record; use Exonet\Powerdns\Resources\ResourceRecord; @@ -15,6 +16,7 @@ class Helper * @param string $type The type of the resource record. * @param array|string $content The content of the resource record. * @param int $ttl The TTL. + * @param array $comments The Comment. * * @throws Exceptions\InvalidRecordType If the given type is invalid. * @@ -25,14 +27,15 @@ public static function createResourceRecord( $name, string $type = '', $content = '', - int $ttl = 3600 + int $ttl = 3600, + array $comments = [] ): ResourceRecord { if (is_array($name)) { if (isset($name['records'])) { return (new ResourceRecord())->setApiResponse($name); } - ['name' => $name, 'type' => $type, 'ttl' => $ttl, 'content' => $content] = $name; + ['name' => $name, 'type' => $type, 'ttl' => $ttl, 'content' => $content, 'comments' => $comments] = $name; } $name = str_replace('@', $zoneName, $name); @@ -48,11 +51,23 @@ public static function createResourceRecord( ->setName($name) ->setType($type) ->setTtl($ttl); - + if (is_string($content)) { $content = [$content]; } + if (is_array($comments)) { + $commentList = []; + foreach ($comments as $comment) { + // we can use an empty fallback for account and nothing the current time for modified_at + $commentList[] = (new Comment()) + ->setContent($comment['content']) + ->setAccount($comment['account'] ?? '') + ->setModifiedAt($comment['modified_at'] ?? time()); + } + $resourceRecord->setComments($commentList); + } + $recordList = []; foreach ($content as $record) { $recordItem = new Record(); diff --git a/src/Zone.php b/src/Zone.php index 2485d1f..2aa59d6 100644 --- a/src/Zone.php +++ b/src/Zone.php @@ -21,25 +21,26 @@ class Zone extends AbstractZone * resource records will be created in a single call to the PowerDNS server. If $name is a string, a single resource * record is created. * - * @param mixed[]|string $name The resource record name. - * @param string $type The type of the resource record. - * @param mixed[]|string $content The content of the resource record. When passing a multidimensional array, - * multiple records are created for this resource record. - * @param int $ttl The TTL. + * @param mixed[]|string $name The resource record name. + * @param string $type The type of the resource record. + * @param mixed[]|string $content The content of the resource record. When passing a multidimensional array, + * multiple records are created for this resource record. + * @param mixed[]|array $comments The comment to assign to the record. + * @param int $ttl The TTL. * * @throws Exceptions\InvalidRecordType If the given type is invalid. * * @return bool True when created. */ - public function create($name, string $type = '', $content = '', int $ttl = 3600): bool + public function create($name, string $type = '', $content = '', int $ttl = 3600, array $comments = []): bool { if (is_array($name)) { $resourceRecords = []; foreach ($name as $item) { - $resourceRecords[] = $this->make($item['name'], $item['type'], $item['content'], $item['ttl'] ?? $ttl); + $resourceRecords[] = $this->make($item['name'], $item['type'], $item['content'], $item['ttl'] ?? $ttl, $item['comments'] ?? []); } } else { - $resourceRecords = [$this->make($name, $type, $content, $ttl)]; + $resourceRecords = [$this->make($name, $type, $content, $ttl, $comments)]; } return $this->patch($resourceRecords); @@ -138,18 +139,19 @@ public function find(string $resourceRecordName, ?string $recordType = null): Re /** * Make (but not insert/POST) a new resource record. * - * @param string $name The resource record name. - * @param string $type The type of the resource record. - * @param string $content The content of the resource record. - * @param int $ttl The TTL. + * @param string $name The resource record name. + * @param string $type The type of the resource record. + * @param string $content The content of the resource record. + * @param int $ttl The TTL. + * @param array $comments The Comments. * * @throws Exceptions\InvalidRecordType If the given type is invalid. * * @return ResourceRecord The constructed ResourceRecord. */ - public function make(string $name, string $type, $content, int $ttl): ResourceRecord + public function make(string $name, string $type, $content, int $ttl, array $comments): ResourceRecord { - return Helper::createResourceRecord($this->zone, compact('name', 'type', 'content', 'ttl')); + return Helper::createResourceRecord($this->zone, compact('name', 'type', 'content', 'ttl', 'comments')); } /** diff --git a/tests/HelperTest.php b/tests/HelperTest.php index d24d388..72ca362 100644 --- a/tests/HelperTest.php +++ b/tests/HelperTest.php @@ -13,13 +13,14 @@ class HelperTest extends TestCase { public function testWithArguments(): void { - $result = Helper::createResourceRecord('unit.test.', 'www', RecordType::A, '127.0.0.1', 1337); + $result = Helper::createResourceRecord('unit.test.', 'www', RecordType::A, '127.0.0.1', 1337, [['content' => 'Hello World', 'account' => 'Tester']]); self::assertSame('www.unit.test.', $result->getName()); self::assertSame('A', $result->getType()); self::assertSame(1337, $result->getTtl()); self::assertCount(1, $result->getRecords()); self::assertSame('127.0.0.1', $result->getRecords()[0]->getContent()); + self::assertSame('Hello World', $result->getComments()[0]->getContent()); } public function testWithArray(): void @@ -31,6 +32,18 @@ public function testWithArray(): void 'type' => RecordType::A, 'content' => ['127.0.0.1', '127.0.0.2'], 'ttl' => 1337, + 'comments' => [ + [ + 'content' => "Hello", + 'account' => 'rooti', + 'modified_at' => 999 + ], + [ + 'content' => "World", + 'account' => 'rooti', + 'modified_at' => 111 + ] + ] ] ); @@ -40,6 +53,7 @@ public function testWithArray(): void self::assertCount(2, $result->getRecords()); self::assertSame('127.0.0.1', $result->getRecords()[0]->getContent()); self::assertSame('127.0.0.2', $result->getRecords()[1]->getContent()); + self::assertSame(111, $result->getComments()[1]->getModifiedAt()); } public function testWithApiResponse(): void diff --git a/tests/functional/ZoneRecordsTest.php b/tests/functional/ZoneRecordsTest.php index 1ca0f8a..6e461a7 100644 --- a/tests/functional/ZoneRecordsTest.php +++ b/tests/functional/ZoneRecordsTest.php @@ -18,20 +18,21 @@ class ZoneRecordsTest extends FunctionalTestCase private $canonicalName; private $dnsRecords = [ - ['name' => 'www', 'type' => RecordType::AAAA, 'content' => '2a00:1e28:3:1629::1', 'ttl' => 60], - ['name' => 'www', 'type' => RecordType::A, 'content' => '127.0.0.1', 'ttl' => 60], - ['name' => 'bla', 'type' => RecordType::AAAA, 'content' => '2a00:1e28:3:1629::1', 'ttl' => 60], - ['name' => '@', 'type' => RecordType::unknownTypePrefix. 65534, 'content' => '\# 4 aabbccdd', 'ttl' => 60], - ['name' => '@', 'type' => RecordType::AAAA, 'content' => '2a00:1e28:3:1629::1', 'ttl' => 60], + ['name' => 'www', 'type' => RecordType::AAAA, 'content' => '2a00:1e28:3:1629::1', 'ttl' => 60, 'comments' => []], + ['name' => 'www', 'type' => RecordType::A, 'content' => '127.0.0.1', 'ttl' => 60, 'comments' => []], + ['name' => 'bla', 'type' => RecordType::AAAA, 'content' => '2a00:1e28:3:1629::1', 'ttl' => 60, 'comments' => []], + ['name' => '@', 'type' => RecordType::unknownTypePrefix. 65534, 'content' => '\# 4 aabbccdd', 'ttl' => 60, 'comments' => []], + ['name' => '@', 'type' => RecordType::AAAA, 'content' => '2a00:1e28:3:1629::1', 'ttl' => 60, 'comments' => []], [ 'name' => '@', 'type' => RecordType::SOA, 'content' => 'ns1.test. hostmaster.test. 0 10800 3605 604800 3600', - 'ttl' => 60, + 'ttl' => 60, + 'comments' => [], ], - ['name' => '@', 'type' => RecordType::NS, 'content' => 'ns1.powerdns-php.', 'ttl' => 60], - ['name' => '@', 'type' => RecordType::NS, 'content' => 'ns2.powerdns-php.', 'ttl' => 60], - ['name' => '@', 'type' => RecordType::A, 'content' => '127.0.0.1', 'ttl' => 60], + ['name' => '@', 'type' => RecordType::NS, 'content' => 'ns1.powerdns-php.', 'ttl' => 60, 'comments' => []], + ['name' => '@', 'type' => RecordType::NS, 'content' => 'ns2.powerdns-php.', 'ttl' => 60, 'comments' => []], + ['name' => '@', 'type' => RecordType::A, 'content' => '127.0.0.1', 'ttl' => 60, 'comments' => []], ]; protected function setUp(): void @@ -89,6 +90,7 @@ function (ResourceRecord $item) use (&$createdRecords) { 'type' => $item->getType(), 'content' => $content, 'ttl' => $item->getTtl(), + 'comments' => [] ]; } }