philomena/lib/philomena_web/comment_loader.ex

58 lines
1.5 KiB
Elixir
Raw Normal View History

defmodule PhilomenaWeb.CommentLoader do
alias Philomena.Comments.Comment
alias Philomena.Repo
import Ecto.Query
def load_comments(conn, image) do
pref = load_direction(conn.assigns.current_user)
Comment
|> where(image_id: ^image.id)
|> order_by([{^pref, :created_at}])
|> preload([:image, :deleted_by, user: [awards: :badge]])
|> Repo.paginate(conn.assigns.comment_scrivener)
end
def find_page(conn, image, comment_id) do
user = conn.assigns.current_user
comment =
Comment
|> where(image_id: ^image.id)
|> where(id: ^comment_id)
|> Repo.one!()
offset =
Comment
|> where(image_id: ^image.id)
|> filter_direction(comment.created_at, user)
|> Repo.aggregate(:count, :id)
page_size = conn.assigns.comment_scrivener[:page_size]
# Pagination starts at page 1
div(offset, page_size) + 1
end
def last_page(conn, image) do
offset =
Comment
|> where(image_id: ^image.id)
|> Repo.aggregate(:count, :id)
page_size = conn.assigns.comment_scrivener[:page_size]
# Pagination starts at page 1
div(offset, page_size) + 1
end
defp load_direction(%{comments_newest_first: false}), do: :asc
defp load_direction(_user), do: :desc
defp filter_direction(query, time, %{comments_newest_first: false}),
do: where(query, [c], c.created_at <= ^time)
defp filter_direction(query, time, _user),
do: where(query, [c], c.created_at >= ^time)
end