diff --git a/app/controllers/pull_requests_controller.rb b/app/controllers/pull_requests_controller.rb index 5a6742037..6f3ca4d34 100644 --- a/app/controllers/pull_requests_controller.rb +++ b/app/controllers/pull_requests_controller.rb @@ -127,6 +127,18 @@ class PullRequestsController < ApplicationController return normal_status(-1, "请输入正确的标记。") end end + if params[:attached_issue_ids].present? + if params[:attached_issue_ids].is_a?(Array) && params[:attached_issue_ids].size > 1 + return normal_status(-1, "最多只能关联一个疑修。") + elsif params[:attached_issue_ids].is_a?(Array) && params[:attached_issue_ids].size == 1 + @pull_request&.pull_attached_issues&.destroy_all + params[:attached_issue_ids].each do |issue| + PullAttachedIssue.create!(issue_id: issue, pull_request_id: @pull_request.id) + end + else + return normal_status(-1, "请输入正确的疑修。") + end + end if params[:status_id].to_i == 5 @issue.issue_times.update_all(end_time: Time.now) end @@ -214,35 +226,15 @@ class PullRequestsController < ApplicationController push_activity_2_blockchain("pull_request_merge", @pull_request) # 查看是否fix了相关issue,如果fix就转账 - if params["fix_issue_id"].nil? || params["fix_issue_id"] == "" - else - issue = Issue.find_by(id: params["fix_issue_id"]) - if issue.nil? - normal_status(-1, "关联issue失败") - raise ActiveRecord::Rollback - else - token_num = issue.blockchain_token_num - token_num = token_num.nil? ? 0 : token_num - owner = User.find_by(login: params["owner"]) - pr = PullRequest.find_by(id: params["pull_request"]["id"]) - if owner.nil? || pr.nil? - normal_status(-1, "关联issue失败") - raise ActiveRecord::Rollback - else - project = Project.find_by(user_id: owner.id, identifier: params["project_id"]) - if project.nil? - normal_status(-1, "关联issue失败") - raise ActiveRecord::Rollback - else - author_id = pr.user_id - if token_num > 0 - Blockchain::FixIssue.call({user_id: author_id.to_s, project_id: project.id.to_s, token_num: token_num}) - end - # update issue to state 5 - issue.update(status_id: 5) - end - end + @pull_request.attached_issues.each do |issue| + token_num = issue.blockchain_token_num + token_num = token_num.nil? ? 0 : token_num + author_id = @pull_request.user_id + if token_num > 0 + Blockchain::FixIssue.call({user_id: author_id.to_s, project_id: project.id.to_s, token_num: token_num}) end + # update issue to state 5 + issue.update(status_id: 5) end # 合并请求下issue处理为关闭 diff --git a/app/models/issue.rb b/app/models/issue.rb index 9c61f3ec3..0fb5291e0 100644 --- a/app/models/issue.rb +++ b/app/models/issue.rb @@ -79,6 +79,8 @@ class Issue < ApplicationRecord has_many :comment_journals, -> {where.not(notes: nil)}, class_name: "Journal", :as => :journalized has_many :operate_journals, -> {where(notes: nil)}, class_name: "Journal", :as => :journalized + has_many :pull_attached_issues, dependent: :destroy + has_many :attach_pull_requests, through: :pull_attached_issues, source: :pull_request scope :issue_includes, ->{includes(:user)} scope :issue_many_includes, ->{includes(journals: :user)} diff --git a/app/models/pull_attached_issue.rb b/app/models/pull_attached_issue.rb new file mode 100644 index 000000000..c93a95d65 --- /dev/null +++ b/app/models/pull_attached_issue.rb @@ -0,0 +1,22 @@ +# == Schema Information +# +# Table name: pull_attached_issues +# +# id :integer not null, primary key +# pull_request_id :integer +# issue_id :integer +# created_at :datetime not null +# updated_at :datetime not null +# +# Indexes +# +# index_pull_attached_issues_on_issue_id (issue_id) +# index_pull_attached_issues_on_pull_request_id (pull_request_id) +# + +class PullAttachedIssue < ApplicationRecord + + belongs_to :pull_request + belongs_to :issue + +end diff --git a/app/models/pull_request.rb b/app/models/pull_request.rb index 270e7dc76..648912f5a 100644 --- a/app/models/pull_request.rb +++ b/app/models/pull_request.rb @@ -44,6 +44,8 @@ class PullRequest < ApplicationRecord has_many :pull_requests_reviewers, dependent: :destroy has_many :reviewers, through: :pull_requests_reviewers has_many :mark_files, dependent: :destroy + has_many :pull_attached_issues, dependent: :destroy + has_many :attached_issues, through: :pull_attached_issues, source: :issue scope :merged_and_closed, ->{where.not(status: 0)} scope :opening, -> {where(status: 0)} diff --git a/app/services/pull_requests/create_service.rb b/app/services/pull_requests/create_service.rb index 258d0e31b..c2c6cfb22 100644 --- a/app/services/pull_requests/create_service.rb +++ b/app/services/pull_requests/create_service.rb @@ -20,6 +20,7 @@ class PullRequests::CreateService < ApplicationService save_tiding! save_project_trend! save_custom_journal_detail! + save_pull_attached_issues! end [pull_request, gitea_pull_request] @@ -111,6 +112,20 @@ class PullRequests::CreateService < ApplicationService end end + def save_pull_attached_issues! + if attached_issue_ids.size > 1 + raise "最多只能关联一个疑修。" + else + attached_issue_ids.each do |issue| + PullAttachedIssue.create!(issue_id: issue, pull_request_id: pull_request&.id) + end + end + end + + def issue_tag_ids + Array(@params[:attached_issue_ids]) + end + def gitea_pull_request @gitea_pull_request ||= create_gitea_pull_request! end diff --git a/db/migrate/20230302063013_create_pull_attached_issues.rb b/db/migrate/20230302063013_create_pull_attached_issues.rb new file mode 100644 index 000000000..c3b4f6528 --- /dev/null +++ b/db/migrate/20230302063013_create_pull_attached_issues.rb @@ -0,0 +1,10 @@ +class CreatePullAttachedIssues < ActiveRecord::Migration[5.2] + def change + create_table :pull_attached_issues do |t| + t.references :pull_request + t.references :issue + + t.timestamps + end + end +end