diff --git a/app/controllers/api/v1/projects/pulls/pulls_controller.rb b/app/controllers/api/v1/projects/pulls/pulls_controller.rb index 28f1cd327..10e1b3c02 100644 --- a/app/controllers/api/v1/projects/pulls/pulls_controller.rb +++ b/app/controllers/api/v1/projects/pulls/pulls_controller.rb @@ -6,13 +6,22 @@ class Api::V1::Projects::Pulls::PullsController < Api::V1::BaseController @pulls = kaminari_paginate(@pulls) end - before_action :load_pull_request, only: [:show, :files] + before_action :load_pull_request, only: [:show, :reopen, :files] def show @result_object = Api::V1::Projects::Pulls::GetService.call(@project, @pull_request, current_user&.gitea_token) @last_review = @pull_request.reviews.order(created_at: :desc).take end + def reopen + @result_object = Api::V1::Projects::Pulls::ReopenService.call(@project, @pull_request, current_user) + if @result_object + render_ok + else + render_error("合并请求重新打开失败!") + end + end + def files if params[:filepath].present? @result_object = $gitea_hat_client.get_repos_pulls_files_by_owner_repo_index_filepath(@project&.owner.login, @project&.identifier, @pull_request.gitea_number, CGI.escape(params[:filepath]), {query: {token: current_user&.gitea_token}}) diff --git a/app/models/pull_request.rb b/app/models/pull_request.rb index 8d276625e..b12e8491b 100644 --- a/app/models/pull_request.rb +++ b/app/models/pull_request.rb @@ -144,6 +144,18 @@ class PullRequest < ApplicationRecord "#{Rails.application.config_for(:configuration)['platform_url']}/#{self.project.owner.login}/#{self.project.name}/pulls/#{self.id}" end + def closed? + self.status == CLOSED + end + + def merged? + self.status == MERGED + end + + def opened? + self.status == OPEN + end + def pr_status case status when 0 diff --git a/app/services/api/v1/projects/pulls/reopen_service.rb b/app/services/api/v1/projects/pulls/reopen_service.rb new file mode 100644 index 000000000..4250ac35a --- /dev/null +++ b/app/services/api/v1/projects/pulls/reopen_service.rb @@ -0,0 +1,39 @@ +class Api::V1::Projects::Pulls::ReopenService < ApplicationService + include ActiveModel::Model + + attr_reader :project, :pull_request, :issue, :user + + + def initialize(project, pull_request, user) + @project = project + @pull_request = pull_request + @issue = pull_request&.issue + @user = user + end + + def call + raise Error, errors.full_messages.join(", ") unless valid? + if gitea_change_status + @pull_request.update_column(:status, PullRequest::OPEN) + @pull_request&.project_trends&.where(action_type: ProjectTrend::CLOSE).destroy_all + @issue.update_column(:status_id, IssueStatus::ADD) + + return true + else + raise Error, 'gitea change status failed' + end + end + + private + def valid? + return false if @project.blank? || @pull_request.blank? || @issue.blank? || @user.blank? + return false unless @pull_request.closed? + return true + end + + def gitea_change_status + gitea_result = Gitea::PullRequest::ChangeStatusService.call(@project.owner.login, @project.identifier, @pull_request.gitea_number, false, @user&.gitea_token) + return true if gitea_result[:status] == :success + return false + end +end \ No newline at end of file diff --git a/app/services/gitea/pull_request/change_status_service.rb b/app/services/gitea/pull_request/change_status_service.rb new file mode 100644 index 000000000..bc6b9df7c --- /dev/null +++ b/app/services/gitea/pull_request/change_status_service.rb @@ -0,0 +1,38 @@ +# Get a pull request +class Gitea::PullRequest::ChangeStatusService < Gitea::ClientService + attr_reader :owner, :repo, :number, :is_closed, :token + + #eq: + # Gitea::PullRequest::ChangeStatusService.call(user.login, repository.identifier, pull.gitea_number, true, user.gitea_token) + def initialize(owner, repo, number, is_closed, token=nil) + @owner = owner + @repo = repo + @number = number + @is_closed = is_closed + @token = token + end + + def call + response = get(url, request_params, true) + status, message, body = render_response(response) + json_format(status, message, body) + end + + private + + def request_params + Hash.new.merge(token: token, is_closed: is_closed) + end + + def url + "/repos/#{owner}/#{repo}/pulls/#{number}/change_status".freeze + end + + def json_format(status, message, body) + case status + when 204 then success(body) + else + error(message, status) + end + end +end diff --git a/app/views/pull_requests/show.json.jbuilder b/app/views/pull_requests/show.json.jbuilder index 304457f82..d2c928b75 100644 --- a/app/views/pull_requests/show.json.jbuilder +++ b/app/views/pull_requests/show.json.jbuilder @@ -7,6 +7,7 @@ json.commits_count @gitea_pull["commit_num"] json.files_count @gitea_pull["changed_files"] json.comments_count @issue.journals.parent_journals.size json.comments_total_count @issue.get_journals_size +json.can_reopen @pull_request.closed? json.assign_user do json.partial! 'users/user_simple', user: @issue_assign_to end diff --git a/config/routes/api.rb b/config/routes/api.rb index f36d4b949..3d8c8b536 100644 --- a/config/routes/api.rb +++ b/config/routes/api.rb @@ -203,6 +203,7 @@ defaults format: :json do resources :pulls, module: 'pulls' do member do get :files + post :reopen end resources :versions, only: [:index] do member do