lib/module_handler/aptos/move_did.ex

defmodule Web3AptosEx.ModuleHandler.Aptos.MoveDID do
  @moduledoc """
    0x61b96051f553d767d7e6dfcc04b04c28d793c8af3d07d3a43b4e2f8f4ca04c9f::move_did
  """
  import Web3AptosEx.Aptos
  alias Web3AptosEx.Aptos

  @basic_path "0x61b96051f553d767d7e6dfcc04b04c28d793c8af3d07d3a43b4e2f8f4ca04c9f"
  @resource %{
    addr_aggregator: "#{@basic_path}::addr_aggregator::AddrAggregator", 
    addr_info: "#{@basic_path}::addr_info::AddrInfo",
    service_aggregator: "#{@basic_path}::service_aggregator::ServiceAggregator", 
    service:  "#{@basic_path}::service_aggregator::Service",
  }

  # +--------+
  # | Events |
  # +--------+

  def get_all(client, addr) do
    addrs = get_addr_aggregator(client, addr)
    services = get_service_aggregator(client, addr)
    %{addr_aggregator: addrs, service_aggregator: services}
  end

  def get_addr_aggregator(client, addr) do
    {:ok, %{data: result}} = Aptos.get_resource(client, addr, @resource.addr_aggregator)
    addr_details = Enum.map(result.addrs, fn item ->
        {:ok, detail} = 
            Aptos.get_table_item(
            client, 
            result.addr_infos_map.handle, 
            "0x1::string::String",
            @resource.addr_info,
            item)
        detail
    end)
    Map.put(result, :addr_details, addr_details)
  end

  def get_service_aggregator(client, addr) do
    {:ok, %{data: result}} = Aptos.get_resource(client, addr, @resource.service_aggregator)
    service_details = Enum.map(result.names, fn item ->
        {:ok, detail} = 
            Aptos.get_table_item(
            client, 
            result.services_map.handle, 
            "0x1::string::String",
            @resource.service,
            item)
        detail
    end)
    Map.put(result, :service_details, service_details)
  end
  # +-------+
  # | Funcs |
  # +-------+
  @doc """
    const ADDR_AGGREGATOR_TYPE_HUMAN: u64 = 0;
    const ADDR_AGGREGATOR_TYPE_ORG: u64 = 1;
    const ADDR_AGGREGATOR_TYPE_ROBOT: u64 = 2;
  """
  def init(client, acct, type, description, options \\ []) do
    {:ok, f} = ~a"#{@basic_path}::init::init(u64, string)"
    payload = Aptos.call_function(f, [], [type, description])
    Aptos.submit_txn_with_auto_acct_updating(client, acct, payload, options)
  end

  @doc """
    public entry fun add_service(
            acct: &signer,
            name: String,
            description: String,
            url: String,
            verification_url: String,
            spec_fields: String,
            expired_at: u64
        )
  """
  def add_service(
    client, 
    acct, 
    name, 
    description, 
    url,
    verification_url, 
    spec_fields, 
    expired_at,
    options \\ []
    ) do

        {:ok, f} =
        ~a"#{@basic_path}::service_aggregator::add_service(string, string, string, string, string, u64)"
  
      payload =
        Aptos.call_function(f, [], [
            name, 
            description, 
            url,
            verification_url, 
            spec_fields, 
            expired_at
        ])
  
      Aptos.submit_txn_with_auto_acct_updating(client, acct, payload, options) 
    end
  @doc """
    public entry fun add_addr(
        acct: &signer,
        addr_type: u64,
        addr: String,
        pubkey: String,
        chains: vector<String>,
        description: String,
        spec_fields: String,
        expired_at: u64
    ) acquires AddrAggregator {
        let send_addr = signer::address_of(acct);
        let addr_aggr = borrow_global_mut<AddrAggregator>(send_addr);

        do_add_addr(addr_aggr, send_addr, addr_type, addr, pubkey, chains, description, spec_fields, expired_at);
    }

    const ADDR_TYPE_ETH: u64 = 0;
    const ADDR_TYPE_APTOS: u64 = 1;
  """
  def add_addr(
        client,
        acct,
        addr_type,
        addr,
        pubkey,
        chains,
        description,
        spec_fields,
        expired_at,
        options \\ []
      ) do
    {:ok, f} =
      ~a"#{@basic_path}::addr_aggregator::add_addr(u64, string, string, vector<string>, string, string, u64)"

    payload =
      Aptos.call_function(f, [], [
        addr_type,
        addr,
        pubkey,
        chains,
        description,
        spec_fields,
        expired_at
      ])

    Aptos.submit_txn_with_auto_acct_updating(client, acct, payload, options)
  end
end