2018-02-23 19:33:16 +00:00
|
|
|
class UserContributedProjects < ActiveRecord::Base
|
|
|
|
belongs_to :user
|
|
|
|
belongs_to :project
|
|
|
|
|
|
|
|
validates :project, presence: true
|
|
|
|
validates :user, presence: true
|
|
|
|
|
2018-02-23 19:56:43 +00:00
|
|
|
CACHE_EXPIRY_TIME = 1.day
|
|
|
|
|
2018-02-26 15:44:35 +00:00
|
|
|
# Schema version required for this model
|
|
|
|
REQUIRED_SCHEMA_VERSION = 20180223120443
|
|
|
|
|
2018-02-26 11:24:02 +00:00
|
|
|
class << self
|
|
|
|
def track(event)
|
|
|
|
# For events without a project, we simply don't care.
|
|
|
|
# An example of this is the creation of a snippet (which
|
|
|
|
# is not related to any project).
|
|
|
|
return unless event.project
|
|
|
|
|
|
|
|
# This is a precaution because the cache lookup
|
|
|
|
# will work just fine without an author.
|
|
|
|
#
|
|
|
|
# However, this should never happen (tm).
|
|
|
|
raise 'event#author not present unexpectedly' unless event.author
|
|
|
|
|
|
|
|
attributes = {
|
|
|
|
project_id: event.project_id,
|
|
|
|
user_id: event.author_id
|
|
|
|
}
|
|
|
|
|
|
|
|
cached_exists?(attributes) do
|
|
|
|
begin
|
|
|
|
find_or_create_by!(attributes)
|
|
|
|
true # not caching the whole record here for now
|
|
|
|
rescue ActiveRecord::RecordNotUnique
|
|
|
|
retry
|
|
|
|
end
|
2018-02-23 19:56:43 +00:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2018-02-26 15:44:35 +00:00
|
|
|
# Check if we can safely call .track (table exists)
|
|
|
|
def available?
|
|
|
|
@available_flag ||= ActiveRecord::Migrator.current_version >= REQUIRED_SCHEMA_VERSION # rubocop:disable Gitlab/PredicateMemoization
|
|
|
|
end
|
|
|
|
|
2018-02-26 18:39:08 +00:00
|
|
|
# Flushes cached information about schema
|
|
|
|
def reset_column_information
|
|
|
|
@available_flag = nil
|
|
|
|
super
|
|
|
|
end
|
|
|
|
|
2018-02-26 11:24:02 +00:00
|
|
|
private
|
2018-02-23 19:56:43 +00:00
|
|
|
|
2018-02-26 11:24:02 +00:00
|
|
|
def cached_exists?(project_id:, user_id:, &block)
|
|
|
|
cache_key = "user_contributed_projects:#{project_id}:#{user_id}"
|
|
|
|
Rails.cache.fetch(cache_key, expires_in: CACHE_EXPIRY_TIME, &block)
|
|
|
|
end
|
2018-02-23 19:33:16 +00:00
|
|
|
end
|
|
|
|
end
|