defmodule Ash.Resource.Preparation.Builtins do @moduledoc "Builtin query preparations" @doc """ Merges the given query context. If an MFA is provided, it will be called with the changeset. The MFA should return `{:ok, context_to_be_merged}` or `{:error, term}` ## Examples change set_context(%{something_used_internally: true}) change set_context({MyApp.Context, :set_context, []}) """ @spec set_context(context :: map | mfa) :: Ash.Resource.Preparation.ref() def set_context(context) do {Ash.Resource.Preparation.SetContext, context: context} end @doc """ Passes the given keyword list to `Ash.Query.build/2` with the query being prepared. This allows declaring simple query modifications in-line. To see the available options, see `Ash.Query.build/2` ## Examples prepare build(sort: [song_rank: :desc], limit: 10) prepare build(load: [:friends]) """ @spec build(Keyword.t()) :: Ash.Resource.Preparation.ref() def build(options) do {Ash.Resource.Preparation.Build, options: options} end @doc ~S""" Directly attach a `before_action` function to the query. See `Ash.Query.before_action/2` for more information. ## Example prepare before_action(fn query -> Logger.debug("About to execute query for #{query.action.name} on #{inspect(query.resource)}) query end) """ defmacro before_action(callback) do {value, function} = Spark.CodeHelpers.lift_functions(callback, :query_before_action, __CALLER__) quote generated: true do unquote(function) {Ash.Resource.Preparation.BeforeAction, callback: unquote(value)} end end @doc ~S""" Directly attach an `after_action` function to the query. See `Ash.Query.after_action/2` for more information. ## Example prepare after_action(fn query, records -> Logger.debug("Query for #{query.action.name} on resource #{inspect(query.resource)} returned #{length(records)} records") {:ok, records} end) """ defmacro after_action(callback) do {value, function} = Spark.CodeHelpers.lift_functions(callback, :query_after_action, __CALLER__) quote generated: true do unquote(function) {Ash.Resource.Preparation.AfterAction, callback: unquote(value)} end end end