Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'app/services/users/update_assigned_open_issue_count_service.rb')
-rw-r--r--app/services/users/update_assigned_open_issue_count_service.rb33
1 files changed, 33 insertions, 0 deletions
diff --git a/app/services/users/update_assigned_open_issue_count_service.rb b/app/services/users/update_assigned_open_issue_count_service.rb
new file mode 100644
index 00000000000..2ed05853b2f
--- /dev/null
+++ b/app/services/users/update_assigned_open_issue_count_service.rb
@@ -0,0 +1,33 @@
+# frozen_string_literal: true
+
+module Users
+ # Service class for calculating and caching the number of assigned open issues for a user.
+ class UpdateAssignedOpenIssueCountService
+ attr_accessor :target_user
+
+ def initialize(target_user:)
+ @target_user = target_user
+
+ raise ArgumentError, "Please provide a target user" unless target_user.is_a?(User)
+ end
+
+ def execute
+ value = calculate_count
+ Rails.cache.write(cache_key, value, expires_in: User::COUNT_CACHE_VALIDITY_PERIOD)
+
+ ServiceResponse.success(payload: { count: value })
+ rescue StandardError => e
+ ServiceResponse.error(message: e.message)
+ end
+
+ private
+
+ def cache_key
+ ['users', target_user.id, 'assigned_open_issues_count']
+ end
+
+ def calculate_count
+ IssuesFinder.new(target_user, assignee_id: target_user.id, state: 'opened', non_archived: true).execute.count
+ end
+ end
+end