Absinthe middleware actor provider
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
This commit is contained in:
40
lib/graphql/middleware/current_actor_provider.ex
Normal file
40
lib/graphql/middleware/current_actor_provider.ex
Normal file
@@ -0,0 +1,40 @@
|
||||
defmodule Mobilizon.GraphQL.Middleware.CurrentActorProvider do
|
||||
@moduledoc """
|
||||
Absinthe Error Handler
|
||||
"""
|
||||
alias Mobilizon.Actors.Actor
|
||||
alias Mobilizon.Users
|
||||
alias Mobilizon.Users.User
|
||||
|
||||
@behaviour Absinthe.Middleware
|
||||
|
||||
@impl Absinthe.Middleware
|
||||
@spec call(Absinthe.Resolution.t(), any) :: Absinthe.Resolution.t()
|
||||
def call(
|
||||
%Absinthe.Resolution{context: %{current_user: %User{id: user_id} = user} = context} =
|
||||
resolution,
|
||||
_config
|
||||
) do
|
||||
case Cachex.fetch(:default_actors, to_string(user_id), fn -> default(user) end) do
|
||||
{status, %Actor{} = current_actor} when status in [:ok, :commit] ->
|
||||
context = Map.put(context, :current_actor, current_actor)
|
||||
%Absinthe.Resolution{resolution | context: context}
|
||||
|
||||
{_, nil} ->
|
||||
resolution
|
||||
end
|
||||
end
|
||||
|
||||
def call(%Absinthe.Resolution{} = resolution, _config), do: resolution
|
||||
|
||||
@spec default(User.t()) :: {:commit, Actor.t()} | {:ignore, nil}
|
||||
defp default(%User{} = user) do
|
||||
case Users.get_actor_for_user(user) do
|
||||
%Actor{} = actor ->
|
||||
{:commit, actor}
|
||||
|
||||
nil ->
|
||||
{:ignore, nil}
|
||||
end
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user