defmodule BirdyChatWeb.Api.Messages.Controller do use BirdyChatWeb, :controller def create(conn, params) do case BirdyChat.Message.validate(params) do {:ok, changeset} -> case BirdyChat.Message.find_peer(changeset.changes) do {:ok, :local} -> case BirdyChat.MessageWriter.write(changeset.changes) do :ok -> conn |> put_status(:created) |> render(:create, message: changeset.changes) end {:ok, peer_name} -> BirdyChatWeb.ServerChannel.broadcast!(peer_name, changeset.changes) conn |> put_status(:created) |> render(:create, message: changeset.changes) {:error, :not_found} -> changeset = changeset |> Ecto.Changeset.add_error(:to, "Unknown 'to' server") conn |> put_status(:unprocessable_entity) |> render(:error, changeset: changeset) end {:error, changeset} -> conn |> put_status(:unprocessable_entity) |> render(:error, changeset: changeset) end end end