0

スキーマにカスタム GeoPoint タイプを設定したいのですが、スキーマ タイプ ファイルでこれを行う方法の例が見つかりません。私が見つけた唯一の方法は、スキーマ ファイルで input_object を使用することでした。Absinthe.Blueprint.Input.Object を使用してこのようにすることは可能ですか??

これは私のカスタムタイプです:

defmodule MyAppWeb.Schema.Types.GeoPoint do

  scalar :geo_point, name: "GeoPoint" do
    serialize(&encode/1)
    parse(&decode/1)
  end

  defp encode(value) do
    MyApp.JasonEncoders.encode_model(value)
  end

  defp decode(%Absinthe.Blueprint.Input.String{value: value}) do
    with {:ok, decoded} <- Jason.decode(value),
         {:ok, point} <- Geo.JSON.decode(decoded) do
      {:ok, point}
    else
      _ -> :error
    end
  end

  defp decode(%Input.Null{}) do
    {:ok, nil}
  end
end

これで、このミューテーションで新しいエントリを作成できます

mutation (
  $title: String!,
  $geom: GeoPoint!
) {
  offer: createOffer(
    title: $title,
    geom: $geom
  ) 

そしてこれらの変数

{
  "title": "Point",
  "geom": "{\"coordinates\":[1,2],\"type\":\"Point\"}"
}

次のようなものを使用して作成することをお勧めします

{
  "title": "Point",
  "geom": {
    "lat": 1,
    "long": 2
  }
}

また

{
  "title": "Point",
  "lat": 1,
  "long": 2
}
4

1 に答える 1