lib/absinthe/relay/node/id_translator/base64.ex

defmodule Absinthe.Relay.Node.IDTranslator.Base64 do
  @behaviour Absinthe.Relay.Node.IDTranslator

  @moduledoc """
  A basic implementation of `Absinthe.Relay.Node.IDTranslator` using Base64 encoding.
  """

  @impl true
  def to_global_id(type_name, source_id, _schema) do
    {:ok, Base.encode64("#{type_name}:#{source_id}")}
  end

  @impl true
  def from_global_id(global_id, _schema) do
    case Base.decode64(global_id) do
      {:ok, decoded} ->
        case String.split(decoded, ":", parts: 2) do
          [type_name, source_id] when byte_size(type_name) > 0 and byte_size(source_id) > 0 ->
            {:ok, type_name, source_id}

          _ ->
            {:error, "Could not extract value from decoded ID `#{inspect(decoded)}`"}
        end

      :error ->
        {:error, "Could not decode ID value `#{global_id}'"}
    end
  end
end