* 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.
29 lines
848 B
Ruby
29 lines
848 B
Ruby
class RatingVote < ApplicationRecord
|
|
belongs_to :article
|
|
belongs_to :user, optional: true
|
|
|
|
validates :context, inclusion: { in: %w[explicit readinglist_reaction comment] }
|
|
validates :group, inclusion: { in: %w[experience_level] }
|
|
validates :rating, numericality: { greater_than: 0.0, less_than_or_equal_to: 10.0 }
|
|
validates :user_id, presence: true, on: :create
|
|
validates :user_id, uniqueness: { scope: %i[article_id context] }
|
|
|
|
validate :permissions
|
|
|
|
after_create_commit :assign_article_rating
|
|
|
|
counter_culture :article
|
|
counter_culture :user
|
|
|
|
private
|
|
|
|
def assign_article_rating
|
|
RatingVotes::AssignRatingWorker.perform_async(article_id)
|
|
end
|
|
|
|
def permissions
|
|
return if user == article&.user || user&.trusted? || context != "explicit"
|
|
|
|
errors.add(:user_id, "is not permitted to take this action.")
|
|
end
|
|
end
|