lib/ecto/soft_delete_schema.ex

defmodule Ecto.SoftDelete.Schema do
  @moduledoc """
  Contains schema macros to add soft delete fields to a schema
  """

  @doc """
  Adds the deleted_at column to a schema

      defmodule User do
        use Ecto.Schema
        import Ecto.SoftDelete.Schema

        schema "users" do
          field :email, :string
          soft_delete_schema()
        end
      end

  Options:
  - `:auto_exclude_from_queries?` - If false, Ecto.SoftDelete.Repo won't
  automatically add the necessary clause to filter out soft-deleted rows. See
  `Ecto.SoftDelete.Repo.prepare_query` for more info. Defaults to `true`.

  """
  defmacro soft_delete_schema(opts \\ []) do
    filter_tag_definition =
      unless Keyword.get(opts, :auto_exclude_from_queries?, true) do
        quote do
          def skip_soft_delete_prepare_query?, do: true
        end
      end

    quote do
      field(:deleted_at, :utc_datetime_usec)
      unquote(filter_tag_definition)
    end
  end
end