Files
gitlabhq/lib/gitlab/import/user_from_mention.rb
2024-03-26 09:12:21 +00:00

67 lines
2.0 KiB
Ruby

# frozen_string_literal: true
module Gitlab
module Import
module UserFromMention
SOURCE_USER_CACHE_KEY = '%s/project/%s/source/%s'
SOURCE_USERNAME_CACHE_KEY = '%s/project/%s/source/username/%s'
USER_MAPPABLE_TYPES = [
:email
].freeze
def user_from_cache(mention)
cached_user_value_hash = read(mention)
cached_user_value_hash ||= read_cached_email(mention)
return unless cached_user_value_hash
mapping_type = cached_user_value_hash['type']
user_value = cached_user_value_hash['value']
return user_value if USER_MAPPABLE_TYPES.exclude?(mapping_type.to_sym)
find_user(user_value)
end
def cache_multiple(hash)
::Gitlab::Cache::Import::Caching.write_multiple(hash, timeout: timeout)
end
def source_user_cache_key(importer, project_id, source_key)
format(SOURCE_USER_CACHE_KEY, importer, project_id, source_key)
end
def source_user_cache_value(source_value, type:)
{ value: source_value, type: type }.to_json
end
private
def read(mention)
Gitlab::Json.parse(
::Gitlab::Cache::Import::Caching.read(source_user_cache_key(importer, project_id, mention))
)
end
def find_user(email)
User.find_by_any_email(email, confirmed: true)
end
def timeout
::Gitlab::Cache::Import::Caching::LONGER_TIMEOUT
end
def read_cached_email(mention)
# Attempt to find a cached email in case a user email was cached before changes to the cache structure were
# merged but before the cached email could be read and mapped in the import
source_username_cache_key = format(SOURCE_USERNAME_CACHE_KEY, importer, project_id, mention)
cached_email = ::Gitlab::Cache::Import::Caching.read(source_username_cache_key)
return unless cached_email
{ value: cached_email, type: :email }.with_indifferent_access
end
end
end
end