lib/entity/delete.ex

defmodule Ecto.Entity.Delete do
  defmacro __using__(_) do
    quote do
      @doc """
      Get the table name for this schema

      ## Example
          iex> Person.table_name
          iex> "people"
      """
      def table_name, do: __MODULE__.__schema__(:source)

      @doc """
      Truncates a table and reset its index

      ## Example
        iex> Person.truncate
        iex> {:ok,
            %MyXQL.Result{
              columns: nil,
              connection_id: 707,
              last_insert_id: 0,
              num_rows: 0,
              rows: nil,
              num_warnings: 0
            }}
      """
      def truncate(options \\ []), do: raw("TRUNCATE #{table_name()};")
      def truncate_without_key_checks() do
        get_repo().transaction(fn  ->
          disable_foreign_key_checks()
          truncate()
        end)
      end

      @doc """
      Deletes the a database entry from a schema module

      ## Examples

          iex> Person.delete(31)
          {:ok,
            %Person{
              __meta__: #Ecto.Schema.Metadata<:deleted, "people">,
              id: 31,
              first_name: "Roman",
              last_name: "Haag",
              age: nil
            }}

      """
      def destroy(ids) when is_list(ids), do: in_ids(ids) |> get_repo().delete_all()
      def destroy(id) when not is_map(id) do
         find!(id)
         |> get_repo().delete()
         |> maybe_broadcast_event("deleted")
        end

      def destroy(entity) when is_map(entity), do: destroy(entity.id)

      @doc """
      Delete everything except what is provided in this list

      ## Examples
              iex> Person.destroy_except([6,4])
              {:ok,
              %Person{
                __meta__: #Ecto.Schema.Metadata<:deleted, "people">,
                id: 31,
                first_name: "Roman",
                last_name: "Haag",
                age: nil
              }}
      """
      def destroy_except(ids) when is_list(ids), do: not_in_ids(ids) |> get_repo().delete_all()
      def destroy_except(id), do: destroy_except([id])

      def delete(entity), do: destroy(entity)
      def delete_except(ids), do: destroy_except(ids)

      def delete(), do: get_repo().delete_all(__MODULE__)
    end
  end
end