Packages
absinthe
1.10.1
1.11.0
1.10.2
1.10.1
1.10.0
1.9.1
1.9.0
1.8.0
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.8
1.6.7
retired
1.6.6
1.6.5
1.6.4
1.6.3
1.6.2
1.6.1
1.6.0
1.6.0-rc.1
1.6.0-rc.0
1.5.5
1.5.4
1.5.3
1.5.2
1.5.1
1.5.0
1.5.0-rc.5
1.5.0-rc.4
1.5.0-rc.3
1.5.0-rc.2
1.5.0-rc.1
1.5.0-rc.0
1.5.0-beta.2
1.5.0-beta.1
1.5.0-beta.0
1.5.0-alpha.4
1.5.0-alpha.3
1.5.0-alpha.2
1.5.0-alpha.1
1.5.0-alpha.0
1.4.16
1.4.15
1.4.14
1.4.13
1.4.12
1.4.11
1.4.10
1.4.9
1.4.8
retired
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.4.0-rc.3
1.4.0-rc.2
1.4.0-rc.1
1.4.0-rc.0
1.4.0-beta.5
1.4.0-beta.4
1.4.0-beta.3
1.4.0-beta.2
1.4.0-beta.1
1.3.2
1.3.1
1.3.0
1.3.0-rc.0
1.3.0-beta.2
1.3.0-beta.1
1.3.0-beta.0
1.2.6
1.2.5
1.2.4
1.2.3
1.2.2
1.2.1
1.2.0
1.2.0-rc.0
1.2.0-beta.0
1.2.0-alpha0
1.2.0-alpha.2
1.2.0-alpha.1
1.1.11
1.1.10
1.1.9
1.1.8
1.1.7
1.1.6
1.1.5
1.1.4
1.1.3
1.1.2
1.1.1
1.1.0
1.0.0
0.5.2
0.5.1
0.5.0
0.4.6
0.4.5
0.4.4
0.4.3
0.4.2
0.4.1
0.4.0
0.2.3
0.2.2
0.2.1
0.1.0
GraphQL for Elixir
Security advisory:
This version has known vulnerabilities.
View advisories
Current section
Files
Jump to
Current section
Files
lib/absinthe/middleware/dataloader.ex
if Code.ensure_loaded?(Dataloader) do
defmodule Absinthe.Middleware.Dataloader do
@behaviour Absinthe.Middleware
@behaviour Absinthe.Plugin
@impl Absinthe.Plugin
def before_resolution(%{context: context} = exec) do
context =
with %{loader: loader} <- context do
%{context | loader: Dataloader.run(loader)}
end
%{exec | context: context}
end
@impl Absinthe.Middleware
def call(%{state: :unresolved} = resolution, {loader, callback}) do
if !Dataloader.pending_batches?(loader) do
resolution.context.loader
|> put_in(loader)
|> get_result(callback)
else
%{
resolution
| context: Map.put(resolution.context, :loader, loader),
state: :suspended,
middleware: [{__MODULE__, callback} | resolution.middleware]
}
end
end
def call(%{state: :suspended} = resolution, callback) do
get_result(resolution, callback)
end
defp get_result(resolution, callback) do
value = callback.(resolution.context.loader)
Absinthe.Resolution.put_result(resolution, value)
end
@impl Absinthe.Plugin
def after_resolution(exec) do
exec
end
@impl Absinthe.Plugin
def pipeline(pipeline, exec) do
with %{loader: loader} <- exec.context,
true <- Dataloader.pending_batches?(loader) do
[Absinthe.Phase.Document.Execution.Resolution | pipeline]
else
_ -> pipeline
end
end
end
end