Packages
ash_graphql
1.10.0
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
# SPDX-FileCopyrightText: 2020 ash_graphql contributors <https://github.com/ash-project/ash_graphql/graphs/contributors>
#
# SPDX-License-Identifier: MIT
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
def create_config(%Subscription{} = subscription, _domain, resource, relay_ids?) do
config_module =
Module.concat([
resource,
Macro.camelize(Atom.to_string(subscription.name)),
Config
])
if !(Code.ensure_loaded?(config_module) and function_exported?(config_module, :config, 2)) do
create_config_module(config_module, subscription, resource, relay_ids?)
end
&config_module.config/2
end
defp create_config_module(config_module, subscription, resource, relay_ids?) do
Module.create(
config_module,
quote generated: true,
bind_quoted: [
subscription: Macro.escape(subscription),
resource: resource,
relay_ids?: relay_ids?
] do
require Ash.Query
alias AshGraphql.Graphql.FilterHandlers
alias AshGraphql.Graphql.Resolver
@subscription subscription
@resource resource
@relay_ids relay_ids?
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
filter_context = %{
relay_ids?: @relay_ids,
actor: actor,
tenant: context[:tenant]
}
# 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
|> FilterHandlers.apply_filter_to_resource(
Map.get(args, :filter),
filter_context
)
|> 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__)
)
end
end