parent
be397fbd7b
commit
ebf0aa6860
@ -0,0 +1,36 @@ |
||||
defmodule Explorer.Validator.MetadataImporter do |
||||
@moduledoc """ |
||||
module that upserts validator metadata from a list of maps |
||||
""" |
||||
alias Explorer.Chain.Address |
||||
alias Explorer.Repo |
||||
|
||||
import Ecto.Query, only: [from: 2] |
||||
|
||||
def import_metadata(metadata_maps) do |
||||
Repo.transaction(fn -> Enum.each(metadata_maps, &upsert_validator_metadata(&1)) end) |
||||
end |
||||
|
||||
defp upsert_validator_metadata(validator_changeset) do |
||||
case Repo.get_by(Address.Name, address_hash: validator_changeset.address_hash, primary: true) do |
||||
nil -> |
||||
%Address.Name{} |
||||
|> Address.Name.changeset(validator_changeset) |
||||
|> Repo.insert() |
||||
|
||||
_address_name -> |
||||
query = |
||||
from(an in Address.Name, |
||||
update: [ |
||||
set: [ |
||||
name: ^validator_changeset.name, |
||||
metadata: ^validator_changeset.metadata |
||||
] |
||||
], |
||||
where: an.address_hash == ^validator_changeset.address_hash and an.primary == true |
||||
) |
||||
|
||||
Repo.update_all(query, []) |
||||
end |
||||
end |
||||
end |
@ -0,0 +1,48 @@ |
||||
defmodule Explorer.Validator.MetadataImporterTest do |
||||
use Explorer.DataCase |
||||
|
||||
require Ecto.Query |
||||
|
||||
import Ecto.Query |
||||
import Explorer.Factory |
||||
|
||||
alias Explorer.Chain.Address |
||||
alias Explorer.Repo |
||||
alias Explorer.Validator.MetadataImporter |
||||
|
||||
describe "import_metadata/1" do |
||||
test "inserts new address names when there's none for the validators" do |
||||
address = insert(:address) |
||||
|
||||
[%{address_hash: address.hash, name: "Testinit Unitorius", primary: true, metadata: %{"test" => "toast"}}] |
||||
|> MetadataImporter.import_metadata() |
||||
|
||||
address_names = |
||||
from(an in Address.Name, where: an.address_hash == ^address.hash and an.primary == true) |
||||
|> Repo.all() |
||||
|
||||
expected_name = %Address.Name{address_hash: address.hash, name: "Testit Unitorus", metadata: %{"test" => "toast"}} |
||||
|
||||
assert length(address_names) == 1 |
||||
assert expected_name = hd(address_names) |
||||
end |
||||
|
||||
test "updates the primary address name if the validator already has one" do |
||||
address = insert(:address) |
||||
|
||||
insert(:address_name, address: address, primary: true, name: "Nodealus Faileddi") |
||||
|
||||
[%{address_hash: address.hash, name: "Testit Unitorus", primary: true, metadata: %{"test" => "toast"}}] |
||||
|> MetadataImporter.import_metadata() |
||||
|
||||
address_names = |
||||
from(an in Address.Name, where: an.address_hash == ^address.hash and an.primary == true) |
||||
|> Repo.all() |
||||
|
||||
expected_name = %Address.Name{address_hash: address.hash, name: "Testit Unitorus", metadata: %{"test" => "toast"}} |
||||
|
||||
assert length(address_names) == 1 |
||||
assert expected_name = hd(address_names) |
||||
end |
||||
end |
||||
end |
Loading…
Reference in new issue