philomena/lib/philomena_web/controllers/image/comment_controller.ex

155 lines
4.6 KiB
Elixir
Raw Normal View History

2019-11-12 03:38:51 +01:00
defmodule PhilomenaWeb.Image.CommentController do
use PhilomenaWeb, :controller
alias PhilomenaWeb.CommentLoader
alias PhilomenaWeb.MarkdownRenderer
2020-05-08 04:19:08 +02:00
alias Philomena.{Images.Image, Comments.Comment}
alias Philomena.UserStatistics
alias Philomena.Comments
alias Philomena.Images
2019-11-12 03:38:51 +01:00
2020-07-21 16:50:33 +02:00
plug PhilomenaWeb.LimitPlug,
2021-09-10 19:34:21 +02:00
[time: 15, error: "You may only create a comment once every 15 seconds."]
2020-07-21 16:50:33 +02:00
when action in [:create]
2019-12-14 20:46:50 +01:00
plug PhilomenaWeb.FilterBannedUsersPlug when action in [:create, :edit, :update]
plug PhilomenaWeb.UserAttributionPlug when action in [:create]
2020-01-11 05:20:19 +01:00
plug PhilomenaWeb.CanaryMapPlug,
create: :create_comment,
edit: :create_comment,
update: :create_comment
2020-06-12 19:00:59 +02:00
plug :load_and_authorize_resource,
model: Image,
id_name: "image_id",
persisted: true,
preload: [:sources, tags: :aliases]
2020-06-12 19:00:59 +02:00
plug :verify_authorized when action in [:show]
2020-06-07 03:03:17 +02:00
plug PhilomenaWeb.FilterForcedUsersPlug when action in [:create, :edit, :update]
# Undo the previous private parameter screwery
plug PhilomenaWeb.LoadCommentPlug, [param: "id", show_hidden: true] when action in [:show]
plug PhilomenaWeb.LoadCommentPlug, [param: "id"] when action in [:edit, :update]
2020-02-22 17:31:57 +01:00
plug PhilomenaWeb.CanaryMapPlug, create: :create, edit: :edit, update: :edit
2020-01-11 05:20:19 +01:00
plug :authorize_resource,
model: Comment,
only: [:edit, :update],
preload: [:image, user: [awards: :badge]]
def index(conn, %{"comment_id" => comment_id}) do
page = CommentLoader.find_page(conn, conn.assigns.image, comment_id)
redirect(conn, to: Routes.image_comment_path(conn, :index, conn.assigns.image, page: page))
end
2019-11-12 03:38:51 +01:00
def index(conn, _params) do
comments = CommentLoader.load_comments(conn, conn.assigns.image)
2019-11-12 03:38:51 +01:00
rendered = MarkdownRenderer.render_collection(comments.entries, conn)
2019-11-12 03:38:51 +01:00
2020-01-11 05:20:19 +01:00
comments = %{comments | entries: Enum.zip(comments.entries, rendered)}
2019-11-12 03:38:51 +01:00
render(conn, "index.html", layout: false, image: conn.assigns.image, comments: comments)
end
def show(conn, _params) do
rendered = MarkdownRenderer.render_one(conn.assigns.comment, conn)
2020-01-11 05:20:19 +01:00
render(conn, "show.html",
layout: false,
image: conn.assigns.image,
comment: conn.assigns.comment,
body: rendered
)
2019-11-12 03:38:51 +01:00
end
def create(conn, %{"comment" => comment_params}) do
attributes = conn.assigns.attributes
image = conn.assigns.image
case Comments.create_comment(image, attributes, comment_params) do
{:ok, %{comment: comment}} ->
2020-06-12 18:56:11 +02:00
PhilomenaWeb.Endpoint.broadcast!(
"firehose",
"comment:create",
PhilomenaWeb.Api.Json.CommentView.render("show.json", %{comment: comment})
)
Comments.reindex_comment(comment)
Images.reindex_image(conn.assigns.image)
2022-03-22 22:23:30 +01:00
if comment.approved do
2022-03-24 17:31:57 +01:00
Comments.notify_comment(comment)
2022-03-22 22:23:30 +01:00
UserStatistics.inc_stat(conn.assigns.current_user, :comments_posted)
else
Comments.report_non_approved(comment)
end
2020-01-01 18:27:20 +01:00
index(conn, %{"comment_id" => comment.id})
_error ->
conn
|> put_flash(:error, "There was an error posting your comment")
|> redirect(to: Routes.image_path(conn, :show, image))
end
end
def edit(conn, _params) do
changeset =
conn.assigns.comment
|> Comments.change_comment()
2020-01-11 05:20:19 +01:00
render(conn, "edit.html",
title: "Editing Comment",
comment: conn.assigns.comment,
changeset: changeset
)
end
def update(conn, %{"comment" => comment_params}) do
2019-12-06 15:43:01 +01:00
case Comments.update_comment(conn.assigns.comment, conn.assigns.current_user, comment_params) do
{:ok, %{comment: comment}} ->
2022-03-24 19:19:50 +01:00
if not comment.approved do
Comments.report_non_approved(comment)
end
2020-06-16 01:57:33 +02:00
PhilomenaWeb.Endpoint.broadcast!(
"firehose",
"comment:update",
PhilomenaWeb.Api.Json.CommentView.render("show.json", %{comment: comment})
)
2019-12-06 15:43:01 +01:00
Comments.reindex_comment(comment)
conn
|> put_flash(:info, "Comment updated successfully.")
2020-01-11 05:20:19 +01:00
|> redirect(
to: Routes.image_path(conn, :show, conn.assigns.image) <> "#comment_#{comment.id}"
)
2019-12-06 16:14:25 +01:00
{:error, :comment, changeset, _changes} ->
render(conn, "edit.html", comment: conn.assigns.comment, changeset: changeset)
end
end
defp verify_authorized(conn, _params) do
image = conn.assigns.image
2020-01-11 05:20:19 +01:00
image =
case is_nil(image.duplicate_id) do
2020-01-11 05:20:19 +01:00
true -> image
_false -> Images.get_image!(image.duplicate_id)
end
conn = assign(conn, :image, image)
case Canada.Can.can?(conn.assigns.current_user, :show, image) do
2020-01-11 05:20:19 +01:00
true -> conn
_false -> PhilomenaWeb.NotAuthorizedPlug.call(conn)
end
end
2019-11-12 03:38:51 +01:00
end