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