diff --git a/app/tasks/sync_user_forge_task.rb b/app/tasks/sync_user_forge_task.rb new file mode 100644 index 000000000..58fd203ef --- /dev/null +++ b/app/tasks/sync_user_forge_task.rb @@ -0,0 +1,160 @@ +#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________###########") + all_users = User.where("login is not null and id = ?",25728) + # 这里再把所有用户循环 + all_users.find_each do |u| + # u = User.find(36390) 测试的 + user_params = u.as_json + user_extension_params = u.try(:user_extensions).as_json || [] + target_params = [] + if u.projects.present? + projects = u.projects.includes(:versions,:project_score, issues: [:journals],owner: [:user_extensions], 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.id) + repo_params = get_repository(p) #repository的内容 + commit_params = get_commits(p.id) + 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, + commit_params: commit_params + } + target_params.push(relate_project_params) + end + end + + roles = Role.all.as_json + sync_params = { + target_params: target_params, + platform: "trustie", + roles: roles, + user_params: {user_params: user_params, user_extension_params: user_extension_params} + } + SyncUserForgeJob.new.perform(sync_params.to_json) + # Delayed::Job.enqueue(SyncUserForgeJob.new(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 + + def get_prs(project_id) + pr_params = [] + prs = PullRequest.where(project_id: project_id) + prs.find_each do |i| + pr_params.push(i.as_json) + end + pr_params + end + + def get_commits(project_id) + pr_params = [] + prs = Commit.where(project_id: project_id) + 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 = CommitIssues.where(issue_id: issue.id) + 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_extensions).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 diff --git a/lib/sync_user_forge_job.rb b/lib/sync_user_forge_job.rb new file mode 100644 index 000000000..12ecbde56 --- /dev/null +++ b/lib/sync_user_forge_job.rb @@ -0,0 +1,39 @@ + + +class SyncUserForgeJob + require 'uri' + require 'net/http' + + # def initialize(params) + # @params = params + # end + + def perform(params) + Rails.logger.info("#######____sync_user_to_forge_start__########") + begin + api_host = "#{Redmine::Configuration['sync_forge_url']}" + url = "http://127.0.0.1:3000/api/sync_forge" + Rails.logger.info("#######_________response__sync__url_____#########{url}") + + sync_json = { + "sync_params": params + } + Rails.logger.info("#######_________response__sync_json_____#########{sync_json}") + + 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