ash_graphql/lib/resource/subscription/default_config.ex

40 lines
1.3 KiB
Elixir

defmodule AshGraphql.Resource.Subscription.DefaultConfig do
alias AshGraphql.Resource.Subscription
def create_config(%Subscription{} = subscription, _domain, resource) do
config_module = String.to_atom(Macro.camelize(Atom.to_string(subscription.name)) <> ".Config")
defmodule config_module do
require Ash.Query
@subscription subscription
@resource resource
def config(_args, %{context: context}) do
read_action =
@subscription.read_action || Ash.Resource.Info.primary_action!(@resource, :read).name
case Ash.can(
Ash.Query.for_read(@resource, read_action),
context[:actor],
run_queries?: false,
alter_source?: true
) do
{:ok, true} ->
{:ok, topic: "*", context_id: "global"}
{:ok, true, filter} ->
# context_id is exposed to the client so we might need to encrypt it
# or save it in ets or something and send generate a hash or something
# as the context_id
dbg(filter)
{:ok, topic: "*", context_id: dbg(Base.encode64(:erlang.term_to_binary(filter)))}
_ ->
{:error, "unauthorized"}
end
end
end
&config_module.config/2
end
end