diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/powerdnsex.ex (renamed from lib/powerdnsx.ex) | 0 | ||||
-rw-r--r-- | lib/powerdnsex/managers/records_manager.ex | 10 | ||||
-rw-r--r-- | lib/powerdnsex/managers/zones_manager.ex | 2 | ||||
-rw-r--r-- | lib/powerdnsex/models/record.ex | 24 | ||||
-rw-r--r-- | lib/powerdnsex/models/resource_record_set.ex | 32 |
5 files changed, 56 insertions, 12 deletions
diff --git a/lib/powerdnsx.ex b/lib/powerdnsex.ex index c82aa59..c82aa59 100644 --- a/lib/powerdnsx.ex +++ b/lib/powerdnsex.ex diff --git a/lib/powerdnsex/managers/records_manager.ex b/lib/powerdnsex/managers/records_manager.ex index 7d580b2..f9e71e1 100644 --- a/lib/powerdnsex/managers/records_manager.ex +++ b/lib/powerdnsex/managers/records_manager.ex @@ -9,14 +9,18 @@ defmodule PowerDNSex.RecordsManager do raise "[Records Manager] Zone URL attribute is empty!" end - def create(%Zone{} = zone, %{} = rrset) do - rrset = %{rrset | changetype: "REPLACE"} + def create(%Zone{} = zone, %{} = rrset_attrs) do + rrset_attrs = Map.merge(rrset_attrs, %{changetype: "REPLACE"}) zone.url - |> HttpClient.patch!(rrset.as_body(rrset)) + |> HttpClient.patch!(RRset.as_body(RRset.build(rrset_attrs))) |> process_request_response end + def update(%Zone{} = zone, %{} = rrset_attrs) do + create(zone, rrset_attrs) + end + ### # Private ## diff --git a/lib/powerdnsex/managers/zones_manager.ex b/lib/powerdnsex/managers/zones_manager.ex index 9561be6..ebad7fe 100644 --- a/lib/powerdnsex/managers/zones_manager.ex +++ b/lib/powerdnsex/managers/zones_manager.ex @@ -26,6 +26,7 @@ defmodule PowerDNSex.ZonesManager do server_name |> zone_path(zone_name) |> HttpClient.delete! + |> process_request_response end ### @@ -42,6 +43,7 @@ defmodule PowerDNSex.ZonesManager do defp process_request_response(%Response{body: body, status_code: status}) do case status do + s when s == 204 -> :ok s when s < 300 -> body |> Poison.decode!(as: %Zone{rrsets: [ %ResourceRecordSet{ diff --git a/lib/powerdnsex/models/record.ex b/lib/powerdnsex/models/record.ex index 82dca74..57378fc 100644 --- a/lib/powerdnsex/models/record.ex +++ b/lib/powerdnsex/models/record.ex @@ -1,9 +1,27 @@ defmodule PowerDNSex.Models.Record do defstruct [:content, :disabled] + def build(attrs) when is_list(attrs) do + Enum.reduce(attrs, [], &(&2 ++ [build(&1)])) + end + + def build(attrs) when is_tuple(attrs) do + %__MODULE__{content: elem(attrs, 0), disabled: elem(attrs, 1)} + end + + def build(attrs) when is_map(attrs) do + %__MODULE__{content: attrs.content, disabled: attrs.disabled} + end + def as_body(content) when is_list(content) do - Enum.reduce(content, [], fn({value, status}, records) -> - records ++ [%__MODULE__{ content: value, disabled: status }] - end) + Enum.reduce(content, [], &(&2 ++ [as_body(&1)])) + end + + def as_body(%__MODULE__{} = record_attrs) do + Map.from_struct(record_attrs) + end + + def as_body(record_attrs) when is_tuple(record_attrs) do + %{content: elem(record_attrs, 0), disabled: elem(record_attrs, 1)} end end diff --git a/lib/powerdnsex/models/resource_record_set.ex b/lib/powerdnsex/models/resource_record_set.ex index a3bca8d..f4338a2 100644 --- a/lib/powerdnsex/models/resource_record_set.ex +++ b/lib/powerdnsex/models/resource_record_set.ex @@ -4,17 +4,37 @@ defmodule PowerDNSex.Models.ResourceRecordSet do defstruct [:name, :type, :ttl, :records, :changetype] - def as_body(%__MODULE__{} = record) do + def build(rrset_attrs) when is_map(rrset_attrs) do + rrset = %__MODULE__{} + + rrset + |> Map.keys + |> Enum.reduce(rrset, &(set_attrs(&2, &1, rrset_attrs))) + end + + def as_body(%__MODULE__{} = rrset) do %{ rrsets: [ %{ - name: record.name, - type: record.type, - ttl: record.ttl, - changetype: record.changetype, - records: Record.as_body(record.content) + name: rrset.name, + type: rrset.type, + ttl: rrset.ttl, + changetype: rrset.changetype, + records: Record.as_body(rrset.records) } ]} |> Poison.encode! end + defp set_attrs(rrset, attr_name, attrs) do + if Map.has_key?(attrs, attr_name) do + attr_value = case attr_name do + :records -> Record.build(Map.fetch!(attrs, attr_name)) + _ -> Map.fetch!(attrs, attr_name) + end + + %{ rrset | attr_name => attr_value } + else + rrset + end + end end |