57719d34d3
Instead of only exposing a User to slash commands we now also expose the ChatName object that the User object is retrieved from. This is necessary for GitLab Chatops as we need for example the user ID of the chat user.
33 lines
975 B
Ruby
33 lines
975 B
Ruby
class ChatName < ActiveRecord::Base
|
|
LAST_USED_AT_INTERVAL = 1.hour
|
|
|
|
belongs_to :service
|
|
belongs_to :user
|
|
|
|
validates :user, presence: true
|
|
validates :service, presence: true
|
|
validates :team_id, presence: true
|
|
validates :chat_id, presence: true
|
|
|
|
validates :user_id, uniqueness: { scope: [:service_id] }
|
|
validates :chat_id, uniqueness: { scope: [:service_id, :team_id] }
|
|
|
|
# Updates the "last_used_timestamp" but only if it wasn't already updated
|
|
# recently.
|
|
#
|
|
# The throttling this method uses is put in place to ensure that high chat
|
|
# traffic doesn't result in many UPDATE queries being performed.
|
|
def update_last_used_at
|
|
return unless update_last_used_at?
|
|
|
|
obtained = Gitlab::ExclusiveLease
|
|
.new("chat_name/last_used_at/#{id}", timeout: LAST_USED_AT_INTERVAL.to_i)
|
|
.try_obtain
|
|
|
|
touch(:last_used_at) if obtained
|
|
end
|
|
|
|
def update_last_used_at?
|
|
last_used_at.nil? || last_used_at > LAST_USED_AT_INTERVAL.ago
|
|
end
|
|
end
|