defmodule MyApp.Data.Reply do use Ecto.Schema import Ecto.Changeset alias MyApp.Repo alias MyApp.Data @derive {Poison.Encoder, except: [:__meta__]} schema "reply" do field :user_id, :integer # references :user field :thread_id, :integer # references :thread field :content, :string field :edited, :boolean, default: false field :quote, :boolean, default: false timestamps() end defp insert_changeset(reply, params \\ %{}) do reply |> cast(params, [:user_id, :thread_id, :content, :quote]) |> validate_required([:user_id, :thread_id, :content]) |> foreign_key_constraint(:user_id) |> foreign_key_constraint(:thread_id) end # allow user to update reply defp user_update_changeset(reply, params \\ %{}) do reply |> cast(params, [:content]) |> force_change(:edited, true) # set edited flag on update |> validate_required([:content]) end @spec insert_reply(map) :: {:ok, map} | {:error, map} def insert_reply(params) do insert_changeset(%Data.Reply{}, params) |> Repo.insert |> Data.Util.process_insert_or_update end @spec user_update_reply(map) :: {:ok, map} | {:error, map} def user_update_reply(params) do id = Map.get(params, "id") user_id = Map.get(params, "user_id") if is_nil(id) || is_nil(user_id) do {:error, "Invalid reply"} else Repo.get_by(Data.Reply, %{id: id, user_id: user_id}) |> process_user_update(params) end end defp process_user_update(reply, _params) when is_nil(reply), do: {:error, "Invalid reply"} defp process_user_update(reply, params) when not is_nil(reply) do user_update_changeset(reply, params) |> Repo.update |> Data.Util.process_insert_or_update end end