79 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Ruby
		
	
	
	
			
		
		
	
	
			79 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Ruby
		
	
	
	
# frozen_string_literal: true
 | 
						|
 | 
						|
module Gitlab
 | 
						|
  module Zentao
 | 
						|
    class Query
 | 
						|
      STATUSES = %w[all opened closed].freeze
 | 
						|
      ISSUES_DEFAULT_LIMIT = 20
 | 
						|
      ISSUES_MAX_LIMIT = 50
 | 
						|
 | 
						|
      def initialize(integration, params)
 | 
						|
        @client = Client.new(integration)
 | 
						|
        @params = params
 | 
						|
      end
 | 
						|
 | 
						|
      def issues
 | 
						|
        issues_response = client.fetch_issues(query_options)
 | 
						|
        return [] if issues_response.blank?
 | 
						|
 | 
						|
        Kaminari.paginate_array(
 | 
						|
          issues_response['issues'],
 | 
						|
          limit: issues_response['limit'],
 | 
						|
          total_count: issues_response['total']
 | 
						|
        )
 | 
						|
      end
 | 
						|
 | 
						|
      def issue
 | 
						|
        issue_response = client.fetch_issue(params[:id])
 | 
						|
        issue_response['issue']
 | 
						|
      end
 | 
						|
 | 
						|
      private
 | 
						|
 | 
						|
      attr_reader :client, :params
 | 
						|
 | 
						|
      def query_options
 | 
						|
        {
 | 
						|
          order: query_order,
 | 
						|
          status: query_status,
 | 
						|
          labels: query_labels,
 | 
						|
          page: query_page,
 | 
						|
          limit: query_limit,
 | 
						|
          search: query_search
 | 
						|
        }
 | 
						|
      end
 | 
						|
 | 
						|
      def query_page
 | 
						|
        params[:page].presence || 1
 | 
						|
      end
 | 
						|
 | 
						|
      def query_limit
 | 
						|
        limit = params[:limit].presence || ISSUES_DEFAULT_LIMIT
 | 
						|
        [limit.to_i, ISSUES_MAX_LIMIT].min
 | 
						|
      end
 | 
						|
 | 
						|
      def query_search
 | 
						|
        params[:search] || ''
 | 
						|
      end
 | 
						|
 | 
						|
      def query_order
 | 
						|
        key, order = params['sort'].to_s.split('_', 2)
 | 
						|
        zentao_key = (key == 'created' ? 'openedDate' : 'lastEditedDate')
 | 
						|
        zentao_order = (order == 'asc' ? 'asc' : 'desc')
 | 
						|
 | 
						|
        "#{zentao_key}_#{zentao_order}"
 | 
						|
      end
 | 
						|
 | 
						|
      def query_status
 | 
						|
        return params[:state] if params[:state].present? && params[:state].in?(STATUSES)
 | 
						|
 | 
						|
        'opened'
 | 
						|
      end
 | 
						|
 | 
						|
      def query_labels
 | 
						|
        (params[:labels].presence || []).join(',')
 | 
						|
      end
 | 
						|
    end
 | 
						|
  end
 | 
						|
end
 |