1. add upload pull request info function

2. add query pull request latest info function
3. add query pull request all info function
This commit is contained in:
sulenn 2021-05-12 20:20:29 +08:00
parent 01fb3ff337
commit fc02643b26
11 changed files with 395 additions and 9 deletions

View File

@ -8,5 +8,5 @@ var (
RepoCurBalanceDownOverFlow int64 = -1005 // 当前项目总 Token 数低于0
UserBblanceNotEnough int64 = -1006 // 用户余额不足
ContractAddress string = "0xAAC410d4093Ad00dc6995f853864701b3b71845E"
ContractAddress string = "0x904ed579402eD8BBb80ee7F0eb02e8226d78a70f"
)

View File

@ -1 +1 @@
[{"constant":true,"inputs":[{"name":"username","type":"string"},{"name":"token_name","type":"string"}],"name":"selectUserBalance","outputs":[{"name":"","type":"string[]"},{"name":"","type":"string[]"},{"name":"","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"username","type":"string"},{"name":"token_name","type":"string"},{"name":"amount","type":"uint256"}],"name":"minusUserBalance","outputs":[{"name":"","type":"int256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"commit_hash","type":"string"}],"name":"selectCommitInfo","outputs":[{"name":"","type":"string"},{"name":"","type":"string"},{"name":"","type":"string"},{"name":"","type":"string"},{"name":"","type":"string"},{"name":"","type":"string"},{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"commit_hash","type":"string"},{"name":"repo_id","type":"string"},{"name":"author","type":"string"},{"name":"email","type":"string"},{"name":"time","type":"string"},{"name":"content","type":"string"},{"name":"commit_diff","type":"string"}],"name":"addCommitData","outputs":[{"name":"","type":"int256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"username","type":"string"},{"name":"token_name","type":"string"},{"name":"amount","type":"uint256"}],"name":"addUserBalance","outputs":[{"name":"","type":"int256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"push_id","type":"string"}],"name":"selectPushInfo","outputs":[{"name":"","type":"string"},{"name":"","type":"uint256"},{"name":"","type":"string"},{"name":"","type":"string"},{"name":"","type":"string"},{"name":"","type":"string"},{"name":"","type":"string"},{"name":"","type":"string"},{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"push_id","type":"string"},{"name":"push_number","type":"uint256"},{"name":"repo_id","type":"string"},{"name":"reponame","type":"string"},{"name":"ownername","type":"string"},{"name":"username","type":"string"},{"name":"branch","type":"string"},{"name":"commit_shas","type":"string"},{"name":"time","type":"string"}],"name":"addPushData","outputs":[{"name":"","type":"int256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"payer","type":"string"},{"name":"payee","type":"string"},{"name":"token_name","type":"string"},{"name":"amount","type":"uint256"}],"name":"transferUserBalance","outputs":[{"name":"","type":"int256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"username","type":"string"}],"name":"selectUserAllBalance","outputs":[{"name":"","type":"string[]"},{"name":"","type":"string[]"},{"name":"","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"token_name","type":"string"},{"name":"owner","type":"string"},{"name":"total_supply","type":"uint256"},{"name":"cur_supply","type":"uint256"},{"name":"username","type":"string[]"},{"name":"balance","type":"uint256[]"}],"name":"createRepo","outputs":[{"name":"","type":"int256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"token_name","type":"string"}],"name":"selectRepoBasicInfo","outputs":[{"name":"","type":"string"},{"name":"","type":"string"},{"name":"","type":"int256"},{"name":"","type":"int256"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"}]
[{"constant":true,"inputs":[{"name":"username","type":"string"},{"name":"token_name","type":"string"}],"name":"selectUserBalance","outputs":[{"name":"","type":"string[]"},{"name":"","type":"string[]"},{"name":"","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"username","type":"string"},{"name":"token_name","type":"string"},{"name":"amount","type":"uint256"}],"name":"minusUserBalance","outputs":[{"name":"","type":"int256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"pull_request_id","type":"string"},{"name":"content","type":"string"}],"name":"addPullRequestData","outputs":[{"name":"","type":"int256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"commit_hash","type":"string"}],"name":"selectCommitInfo","outputs":[{"name":"","type":"string"},{"name":"","type":"string"},{"name":"","type":"string"},{"name":"","type":"string"},{"name":"","type":"string"},{"name":"","type":"string"},{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"pull_request_id","type":"string"}],"name":"selectPullRequestInfo","outputs":[{"name":"","type":"string"},{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"commit_hash","type":"string"},{"name":"repo_id","type":"string"},{"name":"author","type":"string"},{"name":"email","type":"string"},{"name":"time","type":"string"},{"name":"content","type":"string"},{"name":"commit_diff","type":"string"}],"name":"addCommitData","outputs":[{"name":"","type":"int256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"username","type":"string"},{"name":"token_name","type":"string"},{"name":"amount","type":"uint256"}],"name":"addUserBalance","outputs":[{"name":"","type":"int256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"push_id","type":"string"}],"name":"selectPushInfo","outputs":[{"name":"","type":"string"},{"name":"","type":"uint256"},{"name":"","type":"string"},{"name":"","type":"string"},{"name":"","type":"string"},{"name":"","type":"string"},{"name":"","type":"string"},{"name":"","type":"string"},{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"push_id","type":"string"},{"name":"push_number","type":"uint256"},{"name":"repo_id","type":"string"},{"name":"reponame","type":"string"},{"name":"ownername","type":"string"},{"name":"username","type":"string"},{"name":"branch","type":"string"},{"name":"commit_shas","type":"string"},{"name":"time","type":"string"}],"name":"addPushData","outputs":[{"name":"","type":"int256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"payer","type":"string"},{"name":"payee","type":"string"},{"name":"token_name","type":"string"},{"name":"amount","type":"uint256"}],"name":"transferUserBalance","outputs":[{"name":"","type":"int256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"username","type":"string"}],"name":"selectUserAllBalance","outputs":[{"name":"","type":"string[]"},{"name":"","type":"string[]"},{"name":"","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"token_name","type":"string"},{"name":"owner","type":"string"},{"name":"total_supply","type":"uint256"},{"name":"cur_supply","type":"uint256"},{"name":"username","type":"string[]"},{"name":"balance","type":"uint256[]"}],"name":"createRepo","outputs":[{"name":"","type":"int256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"token_name","type":"string"}],"name":"selectRepoBasicInfo","outputs":[{"name":"","type":"string"},{"name":"","type":"string"},{"name":"","type":"int256"},{"name":"","type":"int256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"pull_request_id","type":"string"}],"name":"selectPullRequestAllInfo","outputs":[{"name":"","type":"string[]"},{"name":"","type":"string[]"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"}]

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -9,6 +9,7 @@ contract OpenSource {
string constant USER_TABLE = "user";
string constant COMMIT_TABLE = "commit";
string constant PUSH_TABLE = "push";
string constant PULL_REQUEST_TABLE = "pull_request";
constructor() public {
tableFactory = TableFactory(0x1001); //The fixed address is 0x1001 for TableFactory
@ -17,6 +18,7 @@ contract OpenSource {
tableFactory.createTable(USER_TABLE, "user", "token_name,balance");
tableFactory.createTable(COMMIT_TABLE, "commit_hash", "repo_id,author,email,time,content,commit_diff");
tableFactory.createTable(PUSH_TABLE, "push_id", "push_number,repo_id,reponame,ownername,username,branch,commit_shas,time");
tableFactory.createTable(PULL_REQUEST_TABLE, "pull_request_id", "content");
}
// create repo
@ -411,4 +413,56 @@ contract OpenSource {
return (entry.getString("push_id"), entry.getUInt("push_number"), entry.getString("repo_id"), entry.getString("reponame"), entry.getString("ownername"),
entry.getString("username"), entry.getString("branch"), entry.getString("commit_shas"), entry.getString("time"));
}
// add pull request info
function addPullRequestData(string memory pull_request_id, string memory content)
public
returns (int256)
{
Table pull_request_table = tableFactory.openTable(PULL_REQUEST_TABLE);
Entry pull_request_entry = pull_request_table.newEntry();
pull_request_entry.set("pull_request_id", pull_request_id);
pull_request_entry.set("content", content);
int256 count = pull_request_table.insert(pull_request_id, pull_request_entry);
return count;
}
// select pull request latest info
function selectPullRequestInfo(string memory pull_request_id)
public
view
returns (string memory, string memory)
{
Table pull_request_table = tableFactory.openTable(PULL_REQUEST_TABLE);
Condition condition = pull_request_table.newCondition();
Entries entries = pull_request_table.select(pull_request_id, condition);
if (entries.size() == 0) {
return ("", "");
}
Entry entry = entries.get(entries.size()-1);
return (entry.getString("pull_request_id"), entry.getString("content"));
}
// select pull request All info
function selectPullRequestAllInfo(string memory pull_request_id)
public
view
returns (string[] memory, string[] memory)
{
Table pull_request_table = tableFactory.openTable(PULL_REQUEST_TABLE);
Condition condition = pull_request_table.newCondition();
Entries entries = pull_request_table.select(pull_request_id, condition);
string[] memory pull_request_id_list = new string[](uint256(entries.size()));
string[] memory content_list = new string[](uint256(entries.size()));
for (int256 i = 0; i < entries.size(); ++i) {
Entry entry = entries.get(i);
pull_request_id_list[uint256(i)] = entry.getString("pull_request_id");
content_list[uint256(i)] = entry.getString("content");
}
return (pull_request_id_list, content_list);
}
}

View File

@ -28,6 +28,20 @@ type FiscoBcos struct {
CommitShas []string `json:"commit_shas"`
// repo_id, username, time
// pull request 相关
PullRequestID string `json:"pull_request_id"`
PullRequestNumber uint64 `json:"pull_request_number"`
Action string `json:"action"`
Title string `json:"title"`
SourceBranch string `json:"source_branch"`
TargetRepoID string `json:"target_repo_id"`
TargetBranch string `json:"target_branch"`
Reviewers []string `json:"reviewers"`
MergeUser string `json:"merge_user"`
CreatedAt string `json:"created_at"`
UpdatedAt string `json:"updated_ad"`
// repo_id, reponame, ownername, username, content, commit_shas
// user 相关
Username string `json:"username"` // 用户名
Amount uint64 `json:"amount"` // 转账金额

View File

@ -0,0 +1,33 @@
package structs
type UploadPullReuqestOption struct {
PullRequestID string `json:"pull_request_id"`
PullRequestNumber uint64 `json:"pull_request_number"`
Action string `json:"action"`
Title string `json:"title"`
SourceBranch string `json:"source_branch"`
TargetRepoID string `json:"target_repo_id"`
TargetBranch string `json:"target_branch"`
Reviewers []string `json:"reviewers"`
MergeUser string `json:"merge_user"`
CreatedAt string `json:"created_at"`
UpdatedAt string `json:"updated_ad"`
RepoID string `json:"repo_id"`
Reponame string `json:"reponame"`
Ownername string `json:"ownername"`
Username string `json:"username"`
Content string `json:"message"`
CommitShas []string `json:"commit_shas"`
}
type ResponsePullRequest struct {
UploadPullReuqestOption
Response
}
type ResponsePullRequestArr struct {
UploadPullReuqestOptionArr
Response
}
type UploadPullReuqestOptionArr []UploadPullReuqestOption

View File

@ -16,10 +16,12 @@ var (
ResRepoCurBalanceUpOverFlow = &Response{Status: 4, Message: "repo current balance up overflow when user adds amount!"} // username balance overflow when create repo!
ResRepoCurBalanceDownOverFlow = &Response{Status: 6, Message: "repo current balance less than 0 when user adds amount!"}
ResCommitUploadSucc = &Response{Status: 0, Message: "commit upload successfully!"}
ResCommitUploadUnsucc = &Response{Status: 7, Message: "commit upload unsuccessfully!"}
ResPushUploadSucc = &Response{Status: 0, Message: "push upload successfully!"}
ResPushUploadUnsucc = &Response{Status: 7, Message: "push upload unsuccessfully!"}
ResCommitUploadSucc = &Response{Status: 0, Message: "commit upload successfully!"}
ResCommitUploadUnsucc = &Response{Status: 7, Message: "commit upload unsuccessfully!"}
ResPushUploadSucc = &Response{Status: 0, Message: "push upload successfully!"}
ResPushUploadUnsucc = &Response{Status: 8, Message: "push upload unsuccessfully!"}
ResPullRequestUploadSucc = &Response{Status: 0, Message: "pull request upload successfully!"}
ResPullRequestUploadUnsucc = &Response{Status: 9, Message: "pull request upload unsuccessfully!"}
ResUserNotExisted = &Response{Status: 100, Message: "user not exist!"}
ResUserAddAmountSucc = &Response{Status: 0, Message: "user adds amount successfully!"}

View File

@ -56,6 +56,32 @@ func HandleAllRoutes(ctx *macaron.Context, opt api.FiscoBcos, logger *log.Logger
logger)
case "query push info":
repo.SelectPushInfo(ctx, opt.PushID, logger)
case "upload pull request info":
repo.UploadPullRequestInfo(ctx,
api.UploadPullReuqestOption{
PullRequestID: opt.PullRequestID,
PullRequestNumber: opt.PullRequestNumber,
RepoID: opt.RepoID,
Reponame: opt.Reponame,
Ownername: opt.Ownername,
Username: opt.Username,
Action: opt.Action,
Title: opt.Title,
Content: opt.Content,
SourceBranch: opt.SourceBranch,
TargetRepoID: opt.TargetRepoID,
TargetBranch: opt.TargetBranch,
Reviewers: opt.Reviewers,
CommitShas: opt.CommitShas,
MergeUser: opt.MergeUser,
CreatedAt: opt.CreatedAt,
UpdatedAt: opt.UpdatedAt,
},
logger)
case "query pull request latest info":
repo.SelectPullRequestLatestInfo(ctx, opt.PullRequestID, logger)
case "query pull request all info":
repo.SelectPullRequestAllInfo(ctx, opt.PullRequestID, logger)
case "query user balance of single repo":
user.SelectUserBalance(ctx, opt.Username, opt.TokenName, logger)
case "query user balance of all repos":

View File

@ -1,6 +1,7 @@
package repo
import (
"encoding/json"
"fmt"
"log"
"net/http"
@ -131,3 +132,114 @@ func SelectPushInfo(ctx *macaron.Context, pushID string, logger *log.Logger) {
},
})
}
// 查询 pull request 最新数据
func SelectPullRequestLatestInfo(ctx *macaron.Context, pullRequestID string, logger *log.Logger) {
if pullRequestID == "" {
ctx.JSON(http.StatusOK, api.StringEmpty)
return
}
configs, err := conf.ParseConfigFile("config.toml")
if err != nil {
ctx.JSON(http.StatusOK, api.UnknownErr(err))
return
}
config := &configs[0]
client, err := client.Dial(config)
if err != nil {
ctx.JSON(http.StatusOK, api.UnknownErr(err))
return
}
// load the contract
contractAddress := common.HexToAddress(contract.ContractAddress)
instance, err := opensource.NewOpenSource(contractAddress, client)
if err != nil {
ctx.JSON(http.StatusOK, api.UnknownErr(err))
return
}
openSourceSession := &opensource.OpenSourceSession{Contract: instance, CallOpts: *client.GetCallOpts(), TransactOpts: *client.GetTransactOpts()}
_, strJSON, err := openSourceSession.SelectPullRequestInfo(pullRequestID) // call Insert API
if err != nil {
ctx.JSON(http.StatusOK, api.UnknownErr(err))
return
}
fmt.Printf("pullRequestID: %v \n", strJSON)
var uploadPullRequestOption api.UploadPullReuqestOption
err = json.Unmarshal([]byte(strJSON), &uploadPullRequestOption)
if err != nil {
ctx.JSON(http.StatusOK, api.UnknownErr(err))
return
}
ctx.JSON(http.StatusOK, &structs.ResponsePullRequest{
Response: structs.Response{
Status: 0,
Message: "query success!",
},
UploadPullReuqestOption: uploadPullRequestOption,
})
}
// 查询 pull request 所有数据
func SelectPullRequestAllInfo(ctx *macaron.Context, pullRequestID string, logger *log.Logger) {
if pullRequestID == "" {
ctx.JSON(http.StatusOK, api.StringEmpty)
return
}
configs, err := conf.ParseConfigFile("config.toml")
if err != nil {
ctx.JSON(http.StatusOK, api.UnknownErr(err))
return
}
config := &configs[0]
client, err := client.Dial(config)
if err != nil {
ctx.JSON(http.StatusOK, api.UnknownErr(err))
return
}
// load the contract
contractAddress := common.HexToAddress(contract.ContractAddress)
instance, err := opensource.NewOpenSource(contractAddress, client)
if err != nil {
ctx.JSON(http.StatusOK, api.UnknownErr(err))
return
}
openSourceSession := &opensource.OpenSourceSession{Contract: instance, CallOpts: *client.GetCallOpts(), TransactOpts: *client.GetTransactOpts()}
_, strJSONArr, err := openSourceSession.SelectPullRequestAllInfo(pullRequestID) // call Insert API
if err != nil {
ctx.JSON(http.StatusOK, api.UnknownErr(err))
return
}
fmt.Printf("pullRequestID: %v \n", strJSONArr)
var uploadPullRequestOption api.UploadPullReuqestOption
var uploadPullReuqestOptionArr api.UploadPullReuqestOptionArr
for i := 0; i < len(strJSONArr); i++ {
err = json.Unmarshal([]byte(strJSONArr[i]), &uploadPullRequestOption)
if err != nil {
ctx.JSON(http.StatusOK, api.UnknownErr(err))
return
}
uploadPullReuqestOptionArr = append(uploadPullReuqestOptionArr, uploadPullRequestOption)
}
ctx.JSON(http.StatusOK, &structs.ResponsePullRequestArr{
Response: structs.Response{
Status: 0,
Message: "query success!",
},
UploadPullReuqestOptionArr: uploadPullReuqestOptionArr,
})
}

View File

@ -1,6 +1,7 @@
package repo
import (
"encoding/json"
"log"
"math/big"
"net/http"
@ -124,3 +125,54 @@ func UploadPushInfo(ctx *macaron.Context, opt api.UploadPushOption, logger *log.
}
ctx.JSON(http.StatusOK, structs.ResPushUploadUnsucc)
}
// 上传 pull request 数据
func UploadPullRequestInfo(ctx *macaron.Context, opt api.UploadPullReuqestOption, logger *log.Logger) {
pullRequestID := opt.PullRequestID
bytesJson, err := json.Marshal(opt)
if err != nil {
ctx.JSON(http.StatusOK, api.UnknownErr(err))
return
}
configs, err := conf.ParseConfigFile("config.toml")
if err != nil {
ctx.JSON(http.StatusOK, api.UnknownErr(err))
return
}
config := &configs[0]
client, err := client.Dial(config)
if err != nil {
ctx.JSON(http.StatusOK, api.UnknownErr(err))
return
}
// load the contract
contractAddress := common.HexToAddress(contract.ContractAddress)
instance, err := opensource.NewOpenSource(contractAddress, client)
if err != nil {
ctx.JSON(http.StatusOK, api.UnknownErr(err))
return
}
openSourceSession := &opensource.OpenSourceSession{Contract: instance, CallOpts: *client.GetCallOpts(), TransactOpts: *client.GetTransactOpts()}
tx, receipt, err := openSourceSession.AddPullRequestData(pullRequestID, string(bytesJson)) // call Insert API
if err != nil {
ctx.JSON(http.StatusOK, api.UnknownErr(err))
return
}
logger.Printf("tx sent: %s\n", tx.Hash().Hex())
// insertedLines, err := strconv.Atoi(receipt.Output[2:])
code, err := parseOutput(opensource.OpenSourceABI, "addPullRequestData", receipt)
if err != nil {
logger.Panic("error when transfer string to int: ", err)
}
if code.Int64() > 0 {
logger.Printf("inserted lines: %v\n", code)
ctx.JSON(http.StatusOK, structs.ResPullRequestUploadSucc)
return
}
ctx.JSON(http.StatusOK, structs.ResPullRequestUploadUnsucc)
}