- 
                Notifications
    You must be signed in to change notification settings 
- Fork 536
Open
Description
Suppose we want to create a subscription that would simply publish names of all mutations that were called:
# test/absinthe/execution/subscription_test.exs
  defmodule Schema do
    use Absinthe.Schema
    object :user do
      field :id, :id
      field :name, :string
    end
    subscription do    
      field :all_mutations, :string do
        config fn _, _ -> {:ok, topic: "*"} end
        trigger [:update_user], topic: fn _ -> "*" end
        # None of the input arguments can carry `updateUser` string
        resolve fn _mutation_result, _args, _resolution -> {:ok, "updateUser"} end
      end
    end
    mutation do
      field :update_user, :user do
        arg :id, non_null(:id)
        resolve fn _, %{id: id}, _ ->
          {:ok, %{id: id, name: "foo"}}
        end
      end
    end
  end
  @query """
  subscription {
    allMutations 
  }
  """
  test "can pass context from mutation to subscription" do
    id = "1"
    
    assert {:ok, %{"subscribed" => topic}} = run_subscription(@query, Schema, context: %{pubsub: PubSub})
    
    mutation = """
    mutation ($userId: ID!) {
      updateUser(id: $userId) { id name }
    }
    """
    
    assert {:ok, %{data: _}} =
             run_subscription(mutation, Schema,
               variables: %{"userId" => id},
               context: %{pubsub: PubSub}
             )
    assert_receive({:broadcast, msg})
    assert %{
             event: "subscription:data",
             result: %{data: %{"allMutations" => "updateUser"}},
             topic: topic
           } == msg
  endIf I'm reading the code right, it's not possible with just trigger macro right now. The only piece of information that is passed to a subscription's resolver from a mutation is the mutation's result.
Would it make sense to provide an avenue for passing some arbitrary context between two resolutions? I'm happy to take a stab at implementing this, but not quite sure what would be the best place to put this extra context.
Metadata
Metadata
Assignees
Labels
No labels