From 264287d547774ed7b113f56adc28573a480708cd Mon Sep 17 00:00:00 2001 From: "sylor_huang@126.com" Date: Wed, 11 Mar 2020 16:03:52 +0800 Subject: [PATCH] =?UTF-8?q?=E5=90=8C=E6=AD=A5educoder=E5=88=B0forge?= =?UTF-8?q?=E7=9A=84=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/jobs/sync_user_forge_job.rb | 32 +++++++ app/tasks/sync_user_forge_task.rb | 150 ++++++++++++++++++++++++++++++ 2 files changed, 182 insertions(+) create mode 100644 app/jobs/sync_user_forge_job.rb create mode 100644 app/tasks/sync_user_forge_task.rb diff --git a/app/jobs/sync_user_forge_job.rb b/app/jobs/sync_user_forge_job.rb new file mode 100644 index 000000000..0d553750d --- /dev/null +++ b/app/jobs/sync_user_forge_job.rb @@ -0,0 +1,32 @@ +require 'uri' +require 'net/http' + +class SyncUserForgeJob < ApplicationJob + queue_as :default + + def perform(params) + Rails.logger.info("#######____sync_user_to_forge_start__########") + begin + api_host = EduSetting.get('sync_forge_url') + + url = "#{api_host}/api/sync_forge" + sync_json = { + "sync_params": params + } + uri = URI.parse(url) + if api_host + http = Net::HTTP.new(uri.hostname, uri.port) + + if api_host.include?("https://") + http.use_ssl = true + end + + response = http.send_request('POST', uri.path, sync_json.to_json, {'Content-Type' => 'application/json'}) + Rails.logger.info("#######_________response__sync__end_____#########{response.body}") + end + rescue => e + Rails.logger.info("#######____sync_user_to_forge_failed__########{e}") + end + + end +end diff --git a/app/tasks/sync_user_forge_task.rb b/app/tasks/sync_user_forge_task.rb new file mode 100644 index 000000000..0bad79be8 --- /dev/null +++ b/app/tasks/sync_user_forge_task.rb @@ -0,0 +1,150 @@ +#project的includes应该是包括(:versions, :project_score, :repository,:commits, issues: [:journals,:commit_issues]),但是repository表,commits表,commit_issues表没有,trustie上有。 +# +# 运行示例: bundle exec rails runner "SyncUserForgeTask.new.call()" + + +class SyncUserForgeTask + def call + Rails.logger.info("##########_______sync_start________###########") + project_member_user_ids = Member.select(:project_id,:user_id).where.not(project_id: -1).pluck(:user_id) #这个是项目的成员,在用户的项目里已经有了循环 + all_users = User.where.not(id: project_member_user_ids) + # 这里再把所有用户循环 + all_users.find_each do |u| + # u = User.find(36390) 测试的 + user_params = u.as_json + user_extension_params = u.try(:user_extension).as_json || [] + target_params = [] + if u.projects.present? + projects = u.projects.includes(:versions,:project_score,:commits, issues: [:journals,:commit_issues],owner: [:user_extension], members: [roles: [:member_roles]]) + projects.find_each do |p| + member_params = get_members(p.members,p) + project_params = p.as_json + issue_params = get_issues(p, u.id) + versions_params = get_versions(p) + project_score_params = get_scores(p) + pull_request_params = get_prs(p) #pull_request的,但是目前educoder没有pull_request表 + repo_params = get_repository(p) #repository的内容 + relate_project_params = { + project_params: project_params, + member_params: member_params, + issue_params: issue_params, + versions_params: versions_params, + project_score_params: project_score_params, + pull_request_params: pull_request_params, + repo_params: repo_params + } + target_params.push(relate_project_params) + end + end + + roles = Role.all.as_json + sync_params = { + target_params: target_params, + platform: "educoder", + roles: roles, + user_params: {user_params: user_params, user_extension_params: user_extension_params} + } + SyncUserForgeJob.perform_later(sync_params.to_json) + end + end + + + #工单的内容 + def get_issues(project, user_id) + issues_params = [] + issues = project.issues.where(author_id: user_id) + if issues.present? + issues.find_each do |i| + issue_json = i.as_json + jours_params = get_issue_journal(i, user_id) + commit_params = get_issue_commit(i) + issues_params.push( + {issue_params: issue_json, + jours_params: jours_params, + commit_params: commit_params + } + ) + end + end + + issues_params + end + + #里程碑的内容 + def get_versions(project) + versions_params = [] + versions = project.versions + versions.find_each do |i| + versions_params.push(i.as_json) + end + versions_params + end + + #project_score的内容 + def get_scores(project) + project.try(:project_score).as_json || [] + end + + #pull_reqeust的内容,以前为commits表 + def get_prs(project) + pr_params = [] + prs = project.commits + prs.find_each do |i| + pr_params.push(i.as_json) + end + pr_params + end + + + #repository的内容 + def get_repository(project) + repo_params = [] + repo = project.repository + repo_params.push(repo.as_json) if repo.present? + repo_params + end + + def get_issue_journal(issue, user_id) + jour_params = [] + jours = issue.journals.where(user_id: user_id) + if jours.present? + jours.find_each do |j| + jour_params.push(j.as_json) + end + end + + jour_params + end + + def get_issue_commit(issue) + commit_params = [] + commits = issue.commit_issues + if commits.present? + commits.find_each do |j| + commit_params.push(j.as_json) + end + end + commit_params + end + + def get_members(members,project) + member_params = [] + if members.present? + members.find_each do |m| + member_user = m.user.as_json + member_extension = m.user.try(:user_extension).as_json || [] + member_role = m.member_roles.as_json + member_issues = get_issues(project, m.user_id) + get_member = { + member: m.as_json, + member_user: member_user, + member_extension: member_extension, + member_roles: member_role, + member_issues: member_issues + } + member_params.push(get_member) + end + end + member_params + end +end \ No newline at end of file