2019-12-14 20:46:50 +01:00
|
|
|
defmodule PhilomenaWeb.LoadTopicPlug do
|
|
|
|
alias Philomena.Topics.Topic
|
|
|
|
alias Philomena.Repo
|
|
|
|
|
|
|
|
import Plug.Conn, only: [assign: 3]
|
|
|
|
import Canada.Can, only: [can?: 3]
|
|
|
|
import Ecto.Query
|
|
|
|
|
|
|
|
def init(opts),
|
|
|
|
do: opts
|
|
|
|
|
|
|
|
def call(%{assigns: %{forum: forum}} = conn, opts) do
|
|
|
|
param = Keyword.get(opts, :param, "topic_id")
|
|
|
|
show_hidden = Keyword.get(opts, :show_hidden, false)
|
|
|
|
|
|
|
|
Topic
|
|
|
|
|> where(forum_id: ^forum.id, slug: ^to_string(conn.params[param]))
|
2019-12-16 19:28:17 +01:00
|
|
|
|> preload([:user, :forum, :deleted_by, poll: :options])
|
2019-12-14 20:46:50 +01:00
|
|
|
|> Repo.one()
|
|
|
|
|> maybe_hide_topic(conn, show_hidden)
|
|
|
|
end
|
|
|
|
|
|
|
|
defp maybe_hide_topic(nil, conn, _show_hidden),
|
|
|
|
do: PhilomenaWeb.NotFoundPlug.call(conn)
|
|
|
|
|
|
|
|
defp maybe_hide_topic(%{hidden_from_users: false} = topic, conn, _show_hidden),
|
|
|
|
do: assign(conn, :topic, topic)
|
|
|
|
|
|
|
|
defp maybe_hide_topic(topic, %{assigns: %{current_user: user}} = conn, show_hidden) do
|
|
|
|
case show_hidden or can?(user, :show, topic) do
|
2020-01-11 05:20:19 +01:00
|
|
|
true -> assign(conn, :topic, topic)
|
2019-12-14 20:46:50 +01:00
|
|
|
false -> PhilomenaWeb.NotAuthorizedPlug.call(conn)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|