diff --git a/app/controllers/journals_controller.rb b/app/controllers/journals_controller.rb index 6dc1e29c9..e539ec2cd 100644 --- a/app/controllers/journals_controller.rb +++ b/app/controllers/journals_controller.rb @@ -46,6 +46,7 @@ class JournalsController < ApplicationController end Rails.logger.info "[ATME] maybe to at such users: #{@atme_receivers.pluck(:login)}" AtmeService.call(current_user, @atme_receivers, journal) if @atme_receivers.size > 0 + TouchWebhookJob.perform_later('PullRequestComment', @issue&.id, current_user.id, journal.id) # @issue.project_trends.create(user_id: current_user.id, project_id: @project.id, action_type: "journal") render :json => { status: 0, message: "评论成功", id: journal.id} # normal_status(0, "评论成功") diff --git a/app/jobs/touch_webhook_job.rb b/app/jobs/touch_webhook_job.rb index 9959d2ebc..91155398e 100644 --- a/app/jobs/touch_webhook_job.rb +++ b/app/jobs/touch_webhook_job.rb @@ -10,7 +10,7 @@ class TouchWebhookJob < ApplicationJob return if issue.nil? || sender.nil? issue.project.webhooks.each do |webhook| next unless webhook.events["events"]["issues"] - @webhook_task = Webhook::IssueCreateClient.new(webhook, issue, sender).do_request + @webhook_task = Webhook::EventClient.new(webhook, issue, sender,"issues","issues").do_request Rails.logger.info "Touch Webhook Response result: #{@webhook_task.response_content}" end when 'IssueUpdate' @@ -20,7 +20,70 @@ class TouchWebhookJob < ApplicationJob return if issue.nil? || sender.nil? || !changes.is_a?(Hash) issue.project.webhooks.each do |webhook| next unless webhook.events["events"]["issues"] - @webhook_task = Webhook::IssueUpdateClient.new(webhook, issue, sender, changes.stringify_keys).do_request + @webhook_task = Webhook::EventClient.new(webhook, issue, sender, "issues", "issues",changes.stringify_keys).do_request + Rails.logger.info "Touch Webhook Response result: #{@webhook_task.response_content}" + end + + when 'IssueAssign' + issue_id, sender_id, assigner_ids = args[0], args[1], args[2] + issue = Issue.find_by_id issue_id + sender = User.find_by_id sender_id + return if issue.nil? || sender.nil? + issue.project.webhooks.each do |webhook| + next unless webhook.events["events"]["issue_assign"] + @webhook_task = Webhook::EventClient.new(webhook, issue, sender, "issues", "issue_assign",{assigner_ids: assigner_ids}).do_request + Rails.logger.info "Touch Webhook Response result: #{@webhook_task.response_content}" + end + + when 'IssueLable' + issue_id, sender_id, issue_tag_ids = args[0], args[1], args[2] + issue = Issue.find_by_id issue_id + sender = User.find_by_id sender_id + return if issue.nil? || sender.nil? + issue.project.webhooks.each do |webhook| + next unless webhook.events["events"]["issue_label"] + @webhook_task = Webhook::EventClient.new(webhook, issue, sender, "issues", "issue_label",{issue_tag_ids: issue_tag_ids}).do_request + Rails.logger.info "Touch Webhook Response result: #{@webhook_task.response_content}" + end + + when 'IssueComment' + issue_id, sender_id, comment_id = args[0], args[1], args[2] + issue = Issue.find_by_id issue_id + comment = issue.comment_journals.find_by_id comment_id + sender = User.find_by_id sender_id + return if issue.nil? || sender.nil? || comment.nil? + + changes = { + id: comment.id, + user: comment.user.to_builder.target!, + body: comment.notes, + created_on: comment.created_on, + updated_on: comment.updated_on, + } + + issue.project.webhooks.each do |webhook| + next unless webhook.events["events"]["issue_comment"] + @webhook_task = Webhook::EventClient.new(webhook, issue, sender, "issue_comment", "issue_comment",changes.stringify_keys).do_request + Rails.logger.info "Touch Webhook Response result: #{@webhook_task.response_content}" + end + + when 'PullRequestComment' + issue_id, sender_id, comment_id = args[0], args[1], args[2] + issue = Issue.find_by_id issue_id + comment = issue.comment_journals.find_by_id comment_id + sender = User.find_by_id sender_id + return if issue.nil? || sender.nil? || comment.nil? + + changes = { + id: comment.id, + user: comment.user.to_builder.target!, + body: comment.notes, + created_on: comment.created_on, + updated_on: comment.updated_on, + } + issue.project.webhooks.each do |webhook| + next unless webhook.events["events"]["pull_request_comment"] + @webhook_task = Webhook::EventClient.new(webhook, issue, sender, "issue_comment", "pull_request_comment",changes.stringify_keys).do_request Rails.logger.info "Touch Webhook Response result: #{@webhook_task.response_content}" end end diff --git a/app/services/api/v1/issues/create_service.rb b/app/services/api/v1/issues/create_service.rb index 7080c3bda..b0b1b05b0 100644 --- a/app/services/api/v1/issues/create_service.rb +++ b/app/services/api/v1/issues/create_service.rb @@ -70,7 +70,8 @@ class Api::V1::Issues::CreateService < ApplicationService # 触发webhook TouchWebhookJob.perform_later('IssueCreate', @created_issue&.id, current_user.id) - + TouchWebhookJob.perform_later('IssueLable', @created_issue&.id, issue_tag_ids) + TouchWebhookJob.perform_later('IssueAssign', @created_issue&.id, assigner_ids) unlock("Api::V1::Issues::CreateService:#{project.id}") # 结束写数据,解锁 end diff --git a/app/services/api/v1/issues/journals/create_service.rb b/app/services/api/v1/issues/journals/create_service.rb index dce00349b..568deecdd 100644 --- a/app/services/api/v1/issues/journals/create_service.rb +++ b/app/services/api/v1/issues/journals/create_service.rb @@ -41,7 +41,7 @@ class Api::V1::Issues::Journals::CreateService < ApplicationService # @信息发送 AtmeService.call(current_user, @atme_receivers, @created_journal) unless receivers_login.blank? - + TouchWebhookJob.perform_later('IssueComment', @issue&.id, @current_user.id, @created_journal.id) unlock("Api::V1::Issues::Journals::CreateService:#{@issue.id}") @created_journal diff --git a/app/services/api/v1/issues/update_service.rb b/app/services/api/v1/issues/update_service.rb index 21242edc2..153ea32e0 100644 --- a/app/services/api/v1/issues/update_service.rb +++ b/app/services/api/v1/issues/update_service.rb @@ -79,7 +79,8 @@ class Api::V1::Issues::UpdateService < ApplicationService # 触发webhook TouchWebhookJob.perform_later('IssueCreate', @updated_issue&.id, current_user.id, previous_issue_changes) - + TouchWebhookJob.perform_later('IssueLable', @updated_issue&.id, issue_tag_ids) + TouchWebhookJob.perform_later('IssueAssign', @updated_issue&.id, assigner_ids) unlock("Api::V1::Issues::UpdateService:#{project.id}:#{issue.id}") return @updated_issue diff --git a/app/services/webhook/event_client .rb b/app/services/webhook/event_client .rb new file mode 100644 index 000000000..28e473be5 --- /dev/null +++ b/app/services/webhook/event_client .rb @@ -0,0 +1,130 @@ +class Webhook::EventClient + + include Webhook::Client + + attr_accessor :webhook, :issue, :sender + attr_accessor :webhook_task + + def initialize(webhook, issue, sender, event, event_type, changes={}) + @webhook = webhook + @issue = issue + @sender = sender + @event = event + @event_type = event_type + @changes = changes + # 创建webhook task + @webhook_task = Gitea::WebhookTask.create( + hook_id: @webhook.id, + uuid: SecureRandom.uuid, + payload_content: payload_content, + event_type: @event_type, + is_delivered: true + ) + + # 构建client参数 + super({ + uuid: @webhook_task.uuid, + event: @event, + http_method: @webhook.http_method, + content_type: @webhook.content_type, + url: @webhook.url, + secret: @webhook.secret, + payload_content: @webhook_task.read_attribute_before_type_cast("payload_content") + }) + end + + def do_request + request_content, response_content = super + @webhook_task.update_attributes({ + delivered: Time.now.to_i * 1000000000, + is_succeed: response_content["status"] < 300, + request_content: request_content, + response_content: response_content + }) + + @webhook_task + end + + def payload_content + case @event_type + when "issues" + issue_payload_content + when "issue_assign" + issue_assign_payload_content + when "issue_label" + issue_label_payload_content + when "issue_comment" + issue_comment_payload_content + when "pull_request_comment" + pull_request_comment_payload_content + end + end + + def issue_payload_content + if @changes.blank? + { + "action": "opened", + "number": @issue.project_issues_index, + "issue": JSON.parse(@issue.to_builder.target!), + "project": JSON.parse(@issue.project.to_builder.target!), + "sender": JSON.parse(@sender.to_builder.target!) + } + else + { + "action": "edited", + "number": @issue.project_issues_index, + "changes": @changes, + "issue": JSON.parse(@issue.to_builder.target!), + "project": JSON.parse(@issue.project.to_builder.target!), + "sender": JSON.parse(@sender.to_builder.target!) + } + end + end + + def issue_assign_payload_content + { + "action": @changes["assigner_ids"].blank? ? "unassigned" : "assigned", + "number": @issue.project_issues_index, + "issue": JSON.parse(@issue.to_builder.target!), + "assignees": @issue.assignees.map(&:to_builder.target!), + "project": JSON.parse(@issue.project.to_builder.target!), + "sender": JSON.parse(@sender.to_builder.target!) + } + end + + def issue_label_payload_content + { + "action": @changes["issue_tag_ids"].blank? ? "label_cleared" : "label_updated", + "number": @issue.project_issues_index, + "issue": JSON.parse(@issue.to_builder.target!), + "project": JSON.parse(@issue.project.to_builder.target!), + "sender": JSON.parse(@sender.to_builder.target!) + } + end + + def issue_comment_payload_content + { + "action": "created", + "number": @issue.project_issues_index, + "issue": JSON.parse(@issue.to_builder.target!), + "comment": @changes, + "project": JSON.parse(@issue.project.to_builder.target!), + "sender": JSON.parse(@sender.to_builder.target!) + } + end + + def pull_request_comment_payload_content + { + "action": "created", + "number": @issue.project_issues_index, + "issue": JSON.parse(@issue.to_builder.target!), + "comment": @changes, + "project": JSON.parse(@issue.project.to_builder.target!), + "sender": JSON.parse(@sender.to_builder.target!) + } + end + + + + +end \ No newline at end of file