Skip to content

Commit

Permalink
Merge pull request #126 from numary/feature/rules
Browse files Browse the repository at this point in the history
Add contracts.
  • Loading branch information
flemzord authored Jan 19, 2022
2 parents 6fc2f7c + 806431d commit 9d7d8e3
Show file tree
Hide file tree
Showing 18 changed files with 756 additions and 10 deletions.
5 changes: 4 additions & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -40,4 +40,7 @@ require (
go.uber.org/fx v1.16.0
)

require github.com/go-logr/stdr v1.2.2 // indirect
require (
github.com/davecgh/go-spew v1.1.1 // indirect
github.com/go-logr/stdr v1.2.2 // indirect
)
1 change: 1 addition & 0 deletions pkg/api/controllers/controllers.go
Original file line number Diff line number Diff line change
Expand Up @@ -36,4 +36,5 @@ var Module = fx.Options(
fx.Provide(NewScriptController),
fx.Provide(NewAccountController),
fx.Provide(NewTransactionController),
fx.Provide(NewMappingController),
)
79 changes: 79 additions & 0 deletions pkg/api/controllers/mapping_controller.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
package controllers

import (
"github.com/gin-gonic/gin"
"github.com/numary/ledger/pkg/core"
"github.com/numary/ledger/pkg/ledger"
"net/http"
)

type MappingController struct {
BaseController
}

func NewMappingController() MappingController {
return MappingController{}
}

// PutMapping godoc
// @Summary Put mapping
// @Description Update ledger mapping
// @Tags mapping
// @Schemes
// @Param ledger path string true "ledger"
// @Accept json
// @Produce json
// @Success 200 {object} controllers.BaseResponse
// @Failure 404 {object} controllers.BaseResponse
// @Router /{ledger}/mapping [put]
func (ctl *MappingController) PutMapping(c *gin.Context) {
l, _ := c.Get("ledger")

mapping := &core.Mapping{}
err := c.ShouldBind(mapping)
if err != nil {
ctl.responseError(c, http.StatusBadRequest, err)
return
}

err = l.(*ledger.Ledger).SaveMapping(c.Request.Context(), *mapping)
if err != nil {
ctl.responseError(
c,
http.StatusInternalServerError,
err,
)
return
}
ctl.response(
c,
http.StatusOK,
mapping,
)
}

// GetMapping godoc
// @Summary Get mapping
// @Description Get ledger mapping
// @Tags contracts
// @Schemes
// @Param ledger path string true "ledger"
// @Accept json
// @Produce json
// @Success 200 {object} controllers.BaseResponse
// @Failure 404 {object} controllers.BaseResponse
// @Router /{ledger}/mapping [get]
func (ctl *MappingController) GetMapping(c *gin.Context) {
l, _ := c.Get("ledger")

mapping, err := l.(*ledger.Ledger).LoadMapping(c.Request.Context())
if err != nil {
ctl.responseError(c, http.StatusInternalServerError, err)
return
}
ctl.response(
c,
http.StatusOK,
mapping,
)
}
7 changes: 7 additions & 0 deletions pkg/api/routes/routes.go
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ type Routes struct {
scriptController controllers.ScriptController
accountController controllers.AccountController
transactionController controllers.TransactionController
mappingController controllers.MappingController
globalMiddlewares []gin.HandlerFunc
perLedgerMiddlewares []gin.HandlerFunc
}
Expand All @@ -59,6 +60,7 @@ func NewRoutes(
scriptController controllers.ScriptController,
accountController controllers.AccountController,
transactionController controllers.TransactionController,
mappingController controllers.MappingController,
) *Routes {
return &Routes{
globalMiddlewares: globalMiddlewares,
Expand All @@ -71,6 +73,7 @@ func NewRoutes(
scriptController: scriptController,
accountController: accountController,
transactionController: transactionController,
mappingController: mappingController,
}
}

Expand Down Expand Up @@ -109,6 +112,10 @@ func (r *Routes) Engine(cc cors.Config) *gin.Engine {
ledger.GET("/accounts/:address", r.accountController.GetAccount)
ledger.POST("/accounts/:address/metadata", r.accountController.PostAccountMetadata)

// MappingController
ledger.GET("/mapping", r.mappingController.GetMapping)
ledger.PUT("/mapping", r.mappingController.PutMapping)

// ScriptController
ledger.POST("/script", r.scriptController.PostScript)
}
Expand Down
1 change: 0 additions & 1 deletion pkg/core/account.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ const (

type Account struct {
Address string `json:"address" example:"users:001"`
Contract string `json:"contract" example:"default"`
Type string `json:"type,omitempty" example:"virtual"`
Balances map[string]int64 `json:"balances,omitempty" example:"COIN:100"`
Volumes map[string]map[string]int64 `json:"volumes,omitempty"`
Expand Down
39 changes: 39 additions & 0 deletions pkg/core/contract.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package core

import (
"encoding/json"
"regexp"
"strings"
)

type Contract struct {
Expr Expr `json:"expr"`
Account string `json:"account"`
}

func (c *Contract) UnmarshalJSON(data []byte) error {
type AuxContract Contract
type Aux struct {
AuxContract
Expr map[string]interface{} `json:"expr"`
}
aux := Aux{}
err := json.Unmarshal(data, &aux)
if err != nil {
return err
}
expr, err := ParseRuleExpr(aux.Expr)
if err != nil {
return err
}
*c = Contract{
Expr: expr,
Account: aux.Account,
}
return nil
}

func (c Contract) Match(addr string) bool {
r := strings.ReplaceAll(c.Account, "*", ".*")
return regexp.MustCompile(r).Match([]byte(addr))
}
14 changes: 14 additions & 0 deletions pkg/core/contract_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package core

import (
"encoding/json"
"github.com/stretchr/testify/assert"
"testing"
)

func TestContract_UnmarshalJSON(t *testing.T) {
contract := &Contract{}
data := `{"id": "foo", "account": "order:*", "expr": { "$gte": ["$balance", 0] }}`
err := json.Unmarshal([]byte(data), contract)
assert.NoError(t, err)
}
Loading

0 comments on commit 9d7d8e3

Please sign in to comment.