Reviewed-by: 史梦园 <1729788216@qq.com>master
@@ -1065,3 +1065,7 @@ HOST = http://192.168.202.90:3366/ | |||
HOST = http://192.168.207.34:39987 | |||
USER = cW4cMtH24eoWPE7X | |||
PASSWORD = 4BPmgvK2hb2Eywwyp4YZRY4B7yQf4DAC | |||
[blockchain] | |||
HOST = http://192.168.207.84:3002/ | |||
COMMIT_VALID_DATE = 2021-01-15 |
@@ -67,6 +67,7 @@ type Action struct { | |||
IsDeleted bool `xorm:"INDEX NOT NULL DEFAULT false"` | |||
RefName string | |||
IsPrivate bool `xorm:"INDEX NOT NULL DEFAULT false"` | |||
IsTransformed bool `xorm:"INDEX NOT NULL DEFAULT false"` | |||
Content string `xorm:"TEXT"` | |||
CreatedUnix timeutil.TimeStamp `xorm:"INDEX created"` | |||
} | |||
@@ -344,3 +345,13 @@ func GetFeeds(opts GetFeedsOptions) ([]*Action, error) { | |||
return actions, nil | |||
} | |||
func GetUnTransformedActions() ([]*Action, error) { | |||
actions := make([]*Action, 0, 10) | |||
err := x.Where("op_type = ?", ActionCommitRepo). | |||
And("content != ''"). | |||
And("is_transformed = ?", false). | |||
And("to_timestamp(created_unix) >= ?", setting.CommitValidDate). | |||
Find(&actions) | |||
return actions, err | |||
} |
@@ -0,0 +1,86 @@ | |||
package models | |||
import ( | |||
"code.gitea.io/gitea/modules/timeutil" | |||
"fmt" | |||
"time" | |||
) | |||
type BlockChainCommitStatus int | |||
const ( | |||
BlockChainCommitInit BlockChainCommitStatus = iota | |||
BlockChainCommitSuccess | |||
BlockChainCommitFailed | |||
) | |||
type BlockChain struct { | |||
ID int64 `xorm:"pk autoincr"` | |||
CommitID string `xorm:"INDEX NOT NULL"` | |||
Contributor string `xorm:"INDEX NOT NULL"` | |||
ContractAddress string `xorm:"INDEX NOT NULL"` | |||
Status BlockChainCommitStatus `xorm:"INDEX NOT NULL DEFAULT 0"` | |||
Amount int64 `xorm:"INDEX"` | |||
UserID int64 `xorm:"INDEX"` | |||
RepoID int64 `xorm:"INDEX"` | |||
TransactionHash string `xorm:"INDEX"` | |||
CreatedUnix timeutil.TimeStamp `xorm:"created"` | |||
UpdatedUnix timeutil.TimeStamp `xorm:"updated"` | |||
DeletedAt time.Time `xorm:"deleted"` | |||
User *User `xorm:"-"` | |||
Repo *Repository `xorm:"-"` | |||
} | |||
func getBlockChainByID(e Engine, id int64) (*BlockChain, error) { | |||
blockChain := new(BlockChain) | |||
has, err := e.ID(id).Get(blockChain) | |||
if err != nil { | |||
return nil, err | |||
} else if !has { | |||
return nil, fmt.Errorf("get block_chain by id failed(%d)", id) | |||
} | |||
return blockChain, nil | |||
} | |||
func GetBlockChainByID(id int64) (*BlockChain, error) { | |||
return getBlockChainByID(x, id) | |||
} | |||
func getBlockChainByCommitID(e Engine, commitID string) (*BlockChain, error) { | |||
blockChain := new(BlockChain) | |||
has, err := e.Where("commit_id = ?", commitID).Get(blockChain) | |||
if err != nil { | |||
return nil, err | |||
} else if !has { | |||
return nil, fmt.Errorf("get block_chain by commitID failed(%s)", commitID) | |||
} | |||
return blockChain, nil | |||
} | |||
func GetBlockChainByCommitID(commitID string) (*BlockChain, error) { | |||
return getBlockChainByCommitID(x, commitID) | |||
} | |||
func updateBlockChainCols(e Engine, blockChain *BlockChain, cols ...string) error { | |||
_, err := e.ID(blockChain.ID).Cols(cols...).Update(blockChain) | |||
return err | |||
} | |||
func UpdateBlockChainCols(blockChain *BlockChain, cols ...string) error { | |||
return updateBlockChainCols(x, blockChain, cols...) | |||
} | |||
func GetBlockChainUnSuccessCommits() ([]*BlockChain, error) { | |||
blockChains := make([]*BlockChain, 0, 10) | |||
return blockChains, x. | |||
Where("status != ?", BlockChainCommitSuccess). | |||
Find(&blockChains) | |||
} | |||
func InsertBlockChain(blockChain *BlockChain) (_ *BlockChain, err error) { | |||
if _, err := x.Insert(blockChain); err != nil { | |||
return nil, err | |||
} | |||
return blockChain, nil | |||
} |
@@ -128,6 +128,7 @@ func init() { | |||
new(Dataset), | |||
new(Cloudbrain), | |||
new(FileChunk), | |||
new(BlockChain), | |||
) | |||
gonicNames := []string{"SSL", "UID"} | |||
@@ -6,6 +6,7 @@ | |||
package models | |||
import ( | |||
"code.gitea.io/gitea/modules/blockchain" | |||
"context" | |||
"crypto/md5" | |||
"errors" | |||
@@ -134,6 +135,7 @@ func NewRepoContext() { | |||
// RepositoryStatus defines the status of repository | |||
type RepositoryStatus int | |||
type RepoBlockChainStatus int | |||
// all kinds of RepositoryStatus | |||
const ( | |||
@@ -141,6 +143,12 @@ const ( | |||
RepositoryBeingMigrated // repository is migrating | |||
) | |||
const ( | |||
RepoBlockChainInit RepoBlockChainStatus = iota | |||
RepoBlockChainSuccess | |||
RepoBlockChainFailed | |||
) | |||
// Repository represents a git repository. | |||
type Repository struct { | |||
ID int64 `xorm:"pk autoincr"` | |||
@@ -195,6 +203,11 @@ type Repository struct { | |||
// Avatar: ID(10-20)-md5(32) - must fit into 64 symbols | |||
Avatar string `xorm:"VARCHAR(64)"` | |||
//blockchain | |||
ContractAddress string `xorm:"INDEX"` | |||
Balance int64 `xorm:"NOT NULL DEFAULT 0"` | |||
BlockChainStatus RepoBlockChainStatus `xorm:"NOT NULL DEFAULT 0"` | |||
CreatedUnix timeutil.TimeStamp `xorm:"INDEX created"` | |||
UpdatedUnix timeutil.TimeStamp `xorm:"INDEX updated"` | |||
} | |||
@@ -1051,6 +1064,11 @@ func CreateRepository(ctx DBContext, doer, u *User, repo *Repository) (err error | |||
return err | |||
} | |||
_, err = blockchain.NewRepo(string(repo.ID), u.PublicKey, repo.Name) | |||
if err != nil { | |||
log.Error("newRepo failed:", err.Error()) | |||
} | |||
// insert units for repo | |||
var units = make([]RepoUnit, 0, len(DefaultRepoUnits)) | |||
for _, tp := range DefaultRepoUnits { | |||
@@ -2388,3 +2406,10 @@ func updateRepositoryCols(e Engine, repo *Repository, cols ...string) error { | |||
func UpdateRepositoryCols(repo *Repository, cols ...string) error { | |||
return updateRepositoryCols(x, repo, cols...) | |||
} | |||
func GetBlockChainUnSuccessRepos() ([]*Repository, error) { | |||
repos := make([]*Repository, 0, 10) | |||
return repos, x. | |||
Where("block_chain_status != ?", RepoBlockChainSuccess). | |||
Find(&repos) | |||
} |
@@ -6,6 +6,7 @@ | |||
package models | |||
import ( | |||
"code.gitea.io/gitea/modules/blockchain" | |||
"container/list" | |||
"context" | |||
"crypto/md5" | |||
@@ -35,6 +36,7 @@ import ( | |||
"code.gitea.io/gitea/modules/timeutil" | |||
"code.gitea.io/gitea/modules/util" | |||
"github.com/go-resty/resty/v2" | |||
"github.com/unknwon/com" | |||
"golang.org/x/crypto/argon2" | |||
"golang.org/x/crypto/bcrypt" | |||
@@ -91,6 +93,8 @@ var ( | |||
// Characters prohibited in a user name (anything except A-Za-z0-9_.-) | |||
alphaDashDotPattern = regexp.MustCompile(`[^\w-\.]`) | |||
restyClient *resty.Client | |||
) | |||
// User represents the object of individual and member of organization. | |||
@@ -167,7 +171,11 @@ type User struct { | |||
Theme string `xorm:"NOT NULL DEFAULT ''"` | |||
//CloudBrain | |||
Token string `xorm:"VARCHAR(1024)"` | |||
Token string `xorm:"VARCHAR(1024)"` | |||
//BlockChain | |||
PublicKey string `xorm` | |||
PrivateKey string `xorm` | |||
} | |||
// SearchOrganizationsOptions options to filter organizations | |||
@@ -965,6 +973,15 @@ func CreateUser(u *User) (err error) { | |||
return err | |||
} | |||
result, err := blockchain.CreateBlockchainAccount() | |||
if err != nil { | |||
log.Error("createBlockchainAccount failed:", err.Error()) | |||
return err | |||
} | |||
u.PublicKey = result.Payload["publickey"].(string) | |||
u.PrivateKey = result.Payload["privatekey"].(string) | |||
sess := x.NewSession() | |||
defer sess.Close() | |||
if err = sess.Begin(); err != nil { | |||
@@ -2025,3 +2042,11 @@ func SyncExternalUsers(ctx context.Context, updateExisting bool) error { | |||
} | |||
return nil | |||
} | |||
func GetBlockChainUnSuccessUsers() ([]*User, error) { | |||
users := make([]*User, 0, 10) | |||
err := x.Where("public_key is null"). | |||
Or("private_key is null"). | |||
Find(&users) | |||
return users, err | |||
} |
@@ -0,0 +1,14 @@ | |||
package blockchain | |||
const ( | |||
Command = `pip3 install jupyterlab==2.2.5 -i https://pypi.tuna.tsinghua.edu.cn/simple;service ssh stop;jupyter lab --no-browser --ip=0.0.0.0 --allow-root --notebook-dir="/code" --port=80 --LabApp.token="" --LabApp.allow_origin="self https://cloudbrain.pcl.ac.cn"` | |||
CodeMountPath = "/code" | |||
DataSetMountPath = "/dataset" | |||
ModelMountPath = "/model" | |||
BenchMarkMountPath = "/benchmark" | |||
TaskInfoName = "/taskInfo" | |||
SubTaskName = "task1" | |||
) |
@@ -0,0 +1,150 @@ | |||
package blockchain | |||
import ( | |||
"fmt" | |||
"code.gitea.io/gitea/modules/setting" | |||
"github.com/go-resty/resty/v2" | |||
) | |||
var ( | |||
restyClient *resty.Client | |||
) | |||
const ( | |||
UrlCreateAccount = "createAccount" | |||
UrlGetBalance = "getBalance" | |||
UrlNewRepo = "newRepo" | |||
UrlContribute = "contribute" | |||
ActionCommit = "commit" | |||
Success = 0 | |||
) | |||
type CreateAccountResult struct { | |||
Code int `json:"code"` | |||
Msg string `json:"message"` | |||
Payload map[string]interface{} `json:"data"` | |||
} | |||
type GetBalanceResult struct { | |||
Code int `json:"code"` | |||
Msg string `json:"message"` | |||
Payload map[string]interface{} `json:"data"` | |||
} | |||
type NewRepoResult struct { | |||
Code int `json:"code"` | |||
Msg string `json:"message"` | |||
//Data string `json:"data"` | |||
} | |||
type ContributeResult 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() | |||
} | |||
return restyClient | |||
} | |||
func CreateBlockchainAccount() (*CreateAccountResult, error) { | |||
client := getRestyClient() | |||
var result CreateAccountResult | |||
res, err := client.R(). | |||
SetHeader("Content-Type", "application/json"). | |||
SetResult(&result). | |||
Get(setting.BlockChainHost + UrlCreateAccount) | |||
if err != nil { | |||
return nil, fmt.Errorf("resty create account: %s", err) | |||
} | |||
if result.Code != Success { | |||
return &result, fmt.Errorf("CreateAccount err: %s", res.String()) | |||
} | |||
return &result, nil | |||
} | |||
func NewRepo(repoID, publicKey, repoName string) (*NewRepoResult, error) { | |||
client := getRestyClient() | |||
var result NewRepoResult | |||
res, err := client.R(). | |||
SetHeader("Accept", "application/json"). | |||
SetQueryParams(map[string]string{ | |||
"repoId" : repoID, | |||
"creator" : publicKey, | |||
"repoName" : repoName, | |||
}). | |||
SetResult(&result). | |||
Get(setting.BlockChainHost + UrlNewRepo) | |||
if err != nil { | |||
return nil, fmt.Errorf("resty newRepo: %v", err) | |||
} | |||
if result.Code != Success { | |||
return &result, fmt.Errorf("newRepo err: %s", res.String()) | |||
} | |||
return &result, nil | |||
} | |||
func GetBalance(contractAddress, contributor string) (*GetBalanceResult, error) { | |||
client := getRestyClient() | |||
var result GetBalanceResult | |||
res, err := client.R(). | |||
SetHeader("Accept", "application/json"). | |||
SetQueryParams(map[string]string{ | |||
"contractAddress" : contractAddress, | |||
"contributor" : contributor, | |||
}). | |||
SetResult(&result). | |||
Get(setting.BlockChainHost + UrlGetBalance) | |||
if err != nil { | |||
return nil, fmt.Errorf("resty getBalance: %v", err) | |||
} | |||
if result.Code != Success { | |||
return &result, fmt.Errorf("getBalance err: %s", res.String()) | |||
} | |||
return &result, nil | |||
} | |||
func Contribute(contractAddress, contributor, action, commitId string, codeLine int) (*ContributeResult, error) { | |||
client := getRestyClient() | |||
var result ContributeResult | |||
res, err := client.R(). | |||
SetHeader("Accept", "application/json"). | |||
SetQueryParams(map[string]string{ | |||
"contractAddress" : contractAddress, | |||
"contributor" : contributor, | |||
"action" : action, | |||
"commitId": commitId, | |||
"amount": string(codeLine), | |||
}). | |||
SetResult(&result). | |||
Get(setting.BlockChainHost + UrlContribute) | |||
if err != nil { | |||
return nil, fmt.Errorf("resty contribute: %v", err) | |||
} | |||
if result.Code != Success { | |||
return &result, fmt.Errorf("contribute err: %s", res.String()) | |||
} | |||
return &result, nil | |||
} |
@@ -443,6 +443,10 @@ var ( | |||
IsBenchmarkEnabled bool | |||
BenchmarkCode string | |||
BenchmarkServerHost string | |||
//blockchain config | |||
BlockChainHost string | |||
CommitValidDate string | |||
) | |||
// DateLang transforms standard language locale name to corresponding value in datetime plugin. | |||
@@ -1123,6 +1127,10 @@ func NewContext() { | |||
IsBenchmarkEnabled = sec.Key("ENABLED").MustBool(false) | |||
BenchmarkCode = sec.Key("BENCHMARKCODE").MustString("https://yangzhx:justfortest123@git.openi.org.cn/yangzhx/detection_benchmark_script.git") | |||
BenchmarkServerHost = sec.Key("HOST").MustString("http://192.168.202.90:3366/") | |||
sec = Cfg.Section("blockchain") | |||
BlockChainHost = sec.Key("HOST").MustString("http://192.168.136.66:3302/") | |||
CommitValidDate = sec.Key("COMMIT_VALID_DATE").MustString("2021-01-15") | |||
} | |||
func loadInternalToken(sec *ini.Section) string { | |||
@@ -8,7 +8,20 @@ import ( | |||
func init() { | |||
c := cron.New() | |||
spec := "*/10 * * * *" | |||
c.AddFunc(spec, repo.HandleUnDecompressAttachment) | |||
specCheckBlockChainUserSuccess := "*/10 * * * *" | |||
c.AddFunc(specCheckBlockChainUserSuccess, repo.HandleBlockChainUnSuccessUsers) | |||
specCheckRepoBlockChainSuccess := "*/5 * * * *" | |||
c.AddFunc(specCheckRepoBlockChainSuccess, repo.HandleBlockChainUnSuccessRepos) | |||
specCheckUnTransformedActions := "*/1 * * * *" | |||
c.AddFunc(specCheckUnTransformedActions, repo.HandleUnTransformedActions) | |||
specCheckBlockChainCommitSuccess := "*/3 * * * *" | |||
c.AddFunc(specCheckBlockChainCommitSuccess, repo.HandleBlockChainUnSuccessCommits) | |||
c.Start() | |||
} |
@@ -14,7 +14,7 @@ const ( | |||
) | |||
func SendDecompressTask(ctx context.Context, uuid string) error { | |||
args := []tasks.Arg{{Name: "uuid", Type: "string", Value: uuid}} | |||
args := []tasks.Arg{{Name: "uuid", Type: "string", Value: uuid},{}} | |||
task, err := tasks.NewSignature(DecompressTaskName, args) | |||
if err != nil { | |||
log.Error("NewSignature failed:", err.Error()) | |||
@@ -0,0 +1,250 @@ | |||
package repo | |||
import ( | |||
"code.gitea.io/gitea/modules/repository" | |||
"encoding/json" | |||
"strconv" | |||
"code.gitea.io/gitea/models" | |||
"code.gitea.io/gitea/modules/blockchain" | |||
"code.gitea.io/gitea/modules/context" | |||
"code.gitea.io/gitea/modules/log" | |||
) | |||
type BlockChainInitNotify struct { | |||
RepoId int64 `json:"repoId"` | |||
ContractAddress string `json:"contractAddress"` | |||
} | |||
type BlockChainCommitNotify struct { | |||
CommitID string `json:"commitId"` | |||
TransactionHash string `json:"txHash"` | |||
} | |||
func HandleBlockChainInitNotify(ctx *context.Context) { | |||
var req BlockChainInitNotify | |||
data, _ := ctx.Req.Body().Bytes() | |||
json.Unmarshal(data, &req) | |||
repo, err := models.GetRepositoryByID(req.RepoId) | |||
if err != nil { | |||
log.Error("GetRepositoryByID failed:", err.Error()) | |||
ctx.JSON(200, map[string]string{ | |||
"code" : "-1", | |||
"message" : "internal error", | |||
}) | |||
return | |||
} | |||
if repo.BlockChainStatus == models.RepoBlockChainSuccess && len(repo.ContractAddress) != 0 { | |||
log.Error("the repo has been RepoBlockChainSuccess:", req.RepoId) | |||
ctx.JSON(200, map[string]string{ | |||
"code" : "-1", | |||
"message" : "the repo has been RepoBlockChainSuccess", | |||
}) | |||
return | |||
} | |||
repo.BlockChainStatus = models.RepoBlockChainSuccess | |||
repo.ContractAddress = req.ContractAddress | |||
if err = models.UpdateRepositoryCols(repo, "block_chain_status", "contract_address"); err != nil { | |||
log.Error("UpdateRepositoryCols failed:", err.Error()) | |||
ctx.JSON(200, map[string]string{ | |||
"code" : "-1", | |||
"message" : "internal error", | |||
}) | |||
return | |||
} | |||
ctx.JSON(200, map[string]string{ | |||
"code": "0", | |||
"message": "", | |||
}) | |||
} | |||
func HandleBlockChainCommitNotify(ctx *context.Context) { | |||
var req BlockChainCommitNotify | |||
data, _ := ctx.Req.Body().Bytes() | |||
if err := json.Unmarshal(data, &req); err != nil { | |||
log.Error("json.Unmarshal failed:", err.Error()) | |||
ctx.JSON(200, map[string]string{ | |||
"code" : "-1", | |||
"message" : "response data error", | |||
}) | |||
return | |||
} | |||
blockChain, err := models.GetBlockChainByCommitID(req.CommitID) | |||
if err != nil { | |||
log.Error("GetRepositoryByID failed:", err.Error()) | |||
ctx.JSON(200, map[string]string{ | |||
"code" : "-1", | |||
"message" : "internal error", | |||
}) | |||
return | |||
} | |||
if blockChain.Status == models.BlockChainCommitSuccess { | |||
log.Error("the commit has been BlockChainCommitReady:", blockChain.RepoID) | |||
ctx.JSON(200, map[string]string{ | |||
"code" : "-1", | |||
"message" : "the commit has been BlockChainCommitReady", | |||
}) | |||
return | |||
} | |||
blockChain.Status = models.BlockChainCommitSuccess | |||
blockChain.TransactionHash = req.TransactionHash | |||
if err = models.UpdateBlockChainCols(blockChain, "status", "transaction_hash"); err != nil { | |||
log.Error("UpdateBlockChainCols failed:", err.Error()) | |||
ctx.JSON(200, map[string]string{ | |||
"code" : "-1", | |||
"message" : "internal error", | |||
}) | |||
return | |||
} | |||
ctx.JSON(200, map[string]string{ | |||
"code": "0", | |||
"message": "", | |||
}) | |||
} | |||
func HandleBlockChainUnSuccessRepos() { | |||
repos, err := models.GetBlockChainUnSuccessRepos() | |||
if err != nil { | |||
log.Error("GetBlockChainUnSuccessRepos failed:", err.Error()) | |||
return | |||
} | |||
for _, repo := range repos { | |||
err = repo.GetOwner() | |||
if err != nil { | |||
log.Error("GetOwner(%s) failed:%v", repo.Name, err) | |||
continue | |||
} | |||
if len(repo.Owner.PrivateKey) == 0 || len(repo.Owner.PublicKey) == 0 { | |||
log.Error("the user has not been init in block_chain:", repo.Owner.Name) | |||
continue | |||
} | |||
strRepoID := strconv.FormatInt(repo.ID, 10) | |||
log.Info(strRepoID) | |||
_, err = blockchain.NewRepo(strRepoID, repo.Owner.PublicKey, repo.Name) | |||
if err != nil { | |||
log.Error("blockchain.NewRepo(%s) failed:%v", strRepoID, err) | |||
} | |||
} | |||
return | |||
} | |||
func HandleBlockChainUnSuccessCommits() { | |||
blockChains, err := models.GetBlockChainUnSuccessCommits() | |||
if err != nil { | |||
log.Error("GetBlockChainUnSuccessCommits failed:", err.Error()) | |||
return | |||
} | |||
for _, block_chain := range blockChains { | |||
_, err = blockchain.Contribute(block_chain.ContractAddress, block_chain.Contributor, blockchain.ActionCommit, block_chain.CommitID, int(block_chain.Amount)) | |||
if err != nil { | |||
log.Error("blockchain.Contribute(%s) failed:%v", block_chain.CommitID, err) | |||
} | |||
} | |||
return | |||
} | |||
func HandleBlockChainUnSuccessUsers() { | |||
users, err := models.GetBlockChainUnSuccessUsers() | |||
if err != nil { | |||
log.Error("GetBlockChainUnSuccessUsers failed:", err.Error()) | |||
return | |||
} | |||
for _, user := range users { | |||
result, err := blockchain.CreateBlockchainAccount() | |||
if err != nil { | |||
log.Error("blockchain.CreateBlockchainAccount(%s) failed:%v", user.Name, err) | |||
continue | |||
} | |||
user.PublicKey = result.Payload["publickey"].(string) | |||
user.PrivateKey = result.Payload["privatekey"].(string) | |||
models.UpdateUser(user) | |||
} | |||
return | |||
} | |||
func HandleUnTransformedActions() { | |||
actions, err := models.GetUnTransformedActions() | |||
if err != nil { | |||
log.Error("GetUnTransformedActions failed:", err.Error()) | |||
return | |||
} | |||
isTransformed := true | |||
for _, action := range actions { | |||
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) | |||
break | |||
} | |||
repo, err := models.GetRepositoryByID(action.RepoID) | |||
if err != nil { | |||
isTransformed = false | |||
log.Error("GetRepositoryByID(%d) failed:%v", action.RepoID, err) | |||
break | |||
} | |||
if repo.ContractAddress == "" { | |||
isTransformed = false | |||
log.Error("the repo(%s) has not been initialized in block_chain", repo.Name) | |||
break | |||
} | |||
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) | |||
break | |||
} | |||
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) | |||
break | |||
} | |||
} | |||
} | |||
log.Info("", isTransformed) | |||
return | |||
} |
@@ -544,6 +544,11 @@ func RegisterRoutes(m *macaron.Macaron) { | |||
m.Post("/action/:action", user.Action) | |||
}, reqSignIn) | |||
m.Group("/blockchain", func() { | |||
m.Post("/init_notify", repo.HandleBlockChainInitNotify) | |||
m.Post("/commit_notify", repo.HandleBlockChainCommitNotify) | |||
}) | |||
if macaron.Env == macaron.DEV { | |||
m.Get("/template/*", dev.TemplatePreview) | |||
} | |||