defmodule Absinthe.Relay.Node.IDTranslator do
@moduledoc """
An ID translator handles encoding and decoding a global ID
used in a Relay node.
This module provides the behaviour for implementing an ID Translator.
An example use case of this module would be a translator that encrypts the
global ID.
To use an ID Translator in your schema there are two methods.
#### Inline Config
```
defmodule MyApp.Schema do
use Absinthe.Schema
use Absinthe.Relay.Schema, [
flavor: :modern,
global_id_translator: MyApp.Absinthe.IDTranslator
]
# ...
end
```
#### Mix Config
```
config Absinthe.Relay, MyApp.Schema,
global_id_translator: MyApp.Absinthe.IDTranslator
```
## Example ID Translator
A basic example that encodes the global ID by joining the `type_name` and
`source_id` with `":"`.
```
defmodule MyApp.Absinthe.IDTranslator do
@behaviour Absinthe.Relay.Node.IDTranslator
def to_global_id(type_name, source_id, _schema) do
{:ok, "\#{type_name}:\#{source_id}"}
end
def from_global_id(global_id, _schema) do
case String.split(global_id, ":", parts: 2) do
[type_name, source_id] ->
{:ok, type_name, source_id}
_ ->
{:error, "Could not extract value from ID `\#{inspect global_id}`"}
end
end
end
```
"""
@doc """
Converts a node's type name and ID to a globally unique ID.
Returns `{:ok, global_id}` on success.
Returns `{:error, binary}` on failure.
"""
@callback to_global_id(
type_name :: binary,
source_id :: binary | integer,
schema :: Absinthe.Schema.t()
) :: {:ok, global_id :: Absinthe.Relay.Node.global_id()} | {:error, binary}
@doc """
Converts a globally unique ID to a node's type name and ID.
Returns `{:ok, type_name, source_id}` on success.
Returns `{:error, binary}` on failure.
"""
@callback from_global_id(
global_id :: Absinthe.Relay.Node.global_id(),
schema :: Absinthe.Schema.t() | nil
) :: {:ok, type_name :: binary, source_id :: binary} | {:error, binary}
end