Skip to content
This repository was archived by the owner on Nov 4, 2025. It is now read-only.

Commit c9e9768

Browse files
author
Niek Brekelmans
committed
v0 of API implemented
1 parent 59060e5 commit c9e9768

20 files changed

+647
-6
lines changed

composer.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
],
1818
"require": {
1919
"php": "^8.0",
20+
"bensampo/laravel-enum": "^5.3",
2021
"illuminate/contracts": "^8.0|^9.0",
2122
"sammyjo20/saloon-laravel": "^1.4",
2223
"spatie/laravel-package-tools": "^1.9.2"

src/Enums/RecordType.php

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
<?php
2+
3+
namespace DutchCodingCompany\HetznerDnsClient\Enums;
4+
5+
use BenSampo\Enum\Enum;
6+
7+
/**
8+
* @method static static A()
9+
* @method static static AAAA()
10+
* @method static static NS()
11+
* @method static static MX()
12+
* @method static static CNAME()
13+
* @method static static RP()
14+
* @method static static TXT()
15+
* @method static static SOA()
16+
* @method static static HINFO()
17+
* @method static static SRV()
18+
* @method static static DANE()
19+
* @method static static TLSA()
20+
* @method static static DS()
21+
* @method static static CAA()
22+
*/
23+
final class RecordType extends Enum
24+
{
25+
public const A = 'A';
26+
public const AAAA = 'AAAA';
27+
public const NS = 'NS';
28+
public const MX = 'MX';
29+
public const CNAME = 'CNAME';
30+
public const RP = 'RP';
31+
public const TXT = 'TXT';
32+
public const SOA = 'SOA';
33+
public const HINFO = 'HINFO';
34+
public const SRV = 'SRV';
35+
public const DANE = 'DANE';
36+
public const TLSA = 'TLSA';
37+
public const DS = 'DS';
38+
public const CAA = 'CAA';
39+
}

src/HetznerDnsClient.php

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,38 @@
22

33
namespace DutchCodingCompany\HetznerDnsClient;
44

5-
class HetznerDnsClient
5+
use Sammyjo20\Saloon\Http\SaloonConnector;
6+
use Sammyjo20\Saloon\Traits\Plugins\AcceptsJson;
7+
8+
class HetznerDnsClient extends SaloonConnector
69
{
10+
use AcceptsJson;
11+
use Traits\ResolvesApiToken;
12+
13+
protected array $requests = [
14+
'zones' => RequestCollections\ZoneCollection::class,
15+
'records' => RequestCollections\RecordCollection::class,
16+
];
17+
18+
/**
19+
* The Base URL of the API.
20+
*
21+
* @return string
22+
*/
23+
public function defineBaseUrl(): string
24+
{
25+
return 'https://dns.hetzner.com/api/v1';
26+
}
27+
28+
/**
29+
* The headers that will be applied to every request.
30+
*
31+
* @return string[]
32+
*/
33+
public function defaultHeaders(): array
34+
{
35+
return [
36+
'Auth-API-Token' => self::getApiToken(),
37+
];
38+
}
739
}

src/HetznerDnsClientServiceProvider.php

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
use Spatie\LaravelPackageTools\Package;
66
use Spatie\LaravelPackageTools\PackageServiceProvider;
7-
use DutchCodingCompany\HetznerDnsClient\Commands\HetznerDnsClientCommand;
7+
use Illuminate\Contracts\Container\Container;
88

99
class HetznerDnsClientServiceProvider extends PackageServiceProvider
1010
{
@@ -17,9 +17,6 @@ public function configurePackage(Package $package): void
1717
*/
1818
$package
1919
->name('laravel-hetzner-dns-api')
20-
->hasConfigFile()
21-
->hasViews()
22-
->hasMigration('create_laravel-hetzner-dns-api_table')
23-
->hasCommand(HetznerDnsClientCommand::class);
20+
->hasConfigFile('hetzner-dns');
2421
}
2522
}
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
<?php
2+
3+
namespace DutchCodingCompany\HetznerDnsClient\RequestCollections;
4+
5+
use DutchCodingCompany\HetznerDnsClient\Requests\Records\BulkCreateRecords;
6+
use DutchCodingCompany\HetznerDnsClient\Requests\Records\BulkUpdateRecords;
7+
use DutchCodingCompany\HetznerDnsClient\Requests\Records\CreateRecord;
8+
use DutchCodingCompany\HetznerDnsClient\Requests\Records\DeleteRecord;
9+
use DutchCodingCompany\HetznerDnsClient\Requests\Records\GetRecord;
10+
use DutchCodingCompany\HetznerDnsClient\Requests\Records\ListRecords;
11+
use DutchCodingCompany\HetznerDnsClient\Requests\Records\UpdateRecord;
12+
use Sammyjo20\Saloon\Http\RequestCollection;
13+
14+
class RecordCollection extends RequestCollection
15+
{
16+
public function all(...$arguments): array
17+
{
18+
return $this->connector->request(new ListRecords(...$arguments))->send()->json();
19+
}
20+
21+
public function create(...$arguments): array
22+
{
23+
return $this->connector->request(new CreateRecord(...$arguments))->send()->json();
24+
}
25+
26+
public function get(...$arguments): array
27+
{
28+
return $this->connector->request(new GetRecord(...$arguments))->send()->json();
29+
}
30+
31+
public function update(...$arguments): array
32+
{
33+
return $this->connector->request(new UpdateRecord(...$arguments))->send()->json();
34+
}
35+
36+
public function delete(...$arguments): array
37+
{
38+
return $this->connector->request(new DeleteRecord(...$arguments))->send()->json();
39+
}
40+
41+
public function bulkCreate(...$arguments): array
42+
{
43+
return $this->connector->request(new BulkCreateRecords(...$arguments))->send()->json();
44+
}
45+
46+
public function bulkUpdate(...$arguments): array
47+
{
48+
return $this->connector->request(new BulkUpdateRecords(...$arguments))->send()->json();
49+
}
50+
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
<?php
2+
3+
namespace DutchCodingCompany\HetznerDnsClient\RequestCollections;
4+
5+
use DutchCodingCompany\HetznerDnsClient\Requests\Zones\CreateZone;
6+
use DutchCodingCompany\HetznerDnsClient\Requests\Zones\DeleteZone;
7+
use DutchCodingCompany\HetznerDnsClient\Requests\Zones\ExportZone;
8+
use DutchCodingCompany\HetznerDnsClient\Requests\Zones\GetZone;
9+
use DutchCodingCompany\HetznerDnsClient\Requests\Zones\ListZones;
10+
use DutchCodingCompany\HetznerDnsClient\Requests\Zones\UpdateZone;
11+
use Sammyjo20\Saloon\Http\RequestCollection;
12+
13+
class ZoneCollection extends RequestCollection
14+
{
15+
public function all(...$arguments): array
16+
{
17+
return $this->connector->request(new ListZones(...$arguments))->send()->json();
18+
}
19+
20+
public function create(...$arguments): array
21+
{
22+
return $this->connector->request(new CreateZone(...$arguments))->send()->json();
23+
}
24+
25+
public function get(...$arguments): array
26+
{
27+
return $this->connector->request(new GetZone(...$arguments))->send()->json();
28+
}
29+
30+
public function update(...$arguments): array
31+
{
32+
return $this->connector->request(new UpdateZone(...$arguments))->send()->json();
33+
}
34+
35+
public function delete(...$arguments): array
36+
{
37+
return $this->connector->request(new DeleteZone(...$arguments))->send()->json();
38+
}
39+
40+
public function export(...$arguments): array
41+
{
42+
return $this->connector->request(new ExportZone(...$arguments))->send()->json();
43+
}
44+
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
<?php
2+
3+
namespace DutchCodingCompany\HetznerDnsClient\Requests\Records;
4+
5+
use DutchCodingCompany\HetznerDnsClient\Enums\RecordType;
6+
use DutchCodingCompany\HetznerDnsClient\HetznerDnsClient;
7+
use Sammyjo20\Saloon\Constants\Saloon;
8+
use Sammyjo20\Saloon\Http\SaloonRequest;
9+
use Sammyjo20\Saloon\Traits\Plugins\HasJsonBody;
10+
11+
class BulkCreateRecords extends SaloonRequest
12+
{
13+
use HasJsonBody;
14+
15+
protected array $records;
16+
17+
public function __construct(array $records)
18+
{
19+
$this->records = collect($records)
20+
->map(function ($items) {
21+
return (new CreateRecord(...$items))->getData();
22+
})->filter()->toArray();
23+
}
24+
25+
protected ?string $connector = HetznerDnsClient::class;
26+
27+
protected ?string $method = Saloon::POST;
28+
29+
public function defineEndpoint(): string
30+
{
31+
return '/records/bulk';
32+
}
33+
34+
public function defaultData(): array
35+
{
36+
return array_filter([
37+
'records' => $this->records,
38+
]);
39+
}
40+
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
<?php
2+
3+
namespace DutchCodingCompany\HetznerDnsClient\Requests\Records;
4+
5+
use DutchCodingCompany\HetznerDnsClient\HetznerDnsClient;
6+
use Illuminate\Support\Arr;
7+
use Sammyjo20\Saloon\Constants\Saloon;
8+
use Sammyjo20\Saloon\Http\SaloonRequest;
9+
use Sammyjo20\Saloon\Traits\Plugins\HasJsonBody;
10+
11+
class BulkUpdateRecords extends SaloonRequest
12+
{
13+
use HasJsonBody;
14+
15+
protected array $records;
16+
17+
public function __construct(array $records)
18+
{
19+
$this->records = collect($records)
20+
->map(function ($items) {
21+
return array_merge(
22+
(new UpdateRecord(...$items))->getData(),
23+
['id' => array_key_exists('record_id', $items) ? $items['record_id'] : Arr::first($items)]
24+
);
25+
})->filter()->toArray();
26+
}
27+
28+
protected ?string $connector = HetznerDnsClient::class;
29+
30+
protected ?string $method = Saloon::PUT;
31+
32+
public function defineEndpoint(): string
33+
{
34+
return '/records/bulk';
35+
}
36+
37+
public function defaultData(): array
38+
{
39+
return array_filter([
40+
'records' => $this->records,
41+
]);
42+
}
43+
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
<?php
2+
3+
namespace DutchCodingCompany\HetznerDnsClient\Requests\Records;
4+
5+
use DutchCodingCompany\HetznerDnsClient\Enums\RecordType;
6+
use DutchCodingCompany\HetznerDnsClient\HetznerDnsClient;
7+
use Sammyjo20\Saloon\Constants\Saloon;
8+
use Sammyjo20\Saloon\Http\SaloonRequest;
9+
use Sammyjo20\Saloon\Traits\Plugins\HasJsonBody;
10+
11+
class CreateRecord extends SaloonRequest
12+
{
13+
use HasJsonBody;
14+
15+
public function __construct(
16+
protected string $zone_id,
17+
18+
protected RecordType $type,
19+
protected string $name,
20+
protected string $value,
21+
protected ?int $ttl = null,
22+
)
23+
{}
24+
25+
protected ?string $connector = HetznerDnsClient::class;
26+
27+
protected ?string $method = Saloon::POST;
28+
29+
public function defineEndpoint(): string
30+
{
31+
return '/records';
32+
}
33+
34+
public function defaultData(): array
35+
{
36+
return array_filter([
37+
'zone_id' => $this->zone_id,
38+
'type' => $this->type->value,
39+
'name' => $this->name,
40+
'value' => $this->value,
41+
'ttl' => $this->ttl,
42+
]);
43+
}
44+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
<?php
2+
3+
namespace DutchCodingCompany\HetznerDnsClient\Requests\Records;
4+
5+
use DutchCodingCompany\HetznerDnsClient\HetznerDnsClient;
6+
use Sammyjo20\Saloon\Constants\Saloon;
7+
use Sammyjo20\Saloon\Http\SaloonRequest;
8+
use Sammyjo20\Saloon\Traits\Plugins\HasJsonBody;
9+
10+
class DeleteRecord extends SaloonRequest
11+
{
12+
public function __construct(
13+
protected string $record_id,
14+
)
15+
{}
16+
17+
protected ?string $connector = HetznerDnsClient::class;
18+
19+
protected ?string $method = Saloon::DELETE;
20+
21+
public function defineEndpoint(): string
22+
{
23+
return '/records/'.$this->record_id;
24+
}
25+
}

0 commit comments

Comments
 (0)