49 lines
1.2 KiB
Elixir
49 lines
1.2 KiB
Elixir
defmodule Aprsme.DevicesSeeder do
|
|
@moduledoc false
|
|
|
|
alias Aprsme.Devices
|
|
alias Aprsme.Repo
|
|
|
|
def seed_from_json(path \\ "test/support/test_devices.json") do
|
|
{:ok, body} = File.read(path)
|
|
{:ok, json} = Jason.decode(body)
|
|
tocalls = Map.get(json, "tocalls", %{})
|
|
mice = Map.get(json, "mice", %{})
|
|
micelegacy = Map.get(json, "micelegacy", %{})
|
|
now = DateTime.utc_now()
|
|
|
|
Repo.delete_all(Devices)
|
|
|
|
Enum.each([tocalls, mice, micelegacy], fn group ->
|
|
seed_device_group(group, now)
|
|
end)
|
|
end
|
|
|
|
defp seed_device_group(group, now) do
|
|
Enum.each(group, fn {identifier, attrs} ->
|
|
insert_device(identifier, attrs, now)
|
|
end)
|
|
end
|
|
|
|
defp insert_device(identifier, attrs, now) do
|
|
attrs =
|
|
attrs
|
|
|> Map.put("identifier", identifier)
|
|
|> Map.update("features", nil, fn f ->
|
|
if is_list(f), do: f, else: [f]
|
|
end)
|
|
|> Map.put("updated_at", now)
|
|
|
|
%Devices{}
|
|
|> Devices.changeset(attrs)
|
|
|> Ecto.Changeset.apply_changes()
|
|
|> Map.from_struct()
|
|
|> then(fn map ->
|
|
Repo.insert!(
|
|
Devices.changeset(%Devices{}, map),
|
|
on_conflict: :replace_all,
|
|
conflict_target: :identifier
|
|
)
|
|
end)
|
|
end
|
|
end
|