forked from Gitlink/forgeplus
60 lines
1.6 KiB
Ruby
60 lines
1.6 KiB
Ruby
class Cache::UserProjectLanguagesCountService < ApplicationService
|
|
attr_reader :user, :key, :increment_count
|
|
|
|
def initialize(user, key=nil, increment_count=0)
|
|
@user = user
|
|
@key = key
|
|
@increment_count = increment_count
|
|
end
|
|
|
|
def call
|
|
set_user_project_language_count
|
|
|
|
user_project_language_count
|
|
end
|
|
|
|
def reset_by_key
|
|
reset_user_project_language_count_by_key
|
|
|
|
user_project_language_count
|
|
end
|
|
|
|
def reset
|
|
reset_user_project_language_count
|
|
|
|
user_project_language_count
|
|
end
|
|
|
|
private
|
|
|
|
def user_project_language_count_key
|
|
"user-project-language-count-#{user.id}"
|
|
end
|
|
|
|
def user_project_language_count
|
|
$redis_cache.hgetall(user_project_language_count_key).transform_values(&:to_i)
|
|
end
|
|
|
|
def set_user_project_language_count
|
|
if $redis_cache.hlen(user_project_language_count_key) == 0
|
|
reset_user_project_language_count
|
|
elsif $redis_cache.hget(user_project_language_count_key, key).nil?
|
|
reset_user_project_language_count_by_key
|
|
else
|
|
$redis_cache.hincrby(user_project_language_count_key, key, increment_count)
|
|
end
|
|
end
|
|
|
|
def reset_user_project_language_count_by_key
|
|
return if user.nil?
|
|
return if key.nil?
|
|
$redis_cache.hset(user_project_language_count_key, key, user.projects.joins(:project_language).where(project_languages: {name: key}).count)
|
|
end
|
|
|
|
def reset_user_project_language_count
|
|
return if user.nil?
|
|
user.projects.joins(:project_language).group("project_languages.name").count.each do |k, v|
|
|
$redis_cache.hset(user_project_language_count_key, k, v)
|
|
end
|
|
end
|
|
end |