From 6d399fe8d5c390bd6131b793e53f8da1e6ff2a49 Mon Sep 17 00:00:00 2001 From: nigel007 <609441862@qq.com> Date: Thu, 13 May 2021 22:27:25 +0800 Subject: [PATCH] =?UTF-8?q?add=20=E5=AD=98=E8=AF=81=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/application_controller.rb | 509 +++++++++++++++----- app/controllers/issues_controller.rb | 19 +- app/controllers/pull_requests_controller.rb | 47 +- app/controllers/users_controller.rb | 14 + config/routes.rb | 1 + 5 files changed, 446 insertions(+), 144 deletions(-) diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 3d2e721b..f144f648 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -889,6 +889,304 @@ class ApplicationController < ActionController::Base # author: zxh # blockchain相关项目活动调用函数 # return true: 表示上链操作成功; return false: 表示上链操作失败 + # 北大数瑞的被注释掉 + #def push_activity_2_blockchain(activity_type, model) + # if activity_type == "issue_create" + # + # project_id = model['project_id'] + # project = Project.find(project_id) + # if project['use_blockchain'] == 0 + # # 无需执行上链操作 + # return true + # end + # + # id = model['id'] + # + # owner_id = project['user_id'] + # owner = User.find(owner_id) + # ownername = owner['login'] + # reponame = project['name'] + # + # author_id = project['user_id'] + # author = User.find(author_id) + # username = author['login'] + # + # action = 'opened' + # + # title = model['subject'] + # content = model['description'] + # created_at = model['created_on'] + # updated_at = model['updated_on'] + # + # # 调用区块链接口 + # param = { + # "action": "executeContract", + # "contractID": "RepositoryDB1", + # "operation": "putIssue", + # "arg": { + # "issue_id": id, + # "repo_id": project_id, + # "reponame": reponame, + # "ownername": ownername, + # "username": username, + # "action": action, + # "title": title, + # "content": content, + # "created_at": created_at, + # "updated_at": updated_at + # }.to_json + # }.to_json + # success_blockchain = invoke_blockchain_api(Blockchain.blockchain_config[:api_url], param) + # return success_blockchain + # + # elsif activity_type == "issue_comment_create" + # issue_comment_id = model['id'] + # issue_id = model['journalized_id'] + # parent_id = model['parent_id'].nil? ? "" : model['parent_id'] + # + # issue = Issue.find(issue_id) + # issue_classify = issue['issue_classify'] # issue或pull_request + # project_id = issue['project_id'] + # project = Project.find(project_id) + # + # if project['use_blockchain'] == 0 + # # 无需执行上链操作 + # return true + # end + # + # reponame = project['name'] + # owner_id = project['user_id'] + # owner = User.find(owner_id) + # ownername = owner['login'] + # + # author_id = model['user_id'] + # author = User.find(author_id) + # username = author['login'] + # + # action = 'created' + # + # content = model['notes'] + # created_at = model['created_on'] + # + # if issue_classify == "issue" + # param = { + # "action": "executeContract", + # "contractID": "RepositoryDB1", + # "operation": "putIssueComment", + # "arg": { + # "issue_comment_id": issue_comment_id, + # "issue_id": issue_id, + # "parent_id": parent_id, + # "reponame": reponame, + # "ownername": ownername, + # "username": username, + # "action": action, + # "content": content, + # "created_at": created_at, + # }.to_json + # }.to_json + # elsif issue_classify == "pull_request" + # param = { + # "action": "executeContract", + # "contractID": "RepositoryDB0", + # "operation": "putPullRequestComment", + # "arg": { + # "pull_request_comment_id": issue_comment_id, + # "pull_request_id": issue_id, + # "parent_id": parent_id, + # "reponame": reponame, + # "ownername": ownername, + # "username": username, + # "action": action, + # "content": content, + # "created_at": created_at, + # }.to_json + # }.to_json + # end + # + # # 调用区块链接口 + # success_blockchain = invoke_blockchain_api(Blockchain.blockchain_config[:api_url], param) + # return success_blockchain + # elsif activity_type == "pull_request_create" + # # 调用区块链接口 + # project_id = model['project_id'] + # project = Project.find(project_id) + # if project['use_blockchain'] == 0 + # # 无需执行上链操作 + # return true + # end + # + # pull_request_id = model['id'] + # reponame = project['name'] + # owner_id = project['user_id'] + # owner = User.find(owner_id) + # ownername = owner['login'] + # + # action = 'opened' + # + # title = model['title'] + # content = model['body'] + # + # source_branch = model['head'] + # source_repo_id = model['fork_project_id'].nil? ? project_id : model['fork_project_id'] + # + # target_branch = model['base'] + # target_repo_id = project_id + # + # author_id = model['user_id'] + # author = User.find(author_id) + # username = author['login'] + # + # created_at = model['created_at'] + # updated_at = model['updated_at'] + # + # # 查询pull request对应的commit信息 + # commits = Gitea::PullRequest::CommitsService.call(ownername, reponame, model['gpid']) + # commit_shas = [] + # commits.each do |c| + # commit_shas << c["Sha"] + # end + # param = { + # "action": "executeContract", + # "contractID": "RepositoryDB0", + # "operation": "putPullRequest", + # "arg": { + # "pull_request_id": pull_request_id, + # "repo_id": project_id, + # "ownername": ownername, + # "reponame": reponame, + # "username": username, + # "action": action, + # "title": title, + # "content": content, + # "source_branch": source_branch, + # "target_branch": target_branch, + # "commit_shas": commit_shas, + # "created_at": created_at, + # "updated_at": updated_at + # }.to_json + # }.to_json + # success_blockchain = invoke_blockchain_api(Blockchain.blockchain_config[:api_url], param) + # return success_blockchain + # elsif activity_type == "pull_request_merge" + # + # # 调用区块链接口 + # project_id = model['project_id'] + # project = Project.find(project_id) + # if project['use_blockchain'] == 0 + # # 无需执行上链操作 + # return true + # end + # + # pull_request_id = model['id'] + # reponame = project['name'] + # owner_id = project['user_id'] + # owner = User.find(owner_id) + # ownername = owner['login'] + # + # action = 'merged' + # + # # 查询pull request对应的commit信息 + # commits = Gitea::PullRequest::CommitsService.call(ownername, reponame, model['gpid']) + # commit_shas = [] + # commits.each do |c| + # commit_shas << c["Sha"] + # end + # + # # 将pull request相关信息写入链上 + # param = { + # "action": "executeContract", + # "contractID": "RepositoryDB0", + # "operation": "putPullRequest", + # "arg": { + # "pull_request_id": pull_request_id, + # "repo_id": project_id, + # "ownername": ownername, + # "reponame": reponame, + # "username": username, + # "action": action, + # "title": title, + # "content": content, + # "source_branch": source_branch, + # "target_branch": target_branch, + # "commit_shas": commit_shas, + # "created_at": created_at, + # "updated_at": updated_at + # }.to_json + # }.to_json + # success_blockchain = invoke_blockchain_api(Blockchain.blockchain_config[:api_url], param) + # + # + # # 将commit相关信息写入链上 + # commit_shas.each do |commit_sha| + # commit_diff = Gitea::Commit::DiffService.call(ownername, reponame, commit_sha) + # commit = Gitea::Commit::InfoService.call(ownername, reponame, commit_sha) + # param = { + # "action": "executeContract", + # "contractID": "RepositoryDB1", + # "operation": "putCommit", + # "arg": { + # "commit_hash": commit_sha, + # "repo_id": project_id, + # "author": commit['author']['login'], + # "author_email": commit['author']['email'], + # "committer": commit['committer']['login'], + # "committer_email": commit['committer']['email'], + # "author_time": commit['commit']['author']['date'], + # "committer_time": commit['commit']['committer']['date'], + # "message": commit['commit']['message'], + # "diff": commit_diff['Files'] + # }.to_json + # }.to_json + # success_blockchain_commit = invoke_blockchain_api(Blockchain.blockchain_config[:api_url], param) + # success_blockchain = success_blockchain & success_blockchain_commit + # end + # return success_blockchain + # + # elsif activity_type == "pull_request_refuse" + # + # # 调用区块链接口 + # project_id = model['project_id'] + # project = Project.find(project_id) + # if project['use_blockchain'] == 0 + # # 无需执行上链操作 + # return true + # end + # + # pull_request_id = model['id'] + # reponame = project['name'] + # owner_id = project['user_id'] + # owner = User.find(owner_id) + # ownername = owner['login'] + # + # action = 'refused' + # + # # 将pull request相关信息写入链上 + # param = { + # "action": "executeContract", + # "contractID": "RepositoryDB0", + # "operation": "putPullRequest", + # "arg": { + # "pull_request_id": pull_request_id, + # "repo_id": project_id, + # "ownername": ownername, + # "reponame": reponame, + # "username": username, + # "action": action, + # "title": title, + # "content": content, + # "source_branch": source_branch, + # "target_branch": target_branch, + # "created_at": created_at, + # "updated_at": updated_at + # }.to_json + # }.to_json + # success_blockchain = invoke_blockchain_api(Blockchain.blockchain_config[:api_url], param) + # return success_blockchain + # end + #end + + def push_activity_2_blockchain(activity_type, model) if activity_type == "issue_create" @@ -919,21 +1217,18 @@ class ApplicationController < ActionController::Base # 调用区块链接口 param = { - "action": "executeContract", - "contractID": "RepositoryDB1", - "operation": "putIssue", - "arg": { - "issue_id": id, - "repo_id": project_id, - "reponame": reponame, - "ownername": ownername, - "username": username, - "action": action, - "title": title, - "content": content, - "created_at": created_at, - "updated_at": updated_at - }.to_json + "request-type": "upload issue info", + "issue_id": "trustie-" + id.to_s, + "repo_id": "trustie-" + project_id.to_s, + "issue_number": 0, # 暂时不需要改字段 + "reponame": reponame, + "ownername": ownername, + "username": username, + "action": action, + "title": title, + "content": content, + "created_at": created_at, + "updated_at": updated_at }.to_json success_blockchain = invoke_blockchain_api(Blockchain.blockchain_config[:api_url], param) return success_blockchain @@ -969,37 +1264,35 @@ class ApplicationController < ActionController::Base if issue_classify == "issue" param = { - "action": "executeContract", - "contractID": "RepositoryDB1", - "operation": "putIssueComment", - "arg": { - "issue_comment_id": issue_comment_id, - "issue_id": issue_id, - "parent_id": parent_id, - "reponame": reponame, - "ownername": ownername, - "username": username, - "action": action, - "content": content, - "created_at": created_at, - }.to_json + "request-type": "upload issue comment info", + "issue_comment_id": "trustie-" + issue_comment_id.to_s, + "issue_comment_number": 0, # 暂时不需要 + "issue_number": 0, # 暂时不需要 + "issue_id": "trustie-" + issue_id.to_s, + "repo_id": "trustie-" + project.id.to_s, + "parent_id": parent_id.to_s, + "reponame": reponame, + "ownername": ownername, + "username": username, + "action": action, + "content": content, + "created_at": created_at, }.to_json elsif issue_classify == "pull_request" param = { - "action": "executeContract", - "contractID": "RepositoryDB0", - "operation": "putPullRequestComment", - "arg": { - "pull_request_comment_id": issue_comment_id, - "pull_request_id": issue_id, - "parent_id": parent_id, - "reponame": reponame, - "ownername": ownername, - "username": username, - "action": action, - "content": content, - "created_at": created_at, - }.to_json + "request-type": "upload pull request comment info", + "pull_request_comment_id": "trustie-" + issue_comment_id.to_s, + "pull_request_comment_number": 0, # 不考虑该字段 + "pull_request_number": 0, # 不考虑该字段 + "pull_request_id": "trustie-" + issue_id.to_s, + "parent_id": parent_id.to_s, + "repo_id": "trustie-" + project.id.to_s, + "reponame": reponame, + "ownername": ownername, + "username": username, + "action": action, + "content": content, + "created_at": created_at, }.to_json end @@ -1046,24 +1339,23 @@ class ApplicationController < ActionController::Base commit_shas << c["Sha"] end param = { - "action": "executeContract", - "contractID": "RepositoryDB0", - "operation": "putPullRequest", - "arg": { - "pull_request_id": pull_request_id, - "repo_id": project_id, - "ownername": ownername, - "reponame": reponame, - "username": username, - "action": action, - "title": title, - "content": content, - "source_branch": source_branch, - "target_branch": target_branch, - "commit_shas": commit_shas, - "created_at": created_at, - "updated_at": updated_at - }.to_json + "request-type": "upload pull request info", + "pull_request_id": "trustie-" + pull_request_id.to_s, + "pull_request_number": 0, # trustie没有该字段 + "repo_id": "trustie-" + project_id.to_s, + "ownername": ownername, + "reponame": reponame, + "username": username, + "action": action, + "title": title, + "content": content, + "source_branch": source_branch, + "target_branch": target_branch, + "reviewers": [], # trustie没有该字段 + "commit_shas": commit_shas, + "merge_user": "", # trustie没有该字段 + "created_at": created_at, + "updated_at": updated_at }.to_json success_blockchain = invoke_blockchain_api(Blockchain.blockchain_config[:api_url], param) return success_blockchain @@ -1094,24 +1386,23 @@ class ApplicationController < ActionController::Base # 将pull request相关信息写入链上 param = { - "action": "executeContract", - "contractID": "RepositoryDB0", - "operation": "putPullRequest", - "arg": { - "pull_request_id": pull_request_id, - "repo_id": project_id, - "ownername": ownername, - "reponame": reponame, - "username": username, - "action": action, - "title": title, - "content": content, - "source_branch": source_branch, - "target_branch": target_branch, - "commit_shas": commit_shas, - "created_at": created_at, - "updated_at": updated_at - }.to_json + "request-type": "upload pull request info", + "pull_request_id": "trustie-" + pull_request_id.to_s, + "pull_request_number": 0, # trustie没有该字段 + "repo_id": "trustie-" + project_id.to_s, + "ownername": ownername, + "reponame": reponame, + "username": username, + "action": action, + "title": title, + "content": content, + "source_branch": source_branch, + "target_branch": target_branch, + "reviewers": [], # trustie没有该字段 + "commit_shas": commit_shas, + "merge_user": "", # trustie没有该字段 + "created_at": created_at, + "updated_at": updated_at }.to_json success_blockchain = invoke_blockchain_api(Blockchain.blockchain_config[:api_url], param) @@ -1121,21 +1412,17 @@ class ApplicationController < ActionController::Base commit_diff = Gitea::Commit::DiffService.call(ownername, reponame, commit_sha) commit = Gitea::Commit::InfoService.call(ownername, reponame, commit_sha) param = { - "action": "executeContract", - "contractID": "RepositoryDB1", - "operation": "putCommit", - "arg": { - "commit_hash": commit_sha, - "repo_id": project_id, - "author": commit['author']['login'], - "author_email": commit['author']['email'], - "committer": commit['committer']['login'], - "committer_email": commit['committer']['email'], - "author_time": commit['commit']['author']['date'], - "committer_time": commit['commit']['committer']['date'], - "message": commit['commit']['message'], - "diff": commit_diff['Files'] - }.to_json + "request-type": "upload commit info", + "commit_hash": commit_sha, + "repo_id": "trustie-" + project_id.to_s, + "author": commit['author']['login'], + "author_email": commit['author']['email'], + "committer": commit['committer']['login'], + "committer_email": commit['committer']['email'], + "author_time": commit['commit']['author']['date'], + "committer_time": commit['commit']['committer']['date'], + "content": commit['commit']['message'], + "commit_diff": commit_diff['Files'].to_s }.to_json success_blockchain_commit = invoke_blockchain_api(Blockchain.blockchain_config[:api_url], param) success_blockchain = success_blockchain & success_blockchain_commit @@ -1162,23 +1449,23 @@ class ApplicationController < ActionController::Base # 将pull request相关信息写入链上 param = { - "action": "executeContract", - "contractID": "RepositoryDB0", - "operation": "putPullRequest", - "arg": { - "pull_request_id": pull_request_id, - "repo_id": project_id, - "ownername": ownername, - "reponame": reponame, - "username": username, - "action": action, - "title": title, - "content": content, - "source_branch": source_branch, - "target_branch": target_branch, - "created_at": created_at, - "updated_at": updated_at - }.to_json + "request-type": "upload pull request info", + "pull_request_id": "trustie-" + pull_request_id.to_s, + "pull_request_number": 0, # trustie没有该字段 + "repo_id": "trustie-" + project_id.to_s, + "ownername": ownername, + "reponame": reponame, + "username": username, + "action": action, + "title": title, + "content": content, + "source_branch": source_branch, + "target_branch": target_branch, + "reviewers": [], # trustie没有该字段 + "commit_shas": commit_shas, + "merge_user": "", # trustie没有该字段 + "created_at": created_at, + "updated_at": updated_at }.to_json success_blockchain = invoke_blockchain_api(Blockchain.blockchain_config[:api_url], param) return success_blockchain diff --git a/app/controllers/issues_controller.rb b/app/controllers/issues_controller.rb index 81603d59..8588a0c8 100644 --- a/app/controllers/issues_controller.rb +++ b/app/controllers/issues_controller.rb @@ -143,17 +143,16 @@ class IssuesController < ApplicationController raise ActiveRecord::Rollback else end - render json: {status: 0, message: "创建成功", id: @issue.id} - # 调用上链API - #success_blockchain = push_activity_2_blockchain("issue_create", @issue) - #if success_blockchain == false - # normal_status(-1, "创建失败") - # raise ActiveRecord::Rollback - #else - # render json: {status: 0, message: "创建成功", id: @issue.id} - #end + #render json: {status: 0, message: "创建成功", id: @issue.id} + # 调用上链API存证 + success_blockchain = push_activity_2_blockchain("issue_create", @issue) + if success_blockchain == false + normal_status(-1, "创建失败") + raise ActiveRecord::Rollback + else + render json: {status: 0, message: "创建成功", id: @issue.id} + end - render json: {status: 0, message: "创建成", id: @issue.id} else normal_status(-1, "创建失败") end diff --git a/app/controllers/pull_requests_controller.rb b/app/controllers/pull_requests_controller.rb index ba003000..9ab5b8f3 100644 --- a/app/controllers/pull_requests_controller.rb +++ b/app/controllers/pull_requests_controller.rb @@ -58,14 +58,13 @@ class PullRequestsController < ApplicationController # author: zxh # 调用上链API - #success_blockchain = push_activity_2_blockchain("pull_request_create", @pull_request) - #if success_blockchain == false - # render_error("create pull request error: cannot save to blockchain") - # raise ActiveRecord::Rollback - #else - # render_ok - #end - render_ok + success_blockchain = push_activity_2_blockchain("pull_request_create", @pull_request) + if success_blockchain == false + render_error("create pull request error: cannot save to blockchain") + raise ActiveRecord::Rollback + else + render_ok + end else render_error("create pull request error: #{@gitea_pull_request[:status]}") @@ -135,13 +134,12 @@ class PullRequestsController < ApplicationController colsed === true ? normal_status(1, "已拒绝") : normal_status(-1, '合并失败') # author: zxh # 调用上链API - #success_blockchain = push_activity_2_blockchain("pull_request_refuse", @pull_request) - #if success_blockchain == false - # normal_status(-1, "拒绝失败") - # raise ActiveRecord::Rollback - #else - # normal_status(1, "已拒绝") - #end + success_blockchain = push_activity_2_blockchain("pull_request_refuse", @pull_request) + if success_blockchain == false + normal_status(-1, "拒绝失败") + raise ActiveRecord::Rollback + else + end rescue => e normal_status(-1, e.message) raise ActiveRecord::Rollback @@ -175,14 +173,13 @@ class PullRequestsController < ApplicationController # author: zxh # 调用上链API - #success_blockchain = push_activity_2_blockchain("pull_request_merge", @pull_request) - #if success_blockchain == false - # normal_status(-1, "合并失败") - # raise ActiveRecord::Rollback - #else - # normal_status(1, "合并成功") - #end - # + success_blockchain = push_activity_2_blockchain("pull_request_merge", @pull_request) + if success_blockchain == false + normal_status(-1, "合并失败") + raise ActiveRecord::Rollback + else + end + # 查看是否fix了相关issue,如果fix就转账 if params["fix_issue_id"].nil? || params["fix_issue_id"] == "" @@ -190,6 +187,7 @@ class PullRequestsController < ApplicationController 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 @@ -197,15 +195,18 @@ class PullRequestsController < ApplicationController 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, name: params["project_id"]) if project.nil? normal_status(-1, "关联issue失败") + raise ActiveRecord::Rollback else author_id = pr.user_id result = Blockchain::FixIssue.call({user_id: author_id.to_s, project_id: project.id.to_s, token_num: token_num}) if result == false normal_status(-1, "关联issue失败") + raise ActiveRecord::Rollback else # update issue to state 5 issue.update(status_id: 5) diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index 85726c62..77cb5f01 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -459,6 +459,20 @@ class UsersController < ApplicationController render json: {"blockchain_token_num": issue.blockchain_token_num} end + + def blockchain_get_unclosed_issue_list + ownername = params["ownername"] + reponame = params["reponame"] + owner = User.find_by(login: ownername) + project = Project.find_by(user_id: owner.id, name: reponame) + unclosed_issues = Issue.where(project_id: project.id, issue_classify: "issue").where.not(status_id: 5) + results = [] + unclosed_issues.each do |i| + results << [i.id, i.subject] + end + render json: {unclosed_issues: results} + end + # TODO 其他平台登录时同步修改gitea平台对应用户的密码 # 该方法主要用于:别的平台初次部署对接forge平台,同步用户后,gitea平台对应的用户密码与forge平台用户密码不一致是问题 def sync_gitea_pwd diff --git a/config/routes.rb b/config/routes.rb index e91729ba..864213d2 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -117,6 +117,7 @@ Rails.application.routes.draw do post '/users/blockchain/verify_trade', to: 'users#blockchain_verify_trade' get '/users/blockchain/get_history_trades', to: 'users#blockchain_get_history_trades' post '/blockchain/issue/get_token_num', to: 'users#blockchain_get_issue_token_num' + get '/projects/blockchain/get_unclosed_issue_list', to: 'users#blockchain_get_unclosed_issue_list' resources :owners, only: [:index]