From e00d719bf5a379de1ce7ad15c4c2f8cf8536349b Mon Sep 17 00:00:00 2001 From: yuyuanshifu <747342561@qq.com> Date: Tue, 26 Jan 2021 19:33:08 +0800 Subject: [PATCH] set issue --- ...平台与区块链平台对接方案.docx | Bin 107915 -> 108076 bytes models/blockchain.go | 10 +-- models/pull_list.go | 3 +- modules/blockchain/resty.go | 37 +++++++- modules/timer/timer.go | 16 ++-- routers/repo/blockchain.go | 81 ++---------------- 6 files changed, 56 insertions(+), 91 deletions(-) diff --git a/docs/开源社区平台与区块链平台对接方案.docx b/docs/开源社区平台与区块链平台对接方案.docx index b44801e427ba81555c20a94e08b12c54595ba7dc..8b009354752920ea8cd05303d3cd9aaeac7d7991 100755 GIT binary patch delta 12565 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 diff --git a/models/blockchain.go b/models/blockchain.go index 07f6d05bd..a5b335184 100755 --- a/models/blockchain.go +++ b/models/blockchain.go @@ -46,19 +46,19 @@ func GetBlockChainByID(id int64) (*BlockChain, error) { return getBlockChainByID(x, id) } -func getBlockChainByPrID(e Engine, id int64) (*BlockChain, error) { +func getBlockChainByPrID(e Engine, prId int64) (*BlockChain, error) { blockChain := new(BlockChain) - has, err := e.ID(id).Get(blockChain) + has, err := e.Where("pr_id = ?", prId).Get(blockChain) if err != nil { return nil, err } else if !has { - return nil, fmt.Errorf("get block_chain by pr_id failed(%d)", id) + return nil, fmt.Errorf("get block_chain by pr_id failed(%d)", prId) } return blockChain, nil } -func GetBlockChainByPrID(id int64) (*BlockChain, error) { - return getBlockChainByPrID(x, id) +func GetBlockChainByPrID(prId int64) (*BlockChain, error) { + return getBlockChainByPrID(x, prId) } func getBlockChainByCommitID(e Engine, commitID string) (*BlockChain, error) { diff --git a/models/pull_list.go b/models/pull_list.go index 582d44f60..ee61f2ab5 100755 --- a/models/pull_list.go +++ b/models/pull_list.go @@ -175,8 +175,7 @@ func (prs PullRequestList) InvalidateCodeComments(doer *User, repo *git.Reposito func GetUnTransformedMergedPullRequests() ([]*PullRequest, error) { prs := make([]*PullRequest, 0, 10) return prs, x. - Where("has_merged = ? AND is_transformed = ?",true, false). - And("to_timestamp(merged_unix) >= ?", setting.CommitValidDate). + Where("has_merged = ? AND pull_request.is_transformed = ? AND to_timestamp(merged_unix) >= ?",true, false, setting.CommitValidDate). Join("INNER", "issue", "issue.id = pull_request.issue_id"). Find(&prs) } diff --git a/modules/blockchain/resty.go b/modules/blockchain/resty.go index 75374740d..09178181a 100755 --- a/modules/blockchain/resty.go +++ b/modules/blockchain/resty.go @@ -17,8 +17,7 @@ const ( UrlGetBalance = "getBalance" UrlNewRepo = "newRepo" UrlContribute = "contribute" - - ActionCommit = "commit" + UrlSetIssue = "setIssue" Success = 0 ) @@ -47,6 +46,12 @@ type ContributeResult struct { //Payload map[string]interface{} `json:"data"` } +type SetIssueResult struct { + Code int `json:"code"` + Msg string `json:"message"` + //Payload map[string]interface{} `json:"data"` +} + func getRestyClient() *resty.Client { if restyClient == nil { restyClient = resty.New() @@ -149,3 +154,31 @@ func Contribute(contractAddress, contributor, commitId string, amount int64) (*C return &result, nil } + +func SetIssue(contractAddress, contributor string, issueId int64, amount int64) (*SetIssueResult, error) { + client := getRestyClient() + var result SetIssueResult + + strAmount := strconv.FormatInt(amount, 10) + strIssue := strconv.FormatInt(issueId, 10) + res, err := client.R(). + SetHeader("Accept", "application/json"). + SetQueryParams(map[string]string{ + "contractAddress" : contractAddress, + "contributor" : contributor, + "issueId": strIssue, + "amount": strAmount, + }). + SetResult(&result). + Get(setting.BlockChainHost + UrlSetIssue) + + if err != nil { + return nil, fmt.Errorf("resty SetIssue: %v", err) + } + + if result.Code != Success { + return &result, fmt.Errorf("SetIssue err: %s", res.String()) + } + + return &result, nil +} diff --git a/modules/timer/timer.go b/modules/timer/timer.go index a501234d1..176f84423 100755 --- a/modules/timer/timer.go +++ b/modules/timer/timer.go @@ -12,16 +12,16 @@ func init() { spec := "*/10 * * * *" c.AddFunc(spec, repo.HandleUnDecompressAttachment) - //specCheckBlockChainUserSuccess := "*/10 * * * *" - //c.AddFunc(specCheckBlockChainUserSuccess, repo.HandleBlockChainUnSuccessUsers) + specCheckBlockChainUserSuccess := "*/10 * * * *" + c.AddFunc(specCheckBlockChainUserSuccess, repo.HandleBlockChainUnSuccessUsers) - //specCheckRepoBlockChainSuccess := "*/5 * * * *" - //c.AddFunc(specCheckRepoBlockChainSuccess, repo.HandleBlockChainUnSuccessRepos) + specCheckRepoBlockChainSuccess := "*/5 * * * *" + c.AddFunc(specCheckRepoBlockChainSuccess, repo.HandleBlockChainUnSuccessRepos) - //specCheckUnTransformedActions := "*/1 * * * *" - //c.AddFunc(specCheckUnTransformedActions, repo.HandleUnTransformedActions) + specCheckUnTransformedPRs := "*/1 * * * *" + c.AddFunc(specCheckUnTransformedPRs, repo.HandleBlockChainMergedPulls) - //specCheckBlockChainCommitSuccess := "*/3 * * * *" - //c.AddFunc(specCheckBlockChainCommitSuccess, repo.HandleBlockChainUnSuccessCommits) + specCheckBlockChainCommitSuccess := "*/3 * * * *" + c.AddFunc(specCheckBlockChainCommitSuccess, repo.HandleBlockChainUnSuccessCommits) c.Start() } diff --git a/routers/repo/blockchain.go b/routers/repo/blockchain.go index 77529ea07..2e7eff6fc 100755 --- a/routers/repo/blockchain.go +++ b/routers/repo/blockchain.go @@ -1,7 +1,6 @@ package repo import ( - "code.gitea.io/gitea/modules/repository" "encoding/json" "strconv" @@ -179,82 +178,10 @@ func HandleBlockChainUnSuccessUsers() { return } -func HandleUnTransformedActions() { - actions, err := models.GetUnTransformedActions() - if err != nil { - log.Error("GetUnTransformedActions failed:", err.Error()) - return - } - - for _, action := range actions { - isTransformed := true - var content repository.PushCommits - err = json.Unmarshal([]byte(action.Content), &content) - if err != nil { - isTransformed = false - log.Error("json.Unmarshal action.Content(%s) failed:%v", action.Content, err) - continue - } - - repo, err := models.GetRepositoryByID(action.RepoID) - if err != nil { - isTransformed = false - log.Error("GetRepositoryByID(%d) failed:%v", action.RepoID, err) - continue - } - - if repo.ContractAddress == "" { - isTransformed = false - log.Error("the repo(%s) has not been initialized in block_chain", repo.Name) - continue - } - - for _, commit := range content.Commits { - _, err = models.GetBlockChainByCommitID(commit.Sha1) - if err == nil { - log.Info("the commit(%s) has been transformed", commit.Sha1) - continue - } - - user, err := models.GetUserByName(commit.CommitterName) - if err != nil { - isTransformed = false - log.Error("GetUserByName(%s) failed:%v", commit.CommitterName, err) - continue - } - - blockChain := models.BlockChain{ - CommitID : commit.Sha1, - Contributor : user.PublicKey, - ContractAddress : repo.ContractAddress, - Status : models.BlockChainCommitInit, - Amount : 1, - UserID : action.UserID, - RepoID : action.RepoID, - } - _, err = models.InsertBlockChain(&blockChain) - if err != nil { - isTransformed = false - log.Error("InsertBlockChain(%s) failed:%v", commit.Sha1, err) - continue - } - } - - if isTransformed { - action.IsTransformed = isTransformed - //todo: update is_transformed - //models.updateaction(action) - } - - } - - return -} - func HandleBlockChainMergedPulls() { prs, err := models.GetUnTransformedMergedPullRequests() if err != nil { - log.Error("GetBlockChainUnSuccessUsers failed:", err.Error()) + log.Error("GetUnTransformedMergedPullRequests failed:", err.Error()) return } @@ -265,6 +192,12 @@ func HandleBlockChainMergedPulls() { continue } + err = pr.LoadIssue() + if err != nil { + log.Error("LoadIssue(%s) failed:%v", pr.MergedCommitID, err) + continue + } + poster, err := models.GetUserByID(pr.Issue.PosterID) if err != nil { log.Error("GetUserByID(%s) failed:%v", pr.MergedCommitID, err)