mirror of
https://github.com/discourse/discourse.git
synced 2024-12-01 03:23:37 +08:00
0d8ecab362
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.
54 lines
1.2 KiB
Ruby
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
|