From 5db43bf76889020b058106d6fbb45763d6a64f1a Mon Sep 17 00:00:00 2001 From: yystopf Date: Mon, 25 Jul 2022 16:21:03 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=EF=BC=9A=E6=96=B0=E5=90=88?= =?UTF-8?q?=E5=B9=B6=E8=AF=B7=E6=B1=82=E5=88=97=E8=A1=A8=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/api/v1/base_controller.rb | 1 + .../api/v1/projects/pulls/base_controller.rb | 15 ------ .../v1/projects/pulls/comments_controller.rb | 2 + .../v1/projects/pulls/reviews_controller.rb | 7 +++ .../api/v1/projects/pulls_controller.rb | 19 ++++++++ app/controllers/concerns/api/pull_helper.rb | 19 ++++++++ .../api/v1/projects/pulls/list_service.rb | 46 +++++++++++++++++++ .../pulls/_simple_detail.json.jbuilder | 25 ++++++++++ .../api/v1/projects/pulls/index.json.jbuilder | 4 ++ 9 files changed, 123 insertions(+), 15 deletions(-) create mode 100644 app/controllers/api/v1/projects/pulls/comments_controller.rb create mode 100644 app/controllers/api/v1/projects/pulls/reviews_controller.rb create mode 100644 app/controllers/api/v1/projects/pulls_controller.rb create mode 100644 app/controllers/concerns/api/pull_helper.rb create mode 100644 app/services/api/v1/projects/pulls/list_service.rb create mode 100644 app/views/api/v1/projects/pulls/_simple_detail.json.jbuilder create mode 100644 app/views/api/v1/projects/pulls/index.json.jbuilder diff --git a/app/controllers/api/v1/base_controller.rb b/app/controllers/api/v1/base_controller.rb index a66bfc528..4b3b8ab13 100644 --- a/app/controllers/api/v1/base_controller.rb +++ b/app/controllers/api/v1/base_controller.rb @@ -2,6 +2,7 @@ class Api::V1::BaseController < ApplicationController include Api::ProjectHelper include Api::UserHelper + include Api::PullHelper # before_action :doorkeeper_authorize! # skip_before_action :user_setup diff --git a/app/controllers/api/v1/projects/pulls/base_controller.rb b/app/controllers/api/v1/projects/pulls/base_controller.rb index 0d5ae08b5..acb5e2a03 100644 --- a/app/controllers/api/v1/projects/pulls/base_controller.rb +++ b/app/controllers/api/v1/projects/pulls/base_controller.rb @@ -2,19 +2,4 @@ class Api::V1::Projects::Pulls::BaseController < Api::V1::BaseController before_action :require_public_and_member_above before_action :load_pull_request - def load_pull_request - pull_request_id = params[:pull_id] || params[:id] - @pull_request = @project.pull_requests.where(gitea_number: pull_request_id).where.not(id: pull_request_id).take || PullRequest.find_by_id(pull_request_id) - @issue = @pull_request&.issue - if @pull_request - logger.info "###########pull_request founded" - @pull_request - else - logger.info "###########pull_request not found" - @pull_request = nil - render_not_found and return - end - - @pull_request - end end \ No newline at end of file diff --git a/app/controllers/api/v1/projects/pulls/comments_controller.rb b/app/controllers/api/v1/projects/pulls/comments_controller.rb new file mode 100644 index 000000000..8622c3190 --- /dev/null +++ b/app/controllers/api/v1/projects/pulls/comments_controller.rb @@ -0,0 +1,2 @@ +class Api::V1::Projects::Pulls::CommentsController < Api::V1::Projects::Pulls::BaseController +end \ No newline at end of file diff --git a/app/controllers/api/v1/projects/pulls/reviews_controller.rb b/app/controllers/api/v1/projects/pulls/reviews_controller.rb new file mode 100644 index 000000000..e07f02e32 --- /dev/null +++ b/app/controllers/api/v1/projects/pulls/reviews_controller.rb @@ -0,0 +1,7 @@ +class Api::V1::Projects::Pulls::ReviewsController < Api::V1::Projects::Pulls::BaseController + + def index + @reviews = @pull_request.reviews + @reviews = kaminari_paginate(@reviews) + end +end \ No newline at end of file diff --git a/app/controllers/api/v1/projects/pulls_controller.rb b/app/controllers/api/v1/projects/pulls_controller.rb new file mode 100644 index 000000000..fe39b2ad9 --- /dev/null +++ b/app/controllers/api/v1/projects/pulls_controller.rb @@ -0,0 +1,19 @@ +class Api::V1::Projects::PullsController < Api::V1::BaseController + before_action :require_public_and_member_above + + def index + @pulls = Api::V1::Projects::Pulls::ListService.call(@project, query_params) + @pulls = kaminari_paginate(@pulls) + end + + before_action :load_pull_request, only: [:show] + + def show + + end + + private + def query_params + params.permit(:status, :keyword, :priority_id, :issue_tag_id, :version_id, :reviewer_id, :sort_by, :sort_direction) + end +end \ No newline at end of file diff --git a/app/controllers/concerns/api/pull_helper.rb b/app/controllers/concerns/api/pull_helper.rb new file mode 100644 index 000000000..e186cd6f2 --- /dev/null +++ b/app/controllers/concerns/api/pull_helper.rb @@ -0,0 +1,19 @@ +module Api::PullHelper + extend ActiveSupport::Concern + + def load_pull_request + pull_request_id = params[:pull_id] || params[:id] + @pull_request = @project.pull_requests.where(gitea_number: pull_request_id).where.not(id: pull_request_id).take || PullRequest.find_by_id(pull_request_id) + @issue = @pull_request&.issue + if @pull_request + logger.info "###########pull_request founded" + @pull_request + else + logger.info "###########pull_request not found" + @pull_request = nil + render_not_found and return + end + + @pull_request + end +end \ No newline at end of file diff --git a/app/services/api/v1/projects/pulls/list_service.rb b/app/services/api/v1/projects/pulls/list_service.rb new file mode 100644 index 000000000..6b18da2ce --- /dev/null +++ b/app/services/api/v1/projects/pulls/list_service.rb @@ -0,0 +1,46 @@ +class Api::V1::Projects::Pulls::ListService < ApplicationService + include ActiveModel::Model + + attr_reader :project, :keyword, :status, :priority_id, :issue_tag_id, :version_id, :reviewer_id, :sort_by, :sort_direction + attr_accessor :queried_pull_requests + + validates :status, inclusion: {in: [0, 1, 2], message: "请输入正确的Status"}, allow_nil: true + validates :sort_by, inclusion: {in: PullRequest.column_names, message: '请输入正确的SortBy'} + validates :sort_direction, inclusion: {in: %w(asc desc), message: '请输入正确的SortDirection'} + + def initialize(project, params={}) + @project = project + @keyword = params[:keyword] + @status = params[:status].to_i + @priority_id = params[:priority_id] + @issue_tag_id = params[:issue_tag_id] + @version_id = params[:version_id] + @reviewer_id = params[:reviewer_id] + @sort_by = params[:sort_by] || 'created_at' + @sort_direction = params[:sort_direction] || 'desc' + end + + def call + raise Error, errors.full_messages.join(",") unless valid? + pull_request_query_data + + queried_pull_requests + end + + private + def pull_request_query_data + pull_requests = @project.pull_requests + + pull_requests = pull_requests.where(status: status) if status.present? + pull_requests = pull_requests.where(issues: {priority_id: priority_id}) if priority_id.present? + pull_requests = pull_requests.where(issue_tags: {id: issue_tag_id}) if issue_tag_id.present? + pull_requests = pull_requests.where(issues: {fixed_version_id: version_id}) if version_id.present? + pull_requests = pull_requests.where(users: {id: reviewer_id}) if reviewer_id.present? + + q = pull_requests.ransack(title_or_body_cont: keyword) + scope = q.result.includes(:fork_project, :journals, :reviews, :reviewers, issue: [:journals, :priority, :version, :issue_tags]) + scope = scope.order("pull_requests.#{sort_by} #{sort_direction}") + + @queried_pull_requests = scope + end +end \ No newline at end of file diff --git a/app/views/api/v1/projects/pulls/_simple_detail.json.jbuilder b/app/views/api/v1/projects/pulls/_simple_detail.json.jbuilder new file mode 100644 index 000000000..e8c668c59 --- /dev/null +++ b/app/views/api/v1/projects/pulls/_simple_detail.json.jbuilder @@ -0,0 +1,25 @@ +json.(pull, :id, :head, :base, :is_original) +json.index pull.gitea_number +json.status pull.status == 1 ? "merged" : (pull.status == 2 ? "closed" : "open") + +fork_project = pull&.fork_project +if fork_project.present? + json.fork_project do + json.(fork_project, :id, :identifier) + json.login fork_project&.owner&.login + end +end + +issue = pull&.issue +json.issue do + json.id issue&.id + json.author do + json.partial! '/api/v1/users/simple_user', user: issue&.user + end + json.priority issue&.priority.try(:name) + json.version issue&.version.try(:name) + json.comments_count issue.journals.count + json.issue_tags issue.get_issue_tags +end + +json.comments_count pull.journals.count \ No newline at end of file diff --git a/app/views/api/v1/projects/pulls/index.json.jbuilder b/app/views/api/v1/projects/pulls/index.json.jbuilder new file mode 100644 index 000000000..412ea13d7 --- /dev/null +++ b/app/views/api/v1/projects/pulls/index.json.jbuilder @@ -0,0 +1,4 @@ +json.total_count @pulls.total_count +json.pulls @pulls.each do |pull| + json.partial! 'api/v1/projects/pulls/simple_detail', pull: pull +end \ No newline at end of file