diff --git a/src/Helper.php b/src/Helper.php index 7b39c53..e1c8ecf 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); @@ -53,6 +56,18 @@ public static function createResourceRecord( $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/Transformers/CommentTransformer.php b/src/Transformers/CommentTransformer.php new file mode 100644 index 0000000..46c7119 --- /dev/null +++ b/src/Transformers/CommentTransformer.php @@ -0,0 +1,18 @@ + $this->data->getContent(), + 'account' => $this->data->getAccount(), + 'modified_at' => $this->data->getModifiedAt(), + ]; + } +} diff --git a/src/Transformers/RRSetTransformer.php b/src/Transformers/RRSetTransformer.php index d3abe92..82ed7f1 100644 --- a/src/Transformers/RRSetTransformer.php +++ b/src/Transformers/RRSetTransformer.php @@ -41,6 +41,9 @@ private function transformResourceRecord(ResourceRecord $resourceRecord) 'ttl' => $resourceRecord->getTtl(), 'changetype' => $resourceRecord->getChangeType(), 'records' => $recordList, + 'comments' => array_map(function ($comment) { + return (new CommentTransformer($comment))->transform(); + }, $resourceRecord->getComments()), ]; } diff --git a/src/Zone.php b/src/Zone.php index 2485d1f..cb2c4ac 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 int $ttl The TTL. + * @param array|mixed[] $comments The comment to assign to the record. * * @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..fdcbe63 100644 --- a/tests/HelperTest.php +++ b/tests/HelperTest.php @@ -13,13 +13,15 @@ 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()); + self::assertSame('Tester', $result->getComments()[0]->getAccount()); } public function testWithArray(): void @@ -31,6 +33,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 +54,9 @@ 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()); + self::assertSame('World', $result->getComments()[1]->getContent()); + self::assertSame('rooti', $result->getComments()[1]->getAccount()); } public function testWithApiResponse(): void diff --git a/tests/Resources/CommentTest.php b/tests/Resources/CommentTest.php index d29eb31..4c817b9 100644 --- a/tests/Resources/CommentTest.php +++ b/tests/Resources/CommentTest.php @@ -3,6 +3,7 @@ namespace Exonet\Powerdns\tests\Resources; use Exonet\Powerdns\Resources\Comment; +use Exonet\Powerdns\Transformers\CommentTransformer; use PHPUnit\Framework\TestCase; /** @@ -23,4 +24,20 @@ public function testSettersAndGetters(): void $this->assertSame('test content', $comment->getContent()); $this->assertSame(1234, $comment->getModifiedAt()); } + + public function testTransformer(): void + { + $comment = (new Comment()) + ->setAccount('test account') + ->setContent('test content') + ->setModifiedAt(1234); + + $transformer = new CommentTransformer($comment); + + $this->assertEquals((object) [ + 'modified_at' => 1234, + 'account' => 'test account', + 'content' => 'test content', + ], $transformer->transform()); + } } diff --git a/tests/functional/ZoneRecordsTest.php b/tests/functional/ZoneRecordsTest.php index 1ca0f8a..8613a05 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, + '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' => [], ]; } }