diff --git a/app/controllers/issues_controller.rb b/app/controllers/issues_controller.rb index ddb0facdf..efc7d3ea4 100644 --- a/app/controllers/issues_controller.rb +++ b/app/controllers/issues_controller.rb @@ -154,6 +154,8 @@ class IssuesController < ApplicationController Rails.logger.info "[ATME] maybe to at such users: #{@atme_receivers.pluck(:login)}" AtmeService.call(current_user, @atme_receivers, @issue) if @atme_receivers.size > 0 + # 新增时向grimoirelab推送事件 + IssueWebhookJob.set(wait: 5.seconds).perform_later(@issue.id) render json: {status: 0, message: "创建成功", id: @issue.id} else diff --git a/app/jobs/issue_webhook_job.rb b/app/jobs/issue_webhook_job.rb new file mode 100644 index 000000000..b85c7c1e0 --- /dev/null +++ b/app/jobs/issue_webhook_job.rb @@ -0,0 +1,181 @@ +class IssueWebhookJob < ApplicationJob + include ApplicationHelper + queue_as :message + + def perform(issue_id, user_id) + issue = Issue.find_by(id: issue_id) + return if issue.blank? + project = issue.project + user = issue.user + domain = "#{Rails.application.config_for(:configuration)['platform_url']}" + gitea_domain = GiteaService.gitea_config[:domain] + ssh_url = "git@#{gitea_domain.gsub("https://","")}:#{project.owner.login}/#{project.identifier}.git" + event_json = { + "action": "opened", + "number": 1, + "issue": { + "id": 888, + "url": "#{domain}/api/v1/#{project.owner.login}/#{project.identifier}/issues/#{issue.id}", + "html_url": "#{domain}/#{project.owner.login}/#{project.identifier}/issues/#{issue.id}", + "number": 1, + "user": { + "id": user.id, + "login": "#{user.login}", + "full_name": "", + "email": "#{user.mail}", + "avatar_url": "#{domain}/#{url_to_avatar(user)}", + "language": "", + "is_admin": false, + "last_login": "#{user.last_login_on}", + "created": "#{user.created_on}", + "restricted": false, + "active": false, + "prohibit_login": false, + "location": "", + "website": "", + "description": "", + "visibility": "public", + "followers_count": 0, + "following_count": 0, + "starred_repos_count": 0, + "username": "#{user.login}" + }, + "original_author": "", + "original_author_id": 0, + "title": "#{issue.subject}", + "body": "#{issue.description}", + "ref": "", + "labels": [], + "milestone": null, + "assignee": null, + "assignees": null, + "state": "open", + "is_locked": false, + "comments": 0, + "created_at": "#{issue.created_on}", + "updated_at": "#{issue.updated_on}", + "closed_at": null, + "due_date": null, + "pull_request": null, + "repository": { + "id": 11307, + "name": "#{project.identifier}", + "owner": "#{project.owner.login}", + "full_name": "#{project.owner.login}/#{project.identifier}" + } + }, + "repository": { + "id": project.id, + "owner": { + "id": project.owner.id, + "login": "#{project.owner.login}", + "full_name": "", + "email": "#{project.owner.mail}", + "avatar_url": "#{domain}/#{url_to_avatar(project.owner)}", + "language": "", + "is_admin": false, + "last_login": "#{project.owner.last_login_on}", + "created": "#{project.owner.created_on}", + "restricted": false, + "active": false, + "prohibit_login": false, + "location": "", + "website": "", + "description": "", + "visibility": "public", + "followers_count": 0, + "following_count": 0, + "starred_repos_count": 0, + "username": "#{project.owner.login}" + }, + "name": "#{project.identifier}", + "full_name": "#{project.owner.login}/#{project.identifier}", + "description": "", + "empty": false, + "private": false, + "fork": false, + "template": false, + "parent": null, + "mirror": false, + "size": 843, + "html_url": "#{domain}/#{project.owner.login}/#{project.identifier}", + "ssh_url": "#{ssh_url}", + "clone_url": "#{domain}/#{project.owner.login}/#{project.identifier}.git", + "original_url": "#{project.repository.mirror_url}", + "website": "", + "stars_count": 0, + "forks_count": 0, + "watchers_count": 1, + "open_issues_count": 1, + "open_pr_counter": 0, + "release_counter": 0, + "default_branch": "master", + "archived": false, + "created_at": "#{project.created_on}", + "updated_at": "#{project.updated_on}", + "permissions": { + "admin": true, + "push": true, + "pull": true + }, + "has_issues": true, + "internal_tracker": { + "enable_time_tracker": true, + "allow_only_contributors_to_track_time": true, + "enable_issue_dependencies": true + }, + "has_wiki": true, + "has_pull_requests": true, + "has_projects": false, + "ignore_whitespace_conflicts": false, + "allow_merge_commits": true, + "allow_rebase": true, + "allow_rebase_explicit": true, + "allow_squash_merge": true, + "default_merge_style": "merge", + "avatar_url": "", + "internal": false, + "mirror_interval": "" + }, + "sender": { + "id": user.id, + "login": "#{user.login}", + "full_name": "", + "email": "#{user.mail}", + "avatar_url": "#{domain}/#{url_to_avatar(user)}", + "language": "", + "is_admin": false, + "last_login": "#{user.last_login_on}", + "created": "#{user.created_on}", + "restricted": false, + "active": false, + "prohibit_login": false, + "location": "", + "website": "", + "description": "", + "visibility": "public", + "followers_count": 0, + "following_count": 0, + "starred_repos_count": 0, + "username": "#{user.login}" + } + } + + url = URI("http://117.50.185.50:80") + http = Net::HTTP.new(url.host, url.port) + request = Net::HTTP::Post.new(url) + request["Content-Type"] = "application/json" + uuid = SecureRandom.uuid + request['X-GitHub-Delivery'] = uuid + request['X-Gitea-Delivery'] = uuid + request['X-Gogs-Delivery'] = uuid + request['X-GitHub-Event'] = 'issues' + request['X-Gitea-Event'] = 'issues' + request['X-Gogs-Event'] = 'issues' + request.body = JSON.dump(event_json) + + response = http.request(request) + Rails.logger.info "issue webhook event======#{response.read_body}" + end + +end \ No newline at end of file