summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/powerdnsex/converter.ex19
-rw-r--r--lib/powerdnsex/gen_server/server.ex14
-rw-r--r--lib/powerdnsex/managers/records_manager.ex15
-rw-r--r--lib/powerdnsex/models/record.ex10
-rw-r--r--lib/powerdnsex/models/resource_record_set.ex14
5 files changed, 40 insertions, 32 deletions
diff --git a/lib/powerdnsex/converter.ex b/lib/powerdnsex/converter.ex
new file mode 100644
index 0000000..507c119
--- /dev/null
+++ b/lib/powerdnsex/converter.ex
@@ -0,0 +1,19 @@
+defmodule PowerDNSex.Converter do
+ def keys_to_atom(struct) when is_list(struct) do
+ for item <- struct, do: keys_to_atom(item)
+ end
+
+ def keys_to_atom(%{} = struct) do
+ for {key, value} <- struct, into: %{} do
+ n_key = if is_binary(key), do: String.to_atom(key), else: key
+
+ n_value = if is_map(value) or is_list(value) do
+ keys_to_atom(value)
+ else value end
+
+ {n_key, n_value}
+ end
+ end
+
+ def keys_to_atom(item), do: item
+end
diff --git a/lib/powerdnsex/gen_server/server.ex b/lib/powerdnsex/gen_server/server.ex
index bed016b..a91dc76 100644
--- a/lib/powerdnsex/gen_server/server.ex
+++ b/lib/powerdnsex/gen_server/server.ex
@@ -2,7 +2,7 @@ defmodule PowerDNSex.Server do
use GenServer
alias PowerDNSex.Managers.{ZonesManager, RecordsManager}
- alias PowerDNSex.Models.Zone
+ alias PowerDNSex.{Models.Zone, Converter}
def start_link(name) do
GenServer.start_link(__MODULE__, :ok, name: name)
@@ -25,18 +25,22 @@ defmodule PowerDNSex.Server do
end
def handle_call({:create_record, zone, rrset_attrs}, _from, state) do
- {:reply, RecordsManager.create(zone, rrset_attrs), state}
+ attrs = Converter.keys_to_atom(rrset_attrs)
+ {:reply, RecordsManager.create(zone, attrs), state}
end
def handle_call({:show_record, zone_name, rrset_attrs}, _from, state) do
- {:reply, RecordsManager.show(zone_name, rrset_attrs), state}
+ attrs = Converter.keys_to_atom(rrset_attrs)
+ {:reply, RecordsManager.show(zone_name, attrs), state}
end
def handle_call({:update_record, zone, rrset_attrs}, _from, state) do
- {:reply, RecordsManager.update(zone, rrset_attrs), state}
+ attrs = Converter.keys_to_atom(rrset_attrs)
+ {:reply, RecordsManager.update(zone, attrs), state}
end
def handle_call({:delete_record, zone, rrset_attrs}, _from, state) do
- {:reply, RecordsManager.delete(zone, rrset_attrs), state}
+ attrs = Converter.keys_to_atom(rrset_attrs)
+ {:reply, RecordsManager.delete(zone, attrs), state}
end
end
diff --git a/lib/powerdnsex/managers/records_manager.ex b/lib/powerdnsex/managers/records_manager.ex
index 1e85ebe..a0ec317 100644
--- a/lib/powerdnsex/managers/records_manager.ex
+++ b/lib/powerdnsex/managers/records_manager.ex
@@ -8,8 +8,7 @@ defmodule PowerDNSex.Managers.RecordsManager do
def create(%Zone{} = zone, %{} = rrset_attrs) do
- changetype = %{changetype_key(rrset_attrs) => "REPLACE"}
- rrset_attrs = Map.merge(rrset_attrs, changetype)
+ rrset_attrs = Map.merge(rrset_attrs, %{changetype: "REPLACE"})
patch(zone, rrset_attrs)
end
@@ -21,14 +20,12 @@ defmodule PowerDNSex.Managers.RecordsManager do
end
def update(%Zone{} = zone, %{} = rrset_attrs) do
- changetype = %{changetype_key(rrset_attrs) => "REPLACE"}
- rrset_attrs = Map.merge(rrset_attrs, changetype)
+ rrset_attrs = Map.merge(rrset_attrs, %{changetype: "REPLACE"})
patch(zone, rrset_attrs)
end
def delete(%Zone{} = zone, %{} = rrset_attrs) do
- changetype = %{changetype_key(rrset_attrs) => "DELETE"}
- rrset_attrs = Map.merge(rrset_attrs, changetype)
+ rrset_attrs = Map.merge(rrset_attrs, %{changetype: "DELETE"})
patch(zone, rrset_attrs)
end
@@ -36,16 +33,10 @@ defmodule PowerDNSex.Managers.RecordsManager do
# Private
##
- defp changetype_key(attrs) do
- key = "changetype"
- if Map.has_key?(attrs, key), do: key, else: String.to_atom(key)
- end
-
defp process_request_response(%Response{body: body, status_code: status}) do
case status do
s when s == 204 -> :ok
s when s < 300 ->
- IO.puts "Response status: #{s}"
:ok
s when s >= 300 ->
error = Poison.decode!(body, as: %Error{})
diff --git a/lib/powerdnsex/models/record.ex b/lib/powerdnsex/models/record.ex
index b334a9b..0c40e65 100644
--- a/lib/powerdnsex/models/record.ex
+++ b/lib/powerdnsex/models/record.ex
@@ -31,11 +31,13 @@ defmodule PowerDNSex.Models.Record do
# PRIVATE
###
- defp build_item(attrs) when is_tuple(attrs) do
- %__MODULE__{content: elem(attrs, 0), disabled: elem(attrs, 1)}
+ defp build_item(attrs) when is_map(attrs) do
+ disabled = attrs[:disabled] || false
+ record = %__MODULE__{content: attrs.content, disabled: disabled}
+ record
end
- defp build_item(attrs) when is_map(attrs) do
- %__MODULE__{content: attrs["content"], disabled: attrs["disabled"]}
+ defp build_item(attrs) when is_tuple(attrs) do
+ %__MODULE__{content: elem(attrs, 0), disabled: elem(attrs, 1)}
end
end
diff --git a/lib/powerdnsex/models/resource_record_set.ex b/lib/powerdnsex/models/resource_record_set.ex
index c22f255..928848c 100644
--- a/lib/powerdnsex/models/resource_record_set.ex
+++ b/lib/powerdnsex/models/resource_record_set.ex
@@ -4,15 +4,10 @@ defmodule PowerDNSex.Models.ResourceRecordSet do
defstruct [:name, :type, :ttl, :records, :changetype]
- def build(%{"records" => records} = rrset_attrs) when is_list(records) do
- build_rrset(rrset_attrs)
- end
-
def build(%{records: records} = rrset_attrs) when is_list(records) do
build_rrset(rrset_attrs)
end
-
def as_body(%__MODULE__{} = rrset) do
%{ rrsets: [
%{
@@ -29,8 +24,7 @@ defmodule PowerDNSex.Models.ResourceRecordSet do
def find(rrsets, %{} = attrs) when is_list(rrsets) do
Enum.find(rrsets, fn(rrset)->
Enum.all?(attrs, fn({attr, attr_value})->
- attr_atom = if is_binary(attr), do: String.to_atom(attr), else: attr
- if Enum.member?(Map.keys(%__MODULE__{}), attr_atom) do
+ if Enum.member?(Map.keys(%__MODULE__{}), attr) do
equal_attr?(attr, attr_value, rrset)
else
Record.find(rrset.records, %{attr => attr_value})
@@ -44,15 +38,13 @@ defmodule PowerDNSex.Models.ResourceRecordSet do
###
defp set_attrs(rrset, attr_name, attrs) do
- if is_atom(attr_name), do: attr_name = Atom.to_string(attr_name)
-
if Map.has_key?(attrs, attr_name) do
attr_value = case attr_name do
- "records" -> Record.build(Map.fetch!(attrs, attr_name))
+ :records -> Record.build(Map.fetch!(attrs, attr_name))
_ -> Map.fetch!(attrs, attr_name)
end
- %{ rrset | String.to_atom(attr_name) => attr_value }
+ %{ rrset | attr_name => attr_value }
else
rrset
end