discourse/lib/trust_level.rb
Bianca Nenciu 0d8ecab362
FIX: Restore trust level when leaving group (#17954)
If a user was granted a trust level, joined a group that granted a trust
level and left the group, the trust level was reset. This commit tries
to restore the last known trust level before joining the group by
looking into staff logs.

This commit also migrates old :change_trust_level user history records
to use previous_value and new_value fields.
2022-08-29 13:00:48 +03:00

54 lines
1.2 KiB
Ruby

# frozen_string_literal: true
class InvalidTrustLevel < StandardError; end
class TrustLevel
def self.[](level)
raise InvalidTrustLevel if !valid?(level)
level
end
def self.levels
@levels ||= Enum.new(:newuser, :basic, :member, :regular, :leader, start: 0)
end
def self.valid?(level)
valid_range === level
end
def self.valid_range
(0..4)
end
def self.compare(current_level, level)
(current_level || 0) >= level
end
def self.name(level)
I18n.t("js.trust_levels.names.#{levels[level]}")
end
def self.calculate(user, use_previous_trust_level: false)
# First, use the manual locked level
return user.manual_locked_trust_level if user.manual_locked_trust_level.present?
# Then consider the group locked level (or the previous trust level)
granted_trust_level = user.group_granted_trust_level || 0
previous_trust_level = use_previous_trust_level ? find_previous_trust_level(user) : 0
[granted_trust_level, previous_trust_level].max
end
private
def self.find_previous_trust_level(user)
UserHistory
.where(action: UserHistory.actions[:change_trust_level])
.where(target_user_id: user.id)
.order(created_at: :desc)
.pluck_first(:new_value)
.to_i
end
end