* User decorator (and spec) should use `trusted?`
Fixes a few issues seen in an rspec run that show as:
DEPRECATION WARNING: User#trusted is deprecated, favor
User#trusted? (called from config_body_class at
/opt/apps/forem/app/decorators/user_decorator.rb:58)
And here:
/opt/apps/forem/spec/decorators/user_decorator_spec.rb:112
/opt/apps/forem/spec/decorators/user_decorator_spec.rb:121
/opt/apps/forem/spec/decorators/user_decorator_spec.rb:130
/opt/apps/forem/spec/decorators/user_decorator_spec.rb:139
* prefer User trusted? to trusted
DEPRECATION WARNING: User#trusted is deprecated, favor
User#trusted? (called from permissions at
/opt/apps/forem/app/models/rating_vote.rb:25)
* Prefer trusted? to trusted in user spec
* Use warned? rather than warned in admin article partial
* use trusted? rather than trusted in moderator requests spec
* Prefer trusted? to trusted in moderations controller
* Prefer trusted? to trusted in moderations view
* User auditable? should call trusted? and not trusted
Deprecations go rolling right along.
* Invert guard clause logic to be positive
The original "return unless multiple negated conditions hold" guard
was cumbersome.
Invert to return if any of the exceptions apply, namely:
- this is a comment or readinglist rating (rather than explicit),
allowed for all
- this rating is from a moderator/trusted user (allowed)
- this rating is offered by the article's author (allowed)
I had intended to also remove the safe navigation operators (since it
wasn't clear why there would be a null user or null article, as
rating_vote joins users to articles with a score), but the builtin
validation tests (is expected to validate ...) build objects with
missing attributes, and raise errors when the spec is run.
67 lines
2.3 KiB
Ruby
67 lines
2.3 KiB
Ruby
class ModerationsController < ApplicationController
|
|
after_action :verify_authorized
|
|
|
|
JSON_OPTIONS = {
|
|
only: %i[id title published_at cached_tag_list path],
|
|
include: {
|
|
user: { only: %i[username name path articles_count id] }
|
|
}
|
|
}.freeze
|
|
|
|
def index
|
|
skip_authorization
|
|
return unless current_user&.trusted?
|
|
|
|
articles = Article.published
|
|
.order(published_at: :desc).limit(70)
|
|
articles = articles.cached_tagged_with(params[:tag]) if params[:tag].present?
|
|
if params[:state] == "new-authors"
|
|
articles = articles.where("nth_published_by_author > 0 AND nth_published_by_author < 4 AND published_at > ?",
|
|
7.days.ago)
|
|
end
|
|
@articles = articles.includes(:user).to_json(JSON_OPTIONS)
|
|
@tag = Tag.find_by(name: params[:tag]) || not_found if params[:tag].present?
|
|
@current_user_tags = current_user.moderator_for_tags
|
|
end
|
|
|
|
def article
|
|
load_article
|
|
render template: "moderations/mod"
|
|
end
|
|
|
|
def comment
|
|
authorize(User, :moderation_routes?)
|
|
@moderatable = Comment.find(params[:id_code].to_i(26))
|
|
render template: "moderations/mod"
|
|
end
|
|
|
|
def actions_panel
|
|
load_article
|
|
tag_mod_tag_ids = @tag_moderator_tags.ids
|
|
has_room_for_tags = @moderatable.tag_list.size < 4
|
|
has_no_relevant_adjustments = @adjustments.pluck(:tag_id).intersection(tag_mod_tag_ids).size.zero?
|
|
can_be_adjusted = @moderatable.tags.ids.intersection(tag_mod_tag_ids).size.positive?
|
|
|
|
@should_show_adjust_tags = tag_mod_tag_ids.size.positive? &&
|
|
((has_room_for_tags && has_no_relevant_adjustments) ||
|
|
(!has_room_for_tags && has_no_relevant_adjustments && can_be_adjusted))
|
|
|
|
render template: "moderations/actions_panel"
|
|
end
|
|
|
|
private
|
|
|
|
def load_article
|
|
authorize(User, :moderation_routes?)
|
|
|
|
@tag_adjustment = TagAdjustment.new
|
|
@moderatable = Article.find_by(slug: params[:slug])
|
|
not_found unless @moderatable
|
|
@tag_moderator_tags = Tag.with_role(:tag_moderator, current_user)
|
|
@adjustments = TagAdjustment.where(article_id: @moderatable.id)
|
|
@already_adjusted_tags = @adjustments.map(&:tag_name).join(", ")
|
|
@allowed_to_adjust = @moderatable.instance_of?(Article) && (
|
|
current_user.has_role?(:super_admin) || @tag_moderator_tags.any?)
|
|
@hidden_comments = @moderatable.comments.where(hidden_by_commentable_user: true)
|
|
end
|
|
end
|