summaryrefslogtreecommitdiff
path: root/app/services/jira/requests
diff options
context:
space:
mode:
Diffstat (limited to 'app/services/jira/requests')
-rw-r--r--app/services/jira/requests/base.rb22
-rw-r--r--app/services/jira/requests/projects.rb32
-rw-r--r--app/services/jira/requests/projects/list_service.rb47
3 files changed, 60 insertions, 41 deletions
diff --git a/app/services/jira/requests/base.rb b/app/services/jira/requests/base.rb
index 7521c7610cb..7c6db372257 100644
--- a/app/services/jira/requests/base.rb
+++ b/app/services/jira/requests/base.rb
@@ -5,28 +5,32 @@ module Jira
class Base
include ProjectServicesLoggable
- PER_PAGE = 50
+ JIRA_API_VERSION = 2
- attr_reader :jira_service, :project, :limit, :start_at, :query
-
- def initialize(jira_service, limit: PER_PAGE, start_at: 0, query: nil)
+ def initialize(jira_service, params = {})
@project = jira_service&.project
@jira_service = jira_service
-
- @limit = limit
- @start_at = start_at
- @query = query
end
def execute
return ServiceResponse.error(message: _('Jira service not configured.')) unless jira_service&.active?
- return ServiceResponse.success(payload: empty_payload) if limit.to_i <= 0
request
end
+ def base_api_url
+ "/rest/api/#{api_version}"
+ end
+
private
+ attr_reader :jira_service, :project
+
+ # override this method in the specific request class implementation if a differnt API version is required
+ def api_version
+ JIRA_API_VERSION
+ end
+
def client
@client ||= jira_service.client
end
diff --git a/app/services/jira/requests/projects.rb b/app/services/jira/requests/projects.rb
deleted file mode 100644
index da464503211..00000000000
--- a/app/services/jira/requests/projects.rb
+++ /dev/null
@@ -1,32 +0,0 @@
-# frozen_string_literal: true
-
-module Jira
- module Requests
- class Projects < Base
- extend ::Gitlab::Utils::Override
-
- private
-
- override :url
- def url
- '/rest/api/2/project/search?query=%{query}&maxResults=%{limit}&startAt=%{start_at}' %
- { query: CGI.escape(query.to_s), limit: limit.to_i, start_at: start_at.to_i }
- end
-
- override :build_service_response
- def build_service_response(response)
- return ServiceResponse.success(payload: empty_payload) unless response['values'].present?
-
- ServiceResponse.success(payload: { projects: map_projects(response), is_last: response['isLast'] })
- end
-
- def map_projects(response)
- response['values'].map { |v| JIRA::Resource::Project.build(client, v) }
- end
-
- def empty_payload
- { projects: [], is_last: true }
- end
- end
- end
-end
diff --git a/app/services/jira/requests/projects/list_service.rb b/app/services/jira/requests/projects/list_service.rb
new file mode 100644
index 00000000000..8ecfd358ffb
--- /dev/null
+++ b/app/services/jira/requests/projects/list_service.rb
@@ -0,0 +1,47 @@
+# frozen_string_literal: true
+
+module Jira
+ module Requests
+ module Projects
+ class ListService < Base
+ extend ::Gitlab::Utils::Override
+
+ def initialize(jira_service, params: {})
+ super(jira_service, params)
+
+ @query = params[:query]
+ end
+
+ private
+
+ attr_reader :query
+
+ override :url
+ def url
+ "#{base_api_url}/project"
+ end
+
+ override :build_service_response
+ def build_service_response(response)
+ return ServiceResponse.success(payload: empty_payload) unless response.present?
+
+ ServiceResponse.success(payload: { projects: map_projects(response), is_last: true })
+ end
+
+ def map_projects(response)
+ response.map { |v| JIRA::Resource::Project.build(client, v) }.select(&method(:match_query?))
+ end
+
+ def match_query?(jira_project)
+ query = query.to_s.downcase
+
+ jira_project&.key&.downcase&.include?(query) || jira_project&.name&.downcase&.include?(query)
+ end
+
+ def empty_payload
+ { projects: [], is_last: true }
+ end
+ end
+ end
+ end
+end