forgeplus/app/services/cache/user_project_languages_coun...

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