mirror of
https://github.com/philomena-dev/philomena.git
synced 2024-11-30 23:08:00 +01:00
107 lines
3.6 KiB
Elixir
107 lines
3.6 KiB
Elixir
defmodule PhilomenaWeb.Image.CommentController do
|
|
use PhilomenaWeb, :controller
|
|
|
|
alias Philomena.{Images.Image, Comments.Comment, Textile.Renderer}
|
|
alias Philomena.UserStatistics
|
|
alias Philomena.Comments
|
|
alias Philomena.Images
|
|
alias Philomena.Repo
|
|
import Ecto.Query
|
|
|
|
plug PhilomenaWeb.CanaryMapPlug, create: :create_comment, edit: :create_comment, update: :create_comment
|
|
plug :load_and_authorize_resource, model: Image, id_name: "image_id", persisted: true
|
|
|
|
# Undo the previous private parameter screwery
|
|
plug PhilomenaWeb.CanaryMapPlug, create: :create, edit: :edit, update: :edit
|
|
plug :load_and_authorize_resource, model: Comment, only: [:show, :edit, :update], preload: [:image, user: [awards: :badge]]
|
|
|
|
plug PhilomenaWeb.FilterBannedUsersPlug when action in [:create, :edit, :update]
|
|
plug PhilomenaWeb.UserAttributionPlug when action in [:create]
|
|
|
|
def index(conn, %{"comment_id" => comment_id}) do
|
|
comment =
|
|
Comment
|
|
|> where(image_id: ^conn.assigns.image.id)
|
|
|> where(id: ^comment_id)
|
|
|> Repo.one!()
|
|
|
|
offset =
|
|
Comment
|
|
|> where(image_id: ^conn.assigns.image.id)
|
|
|> where([c], c.created_at > ^comment.created_at)
|
|
|> Repo.aggregate(:count, :id)
|
|
|
|
%{page_size: page_size} = conn.assigns.pagination
|
|
page = div(offset, page_size)
|
|
|
|
conn
|
|
|> redirect(to: Routes.image_comment_path(conn, :index, conn.assigns.image, page: page))
|
|
end
|
|
|
|
def index(conn, _params) do
|
|
comments =
|
|
Comment
|
|
|> where(image_id: ^conn.assigns.image.id)
|
|
|> order_by(desc: :created_at)
|
|
|> preload([:image, user: [awards: :badge]])
|
|
|> Repo.paginate(conn.assigns.comment_scrivener)
|
|
|
|
rendered =
|
|
comments.entries
|
|
|> Renderer.render_collection(conn)
|
|
|
|
comments =
|
|
%{comments | entries: Enum.zip(comments.entries, rendered)}
|
|
|
|
render(conn, "index.html", layout: false, image: conn.assigns.image, comments: comments)
|
|
end
|
|
|
|
def show(conn, _params) do
|
|
rendered = Renderer.render_one(conn.assigns.comment, conn)
|
|
render(conn, "show.html", layout: false, image: conn.assigns.image, comment: conn.assigns.comment, body: rendered)
|
|
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}} ->
|
|
Comments.notify_comment(comment)
|
|
Comments.reindex_comment(comment)
|
|
Images.reindex_image(conn.assigns.image)
|
|
UserStatistics.inc_stat(conn.assigns.current_user, :comments_posted)
|
|
|
|
conn
|
|
|> put_flash(:info, "Comment created successfully.")
|
|
|> redirect(to: Routes.image_path(conn, :show, image) <> "#comment_#{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()
|
|
|
|
render(conn, "edit.html", comment: conn.assigns.comment, changeset: changeset)
|
|
end
|
|
|
|
def update(conn, %{"comment" => comment_params}) do
|
|
case Comments.update_comment(conn.assigns.comment, conn.assigns.current_user, comment_params) do
|
|
{:ok, %{comment: comment}} ->
|
|
Comments.reindex_comment(comment)
|
|
|
|
conn
|
|
|> put_flash(:info, "Comment updated successfully.")
|
|
|> redirect(to: Routes.image_path(conn, :show, conn.assigns.image) <> "#comment_#{comment.id}")
|
|
|
|
{:error, :comment, changeset, _changes} ->
|
|
render(conn, "edit.html", comment: conn.assigns.comment, changeset: changeset)
|
|
end
|
|
end
|
|
end
|