philomena/lib/philomena_web/controllers/conversation_controller.ex

83 lines
2.4 KiB
Elixir

defmodule PhilomenaWeb.ConversationController do
use PhilomenaWeb, :controller
alias PhilomenaWeb.NotificationCountPlug
alias Philomena.{Conversations, Conversations.Conversation, Conversations.Message}
alias PhilomenaWeb.MarkdownRenderer
plug PhilomenaWeb.FilterBannedUsersPlug when action in [:new, :create]
plug PhilomenaWeb.LimitPlug,
[time: 60, error: "You may only create a conversation once every minute."]
when action in [:create]
plug :load_and_authorize_resource,
model: Conversation,
id_field: "slug",
only: :show,
preload: [:to, :from]
def index(conn, params) do
user = conn.assigns.current_user
conversations =
case params do
%{"with" => partner_id} ->
Conversations.list_conversations_with(partner_id, user, conn.assigns.scrivener)
_ ->
Conversations.list_conversations(user, conn.assigns.scrivener)
end
render(conn, "index.html", title: "Conversations", conversations: conversations)
end
def show(conn, _params) do
conversation = conn.assigns.conversation
user = conn.assigns.current_user
messages =
Conversations.list_messages(
conversation,
user,
&MarkdownRenderer.render_collection(&1, conn),
conn.assigns.scrivener
)
changeset = Conversations.change_message(%Message{})
Conversations.mark_conversation_read(conversation, user)
# Update the conversation ticker in the header
conn = NotificationCountPlug.call(conn)
render(conn, "show.html",
title: "Showing Conversation",
conversation: conversation,
messages: messages,
changeset: changeset
)
end
def new(conn, params) do
conversation =
%Conversation{recipient: params["recipient"], messages: [%Message{}]}
changeset = Conversations.change_conversation(conversation)
render(conn, "new.html", title: "New Conversation", changeset: changeset)
end
def create(conn, %{"conversation" => conversation_params}) do
user = conn.assigns.current_user
case Conversations.create_conversation(user, conversation_params) do
{:ok, conversation} ->
conn
|> put_flash(:info, "Conversation successfully created.")
|> redirect(to: ~p"/conversations/#{conversation}")
{:error, changeset} ->
render(conn, "new.html", changeset: changeset)
end
end
end