docbrown/app/helpers/comments_helper.rb
Anna Buianova 7d5650c3f1
Admin access to spam comments by url (#20775)
* Admin access to spam comments by url

* Fixed spec

* Fixed view spec
2024-03-22 08:40:36 -04:00

112 lines
3.6 KiB
Ruby

module CommentsHelper
MAX_COMMENTS_TO_RENDER = 250
MIN_COMMENTS_TO_RENDER = 8
def any_negative_comments?(commentable)
commentable.comments.where("score < 0").any?
end
def any_hidden_negative_comments?(commentable)
!user_signed_in? && any_negative_comments?(commentable)
end
def all_comments_visible?(commentable)
!(commentable.any_comments_hidden || any_hidden_negative_comments?(commentable))
end
def article_comment_tree(article, limit, order)
Comments::Tree.for_commentable(article, limit: limit, order: order, include_negative: user_signed_in?)
end
def podcast_comment_tree(episode)
Comments::Tree.for_commentable(episode, include_negative: user_signed_in?, limit: 12)
end
def comment_class(comment, is_view_root: false)
if comment.root? || is_view_root
"root"
else
"child"
end
end
def comment_user_id_unless_deleted(comment)
comment.deleted ? 0 : comment.user_id
end
def commentable_author_is_op?(commentable, comment)
commentable &&
[
commentable.user_id,
commentable.co_author_ids,
].flatten.any?(comment.user_id)
end
def get_ama_or_op_banner(commentable)
if commentable.decorate.cached_tag_list_array.include?(I18n.t("helpers.comments_helper.ama"))
I18n.t("helpers.comments_helper.ask_me_anything")
else
I18n.t("helpers.comments_helper.author")
end
end
def should_be_hidden?(comment, root_comment)
# when opened by a permalink + root comment is hidden => show root comment and its descendants
comment.hidden_by_commentable_user && comment != root_comment && !root_comment&.hidden_by_commentable_user
end
def high_number_of_comments?(comments_number)
comments_number > MAX_COMMENTS_TO_RENDER
end
def view_all_comments?(comments_number)
comments_number > MIN_COMMENTS_TO_RENDER
end
def number_of_comments_to_render
MAX_COMMENTS_TO_RENDER
end
def comment_count(view)
view == "comments" ? MAX_COMMENTS_TO_RENDER : MIN_COMMENTS_TO_RENDER
end
def like_button_text(comment)
# TODO: [yheuhtozr] support cross-element i18n compatible with initializeCommentsPage.js.erb
if comment.public_reactions_count.zero?
""
else
I18n.t("helpers.comments_helper.nbsp_likes_html", count: comment.public_reactions_count)
end
end
def contextual_comment_url(comment, article: nil)
# Liquid tag parsing doesn't have Devise/Warden (request middleware)
return URL.comment(comment) if request.env["warden"].nil?
# Logged in users should get the comment permalink
return URL.comment(comment) if user_signed_in?
# Logged out users should get the article URL with the comment anchor
URL.fragment_comment(comment, path: article&.path)
end
private
def nested_comments(tree:, commentable:, is_view_root: false, is_admin: false)
comments = tree.filter_map do |comment, sub_comments|
is_childless = sub_comments.empty?
# hide childless comments with score below hide threshold (but show for admins)
hide = comment.decorate.super_low_quality && is_childless
if is_admin || !hide
render("comments/comment", comment: comment, commentable: commentable,
is_view_root: is_view_root, is_childless: is_childless,
is_admin: is_admin,
subtree_html: nested_comments(tree: sub_comments,
commentable: commentable,
is_admin: is_admin))
end
end
safe_join(comments)
end
end