Browse Source

add notify interface

tags/v0.1.8
yuyuanshifu 4 years ago
parent
commit
9d7c9eb150
5 changed files with 168 additions and 4 deletions
  1. +48
    -1
      models/blockchain.go
  2. +8
    -0
      models/repo.go
  3. +6
    -3
      modules/blockchain/resty.go
  4. +101
    -0
      routers/repo/blockchain.go
  5. +5
    -0
      routers/routes/routes.go

+ 48
- 1
models/blockchain.go View File

@@ -2,14 +2,22 @@ package models

import (
"code.gitea.io/gitea/modules/timeutil"
"fmt"
"time"
)

type BlockChainCommitStatus int
const (
BlockChainCommitInit BlockChainCommitStatus = iota
BlockChainCommitReady
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"`
Action string `xorm:"INDEX"`
Status BlockChainCommitStatus `xorm:"INDEX NOT NULL DEFAULT 0"`
Amount int64 `xorm:"INDEX"`
UserID int64 `xorm:"INDEX"`
RepoID int64 `xorm:"INDEX"`
@@ -21,3 +29,42 @@ type BlockChain struct {
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...)
}


+ 8
- 0
models/repo.go View File

@@ -135,6 +135,7 @@ func NewRepoContext() {

// RepositoryStatus defines the status of repository
type RepositoryStatus int
type RepoBlockChainStatus int

// all kinds of RepositoryStatus
const (
@@ -142,6 +143,12 @@ const (
RepositoryBeingMigrated // repository is migrating
)

const (
RepoBlockChainInit RepoBlockChainStatus = iota
RepoBlockChainReady
RepoBlockChainFailed
)

// Repository represents a git repository.
type Repository struct {
ID int64 `xorm:"pk autoincr"`
@@ -199,6 +206,7 @@ type Repository struct {
//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"`


+ 6
- 3
modules/blockchain/resty.go View File

@@ -120,15 +120,18 @@ func GetBalance(contractAddress, contributor string) (*GetBalanceResult, error)
return &result, nil
}

func Contribute(jobID string) (*ContributeResult, error) {
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" : "",
"contributor" : "",
"contractAddress" : contractAddress,
"contributor" : contributor,
"action" : action,
"commitId": commitId,
"amount": string(codeLine),
}).
SetResult(&result).
Get(setting.BlockChainHost + UrlContribute)


+ 101
- 0
routers/repo/blockchain.go View File

@@ -0,0 +1,101 @@
package repo

import (
"encoding/json"

"code.gitea.io/gitea/models"
"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"`
}

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{
"result_code" : "-1",
"message" : "internal error",
})
return
}

if repo.BlockChainStatus == models.RepoBlockChainReady && len(repo.ContractAddress) != 0 {
log.Error("the repo has been RepoBlockChainReady:", req.RepoId)
ctx.JSON(200, map[string]string{
"result_code" : "-1",
"message" : "the repo has been RepoBlockChainReady",
})
return
}

repo.BlockChainStatus = models.RepoBlockChainReady
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{
"result_code" : "-1",
"message" : "internal error",
})
return
}

ctx.JSON(200, map[string]string{
"result_code": "0",
})
}

func HandleBlockChainCommitNotify(ctx *context.Context) {
//contributor := ctx.Query("contributor")
//contractAddress := ctx.Query("contractAddress")
var req BlockChainCommitNotify
data, _ := ctx.Req.Body().Bytes()
json.Unmarshal(data, &req)

blockChain, err := models.GetBlockChainByCommitID(req.CommitID)
if err != nil {
log.Error("GetRepositoryByID failed:", err.Error())
ctx.JSON(200, map[string]string{
"result_code" : "-1",
"message" : "internal error",
})
return
}

if blockChain.Status == models.BlockChainCommitReady {
log.Error("the commit has been BlockChainCommitReady:", blockChain.RepoID)
ctx.JSON(200, map[string]string{
"result_code" : "-1",
"message" : "the commit has been BlockChainCommitReady",
})
return
}

blockChain.Status = models.BlockChainCommitReady

if err = models.UpdateBlockChainCols(blockChain, "status"); err != nil {
log.Error("UpdateBlockChainCols failed:", err.Error())
ctx.JSON(200, map[string]string{
"result_code" : "-1",
"message" : "internal error",
})
return
}

ctx.JSON(200, map[string]string{
"result_code": "0",
})
}

+ 5
- 0
routers/routes/routes.go View File

@@ -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)
}


Loading…
Cancel
Save