diff --git a/app/controllers/api/pm/sprint_issues_controller.rb b/app/controllers/api/pm/sprint_issues_controller.rb new file mode 100644 index 000000000..a1f4281c5 --- /dev/null +++ b/app/controllers/api/pm/sprint_issues_controller.rb @@ -0,0 +1,23 @@ +class Api::Pm::SprintIssuesController < Api::Pm::BaseController + + before_action :require_login, except: [:index] + def index + @issues = Api::Pm::SprintIssues::ListService.call(query_params, current_user) + @issues = kaminari_paginate(@issues) + render 'api/v1/issues/index' + end + + def query_params + params.permit( + :category, + :pm_project_id, + :pm_issue_type, #需求1 任务2 缺陷3 + :assigner_id, + :priority_id, + :status_id, + :keyword, + :sort_by, :sort_direction + ) + end + +end \ No newline at end of file diff --git a/app/services/api/pm/sprint_issues/list_service.rb b/app/services/api/pm/sprint_issues/list_service.rb new file mode 100644 index 000000000..884506af0 --- /dev/null +++ b/app/services/api/pm/sprint_issues/list_service.rb @@ -0,0 +1,54 @@ +class Api::Pm::SprintIssues::ListService < ApplicationService + + include ActiveModel::Model + + attr_reader :category, :pm_project_id, :pm_issue_type, :assigner_id, :priority_id, :status_id, :keyword, :current_user + attr_reader :sort_by, :sort_direction + attr_accessor :queried_issues + + validates :category, inclusion: { in: %w[linked unlink], message: '请输入正确的Category'} + validates :sort_by, inclusion: { in: %w[issues.created_on issues.updated_on issue_priorities.position] , message: '请输入正确的SortBy'}, allow_blank: true + validates :sort_direction, inclusion: { in: %w[asc desc], message: '请输入正确的SortDirection'}, allow_blank: true + + validates :pm_project_id, :current_user, presence: true + + def initialize(params, current_user = nil) + @category = params[:category] || "unlink" + @pm_project_id = params[:pm_project_id] + @pm_issue_type = params[:pm_issue_type] + @assigner_id = params[:assigner_id] + @priority_id = params[:priority_id] + @status_id = params[:status_id] + @keyword = params[:keyword] + @current_user = current_user + end + + def call + raise Error, errors.full_messages.join(', ') unless valid? + + issue_query_data + + @queried_issues + end + + private + def issue_query_data + issues = @category == "unlink" ? Issue.where(pm_project_id: @pm_project_id, pm_sprint_id: nil) : Issue.where(pm_project_id: @pm_project_id).where.not(pm_sprint_id: nil) + + issues = issues.where(pm_issue_type: @pm_issue_type) if @pm_issue_type.present? + + issues = issues.joins(:assigners).where(users: {id: @assigner_id}) if @assigner_id.present? + + issues = issues.where(priority_id: @priority_id) if @priority_id.present? + + issues = issues.where(status_id: @status_id) if @status_id.present? + + issues = issues.ransack(subject_cont: @keyword).result if @keyword.present? + + scope = issues.includes(:priority, :issue_status, :user, :show_assigners, :show_issue_tags, :version, :comment_journals) + scope = scope.reorder("#{sort_by} #{sort_direction}").distinct + + @queried_issues = scope + + end +end \ No newline at end of file diff --git a/app/views/api/v1/issues/index.json.jbuilder b/app/views/api/v1/issues/index.json.jbuilder index 8fd915553..c6a5f526c 100644 --- a/app/views/api/v1/issues/index.json.jbuilder +++ b/app/views/api/v1/issues/index.json.jbuilder @@ -2,7 +2,7 @@ json.total_issues_count @total_issues_count json.opened_count @opened_issues_count json.closed_count @closed_issues_count json.total_count @issues.total_count -json.has_created_issues @project.issues.size > 0 +json.has_created_issues @project.present? ? @project.issues.size > 0 : 0 json.issues @issues.each do |issue| if params[:only_name].present? json.(issue, :id, :subject, :project_issues_index) diff --git a/config/routes/api.rb b/config/routes/api.rb index 2a08425c4..3901112df 100644 --- a/config/routes/api.rb +++ b/config/routes/api.rb @@ -21,6 +21,7 @@ defaults format: :json do end end end + resources :sprint_issues, only: [:index] resources :projects do collection do get :convert