summaryrefslogtreecommitdiff
path: root/app
diff options
context:
space:
mode:
authorAndreas Brandl <abrandl@gitlab.com>2018-04-04 17:14:19 +0200
committerAndreas Brandl <abrandl@gitlab.com>2018-04-06 12:27:20 +0200
commit29b0a90c208f29606a05d1391a72b9ff7ff843b1 (patch)
tree0c5e0312ed62271c0221f7f2f887cc694f87c765 /app
parent52b232ca5d18ffc08299f5bb0ef3be46d2fecca3 (diff)
downloadgitlab-ce-29b0a90c208f29606a05d1391a72b9ff7ff843b1.tar.gz
Cache personal projects count.
Closes #37462.
Diffstat (limited to 'app')
-rw-r--r--app/models/user.rb21
-rw-r--r--app/services/projects/create_service.rb2
-rw-r--r--app/services/projects/destroy_service.rb2
-rw-r--r--app/services/projects/transfer_service.rb2
4 files changed, 23 insertions, 4 deletions
diff --git a/app/models/user.rb b/app/models/user.rb
index ce56b39b1c8..a14aefc61d2 100644
--- a/app/models/user.rb
+++ b/app/models/user.rb
@@ -700,10 +700,6 @@ class User < ActiveRecord::Base
projects_limit - personal_projects_count
end
- def personal_projects_count
- @personal_projects_count ||= personal_projects.count
- end
-
def recent_push(project = nil)
service = Users::LastPushEventService.new(self)
@@ -1046,6 +1042,18 @@ class User < ActiveRecord::Base
end
end
+ def personal_projects_count(force: false)
+ Rails.cache.fetch(['users', id, 'personal_projects_count'], force: force, expires_in: 24.hours, raw: true) do
+ personal_projects.count
+ end.to_i
+ end
+
+ def update_cache_counts
+ assigned_open_merge_requests_count(force: true)
+ assigned_open_issues_count(force: true)
+ personal_projects_count(force: true)
+ end
+
def update_todos_count_cache
todos_done_count(force: true)
todos_pending_count(force: true)
@@ -1056,6 +1064,7 @@ class User < ActiveRecord::Base
invalidate_merge_request_cache_counts
invalidate_todos_done_count
invalidate_todos_pending_count
+ invalidate_personal_projects_count
end
def invalidate_issue_cache_counts
@@ -1074,6 +1083,10 @@ class User < ActiveRecord::Base
Rails.cache.delete(['users', id, 'todos_pending_count'])
end
+ def invalidate_personal_projects_count
+ Rails.cache.delete(['users', id, 'personal_projects_count'])
+ end
+
# This is copied from Devise::Models::Lockable#valid_for_authentication?, as our auth
# flow means we don't call that automatically (and can't conveniently do so).
#
diff --git a/app/services/projects/create_service.rb b/app/services/projects/create_service.rb
index 633e2c8236c..d361d070993 100644
--- a/app/services/projects/create_service.rb
+++ b/app/services/projects/create_service.rb
@@ -96,6 +96,8 @@ module Projects
system_hook_service.execute_hooks_for(@project, :create)
setup_authorizations
+
+ current_user.invalidate_personal_projects_count
end
# Refresh the current user's authorizations inline (so they can access the
diff --git a/app/services/projects/destroy_service.rb b/app/services/projects/destroy_service.rb
index 4b8f955ae69..114762c208e 100644
--- a/app/services/projects/destroy_service.rb
+++ b/app/services/projects/destroy_service.rb
@@ -34,6 +34,8 @@ module Projects
system_hook_service.execute_hooks_for(project, :destroy)
log_info("Project \"#{project.full_path}\" was removed")
+ current_user.invalidate_personal_projects_count
+
true
rescue => error
attempt_rollback(project, error.message)
diff --git a/app/services/projects/transfer_service.rb b/app/services/projects/transfer_service.rb
index 26765e5c3f3..5a23f0f0a62 100644
--- a/app/services/projects/transfer_service.rb
+++ b/app/services/projects/transfer_service.rb
@@ -24,6 +24,8 @@ module Projects
transfer(project)
+ current_user.invalidate_personal_projects_count
+
true
rescue Projects::TransferService::TransferError => ex
project.reload