forgeplus/app/services/cache/v2/project_common_service.rb

251 lines
7.3 KiB
Ruby

class Cache::V2::ProjectCommonService < ApplicationService
attr_reader :project_id, :owner_id, :name, :identifier, :description, :visits, :watchers, :praises, :forks, :issues, :closed_issues, :pullrequests, :commits
attr_accessor :project
def initialize(project_id, params={})
@project_id = project_id
@owner_id = params[:owner_id]
@name = params[:name]
@identifier = params[:identifier]
@description = params[:description]
@visits = params[:visits]
@watchers = params[:watchers]
@praises = params[:praises]
@forks = params[:forks]
@issues = params[:issues]
@closed_issues = params[:closed_issues]
@pullrequests = params[:pullrequests]
@commits = params[:commits]
end
def read
project_common
end
def call
set_project_common
end
def reset
reset_project_common
end
def clear
clear_project_common
end
private
def load_project
@project = Project.find_by_id(project_id)
end
def project_common_key
"v2-project-common:#{@project_id}"
end
def owner_id_key
"owner_id"
end
def name_key
"name"
end
def identifier_key
"identifier"
end
def description_key
"description"
end
def visits_key
"visits"
end
def watchers_key
"watchers"
end
def praises_key
"praises"
end
def forks_key
"forks"
end
def issues_key
"issues"
end
def closed_issues_key
"closed_issues"
end
def pullrequests_key
"pullrequests"
end
def commits_key
"commits"
end
def project_common
result = $redis_cache.hgetall(project_common_key)
result.blank? ? reset_project_common : result
end
def set_project_common
if $redis_cache.hgetall(project_common_key).blank?
reset_project_common
return
else
load_project
return unless @project.is_full_public
if @owner_id.present?
if $redis_cache.hget(project_common_key, owner_id_key).nil?
reset_project_owner_id
else
$redis_cache.hset(project_common_key, owner_id_key, @owner_id)
end
end
if @name.present?
if $redis_cache.hget(project_common_key, name_key).nil?
reset_project_name
else
$redis_cache.hset(project_common_key, name_key, @name)
end
end
if @identifier.present?
if $redis_cache.hget(project_common_key, identifier_key).nil?
reset_project_identifier
else
$redis_cache.hset(project_common_key, identifier_key, @identifier)
end
end
if @description.present?
if $redis_cache.hget(project_common_key, description_key).nil?
reset_project_description
else
$redis_cache.hset(project_common_key, description_key, @description)
end
end
if @visits.present?
$redis_cache.hincrby(project_common_key, visits_key, @visits.to_s)
Cache::V2::ProjectRankService.call(@project_id, {visits: @visits})
Cache::V2::ProjectDateRankService.call(@project_id, Date.today, {visits: @visits})
end
if @watchers.present?
$redis_cache.hincrby(project_common_key, watchers_key, @watchers)
Cache::V2::ProjectRankService.call(@project_id, {watchers: @watchers})
Cache::V2::ProjectDateRankService.call(@project_id, Date.today, {watchers: @watchers})
end
if @praises.present?
$redis_cache.hincrby(project_common_key, praises_key, @praises)
Cache::V2::ProjectRankService.call(@project_id, {praises: @praises})
Cache::V2::ProjectDateRankService.call(@project_id, Date.today, {praises: @praises})
end
if @forks.present?
$redis_cache.hincrby(project_common_key, forks_key, @forks)
Cache::V2::ProjectRankService.call(@project_id, {forks: @forks})
Cache::V2::ProjectDateRankService.call(@project_id, Date.today, {forks: @forks})
end
if @issues.present?
$redis_cache.hincrby(project_common_key, issues_key, @issues)
Cache::V2::ProjectRankService.call(@project_id, {issues: @issues})
Cache::V2::ProjectDateRankService.call(@project_id, Date.today, {issues: @issues})
end
if @closed_issues.present?
$redis_cache.hincrby(project_common_key, closed_issues_key, @closed_issues)
Cache::V2::ProjectDateRankService.call(@project_id, Date.today, {closed_issues: @closed_issues})
end
if @pullrequests.present?
$redis_cache.hincrby(project_common_key, pullrequests_key, @pullrequests)
Cache::V2::ProjectRankService.call(@project_id, {pullrequests: @pullrequests})
Cache::V2::ProjectDateRankService.call(@project_id, Date.today, {pullrequests: @pullrequests})
end
if @commits.present?
$redis_cache.hincrby(project_common_key, commits_key, @commits)
Cache::V2::ProjectRankService.call(@project_id, {commits: @commits})
Cache::V2::ProjectDateRankService.call(@project_id, Date.today, {commits: @commits})
end
end
$redis_cache.hgetall(project_common_key)
end
def reset_project_owner_id
$redis_cache.hset(project_common_key, owner_id_key, @project&.user_id)
end
def reset_project_name
$redis_cache.hset(project_common_key, name_key, @project&.name)
end
def reset_project_identifier
$redis_cache.hset(project_common_key, identifier_key, @project&.identifier)
end
def reset_project_description
$redis_cache.hset(project_common_key, description_key, @project&.description)
end
def reset_project_visits
$redis_cache.hset(project_common_key, visits_key, @project&.visits || 0)
end
def reset_project_watchers
$redis_cache.hset(project_common_key, watchers_key, Watcher.where(watchable_type: 'Project', watchable_id: @project_id).count)
end
def reset_project_praises
$redis_cache.hset(project_common_key, praises_key, PraiseTread.where(praise_tread_object_type: 'Project', praise_tread_object_id: @project_id).count)
end
def reset_project_forks
$redis_cache.hset(project_common_key, forks_key, ForkUser.where(project_id: @project_id).count)
end
def reset_project_issues
$redis_cache.hset(project_common_key, issues_key, Issue.issue_issue.where(project_id: @project_id).count)
end
def reset_project_closed_issues
$redis_cache.hset(project_common_key, closed_issues_key, Issue.issue_issue.closed.where(project_id: @project_id).count)
end
def reset_project_pullrequests
$redis_cache.hset(project_common_key, pullrequests_key, PullRequest.where(project_id: @project_id).count)
end
def reset_project_commits
$redis_cache.hset(project_common_key, commits_key, CommitLog.where(project_id: @project_id).count)
end
def reset_project_common
load_project
return unless @project.present?
return unless @project.is_full_public
$redis_cache.del(project_common_key)
reset_project_owner_id
reset_project_name
reset_project_identifier
reset_project_description
reset_project_visits
reset_project_watchers
reset_project_praises
reset_project_forks
reset_project_issues
reset_project_closed_issues
reset_project_pullrequests
reset_project_commits
$redis_cache.hgetall(project_common_key)
end
def clear_project_common
$redis_cache.del(project_common_key)
Cache::V2::ProjectRankService.new(@project_id).clear
end
end