Packages
ash_graphql
1.8.2
1.10.0
1.9.4
1.9.3
1.9.2
1.9.1
1.9.0
1.8.5
1.8.4
1.8.3
1.8.2
1.8.1
1.8.0
1.7.17
1.7.16
1.7.15
1.7.14
1.7.13
1.7.12
1.7.11
1.7.10
1.7.9
1.7.8
1.7.7
1.7.6
1.7.5
1.7.4
1.7.3
1.7.2
1.7.1
1.7.0
1.6.0
1.5.1
1.5.0
1.4.7
1.4.6
1.4.5
1.4.4
1.4.3
1.4.2
1.4.1
1.4.0
1.3.4
1.3.3
1.3.2
1.3.1
1.3.0
1.2.1
1.2.0
1.1.1
1.1.0
1.0.1
1.0.0
1.0.0-rc.5
1.0.0-rc.4
retired
1.0.0-rc.3
1.0.0-rc.2
1.0.0-rc.1
1.0.0-rc.0
0.28.1
0.28.0
0.27.1
0.27.0
0.26.9
0.26.8
0.26.7
0.26.6
0.26.5
0.26.4
0.26.3
0.26.2
0.26.0
0.25.13
0.25.12
0.25.10
0.25.9
0.25.8
0.25.7
0.25.6
0.25.5
0.25.4
0.25.3
0.25.2
0.25.1
0.25.0
0.24.1
0.24.0
0.23.3
0.23.2
0.23.1
0.23.0
0.22.13
0.22.12
0.22.11
0.22.10
0.22.9
0.22.8
0.22.7
0.22.6
0.22.4
0.22.3
0.22.2
0.22.1
0.22.0
0.21.0
retired
0.20.5
0.20.4
0.20.3
0.20.2
0.20.1
0.20.0-rc.3
0.20.0-rc.2
0.20.0-rc.1
0.20.0-rc.0
0.19.0
0.18.0-rc0
0.17.5
0.17.5-rc0
0.17.4
0.17.2
0.17.1
0.17.0
0.16.28
0.16.27
0.16.26
0.16.25
0.16.24
0.16.23
0.16.22
0.16.21
0.16.20
0.16.18-rc5
0.16.18-rc4
0.16.18-rc3
0.16.18-rc2
0.16.18-rc1
0.16.18-rc0
0.16.17
0.16.16
0.16.15
0.16.14
0.16.13
0.16.12
0.16.11
0.16.10
0.16.9
0.16.8
0.16.7
0.16.6
0.16.5
0.16.4
0.16.3
0.16.2
0.16.1
0.16.0
0.15.10
0.15.9
0.15.8
0.15.7
0.15.6
0.15.5
0.15.4
0.15.3
0.15.2
0.15.1
0.15.0
0.14.1
0.14.0
0.13.1
0.13.0
0.12.5
0.12.4
0.12.3
0.12.1
0.12.0
0.10.0
0.9.5
0.9.4
0.9.3
0.9.2
0.9.1
0.9.0
0.8.0
0.7.5
0.7.4
0.7.3
0.7.2
0.7.1
0.7.0
0.6.3
0.6.2
0.6.1
0.6.0
0.5.0
0.4.0
0.3.2
0.3.1
0.3.0
0.2.1
0.2.0
0.1.3
0.1.2
The extension for building GraphQL APIs with Ash
Current section
Files
Jump to
Current section
Files
lib/subscription/config.ex
defmodule AshGraphql.Subscription.Config do
@moduledoc """
Creates a config function used for the absinthe subscription definition
See https://github.com/absinthe-graphql/absinthe/blob/3d0823bd71c2ebb94357a5588c723e053de8c66a/lib/absinthe/schema/notation.ex#L58
"""
alias AshGraphql.Resource.Subscription
# sobelow_skip ["DOS.StringToAtom"]
def create_config(%Subscription{} = subscription, _domain, resource) do
config_module = String.to_atom(Macro.camelize(Atom.to_string(subscription.name)) <> ".Config")
Module.create(
config_module,
quote generated: true,
bind_quoted: [subscription: Macro.escape(subscription), resource: resource] do
require Ash.Query
alias AshGraphql.Graphql.Resolver
@subscription subscription
@resource resource
def config(args, %{context: context}) do
read_action =
@subscription.read_action || Ash.Resource.Info.primary_action!(@resource, :read).name
actor =
case @subscription.actor do
{module, opts} ->
module.actor(context[:actor], opts)
_ ->
context[:actor]
end
# check with Ash.can? to make sure the user is able to read the resource
# otherwise we return an error here instead of just never sending something
# in the subscription
case Ash.can(
@resource
|> Ash.Query.new()
# not sure if we need this here
|> Ash.Query.do_filter(
Resolver.massage_filter(@resource, Map.get(args, :filter))
)
|> Ash.Query.set_tenant(context[:tenant])
|> Ash.Query.for_read(read_action),
actor,
tenant: context[:tenant],
run_queries?: false,
alter_source?: true
) do
{:ok, true} ->
{:ok, topic: "*", context_id: create_context_id(args, actor, context[:tenant])}
{:ok, true, _} ->
{:ok, topic: "*", context_id: create_context_id(args, actor, context[:tenant])}
_ ->
{:error, "unauthorized"}
end
end
def create_context_id(args, actor, tenant) do
Base.encode64(:crypto.hash(:sha256, :erlang.term_to_binary({args, actor, tenant})))
end
end,
Macro.Env.location(__ENV__)
)
&config_module.config/2
end
end