Skip to content

Commit 8afe9b7

Browse files
authored
Merge pull request #89 from numary/feature/make-stateless
feature/make stateless
2 parents 86d1cca + ec716fa commit 8afe9b7

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

45 files changed

+1140
-640
lines changed

api/api.go

Lines changed: 5 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,14 @@
11
package api
22

33
import (
4-
"context"
54
_ "embed"
5+
"net/http"
66

77
"github.com/gin-contrib/cors"
88
"github.com/gin-gonic/gin"
99
"github.com/numary/ledger/api/controllers"
1010
"github.com/numary/ledger/api/middlewares"
1111
"github.com/numary/ledger/api/routes"
12-
"github.com/spf13/viper"
1312
"go.uber.org/fx"
1413
)
1514

@@ -21,13 +20,15 @@ var Module = fx.Options(
2120

2221
// API struct
2322
type API struct {
24-
addr string
2523
engine *gin.Engine
2624
}
2725

26+
func (a *API) ServeHTTP(w http.ResponseWriter, r *http.Request) {
27+
a.engine.ServeHTTP(w, r)
28+
}
29+
2830
// NewAPI
2931
func NewAPI(
30-
lc fx.Lifecycle,
3132
routes *routes.Routes,
3233
) *API {
3334
gin.SetMode(gin.ReleaseMode)
@@ -38,21 +39,8 @@ func NewAPI(
3839
cc.AddAllowHeaders("authorization")
3940

4041
h := &API{
41-
addr: viper.GetString("server.http.bind_address"),
4242
engine: routes.Engine(cc),
4343
}
4444

45-
lc.Append(fx.Hook{
46-
OnStart: func(c context.Context) error {
47-
go h.Start()
48-
return nil
49-
},
50-
})
51-
5245
return h
5346
}
54-
55-
// Start
56-
func (h *API) Start() {
57-
h.engine.Run(h.addr)
58-
}

api/controllers/account_controller.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ func NewAccountController() AccountController {
3030
func (ctl *AccountController) GetAccounts(c *gin.Context) {
3131
l, _ := c.Get("ledger")
3232
cursor, err := l.(*ledger.Ledger).FindAccounts(
33+
c,
3334
query.After(c.Query("after")),
3435
)
3536
if err != nil {
@@ -58,7 +59,7 @@ func (ctl *AccountController) GetAccounts(c *gin.Context) {
5859
// @Router /{ledger}/accounts/{accountId} [get]
5960
func (ctl *AccountController) GetAccount(c *gin.Context) {
6061
l, _ := c.Get("ledger")
61-
acc, err := l.(*ledger.Ledger).GetAccount(c.Param("address"))
62+
acc, err := l.(*ledger.Ledger).GetAccount(c, c.Param("address"))
6263
if err != nil {
6364
ctl.responseError(
6465
c,
@@ -88,6 +89,7 @@ func (ctl *AccountController) PostAccountMetadata(c *gin.Context) {
8889
var m core.Metadata
8990
c.ShouldBind(&m)
9091
err := l.(*ledger.Ledger).SaveMeta(
92+
c,
9193
"account",
9294
c.Param("address"),
9395
m,

api/controllers/config_controller.go

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,17 +8,32 @@ import (
88
"github.com/gin-gonic/gin"
99
"github.com/numary/ledger/config"
1010
_ "github.com/numary/ledger/docs"
11-
"github.com/spf13/viper"
1211
)
1312

13+
type LedgerLister interface {
14+
List() []string
15+
}
16+
type LedgerListerFn func() []string
17+
18+
func (fn LedgerListerFn) List() []string {
19+
return fn()
20+
}
21+
1422
// ConfigController -
1523
type ConfigController struct {
1624
BaseController
25+
Version string
26+
StorageDriver string
27+
LedgerLister LedgerLister
1728
}
1829

1930
// NewConfigController -
20-
func NewConfigController() ConfigController {
21-
return ConfigController{}
31+
func NewConfigController(version string, storageDriver string, lister LedgerLister) ConfigController {
32+
return ConfigController{
33+
Version: version,
34+
StorageDriver: storageDriver,
35+
LedgerLister: lister,
36+
}
2237
}
2338

2439
// GetInfo godoc
@@ -36,11 +51,11 @@ func (ctl *ConfigController) GetInfo(c *gin.Context) {
3651
http.StatusOK,
3752
config.ConfigInfo{
3853
Server: "numary-ledger",
39-
Version: viper.Get("version"),
54+
Version: ctl.Version,
4055
Config: &config.Config{
4156
LedgerStorage: &config.LedgerStorage{
42-
Driver: viper.Get("storage.driver"),
43-
Ledgers: viper.Get("ledgers"),
57+
Driver: ctl.StorageDriver,
58+
Ledgers: ctl.LedgerLister.List(),
4459
},
4560
},
4661
},

api/controllers/controllers.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,9 @@ import (
55
)
66

77
var Module = fx.Options(
8-
fx.Provide(NewConfigController),
8+
fx.Provide(
9+
fx.Annotate(NewConfigController, fx.ParamTags(`name:"version"`, `name:"storageDriver"`, `name:"ledgerLister"`)),
10+
),
911
fx.Provide(NewLedgerController),
1012
fx.Provide(NewScriptController),
1113
fx.Provide(NewAccountController),

api/controllers/ledger_controller.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ func NewLedgerController() LedgerController {
3131
func (ctl *LedgerController) GetStats(c *gin.Context) {
3232
l, _ := c.Get("ledger")
3333

34-
stats, err := l.(*ledger.Ledger).Stats()
34+
stats, err := l.(*ledger.Ledger).Stats(c)
3535
if err != nil {
3636
ctl.responseError(
3737
c,

api/controllers/script_controller.go

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import (
44
"encoding/base64"
55
"encoding/json"
66
"fmt"
7-
"log"
87
"strings"
98

109
"github.com/gin-gonic/gin"
@@ -39,24 +38,24 @@ func (ctl *ScriptController) PostScript(c *gin.Context) {
3938
var script core.Script
4039
c.ShouldBind(&script)
4140

42-
err := l.(*ledger.Ledger).Execute(script)
41+
err := l.(*ledger.Ledger).Execute(c, script)
4342

4443
res := gin.H{
4544
"ok": err == nil,
4645
}
4746

4847
if err != nil {
49-
err_str := err.Error()
50-
err_str = strings.ReplaceAll(err_str, "\n", "\r\n")
48+
errStr := err.Error()
49+
errStr = strings.ReplaceAll(errStr, "\n", "\r\n")
5150
payload, err := json.Marshal(gin.H{
52-
"error": err_str,
51+
"error": errStr,
5352
})
5453
if err != nil {
55-
log.Fatal(err)
54+
panic(err)
5655
}
57-
payload_b64 := base64.StdEncoding.EncodeToString([]byte(payload))
58-
link := fmt.Sprintf("https://play.numscript.org/?payload=%v", payload_b64)
59-
res["err"] = err_str
56+
payloadB64 := base64.StdEncoding.EncodeToString(payload)
57+
link := fmt.Sprintf("https://play.numscript.org/?payload=%v", payloadB64)
58+
res["err"] = errStr
6059
res["details"] = link
6160
}
6261

api/controllers/transaction_controller.go

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ func NewTransactionController() TransactionController {
3434
func (ctl *TransactionController) GetTransactions(c *gin.Context) {
3535
l, _ := c.Get("ledger")
3636
cursor, err := l.(*ledger.Ledger).FindTransactions(
37+
c,
3738
query.After(c.Query("after")),
3839
query.Reference(c.Query("reference")),
3940
query.Account(c.Query("account")),
@@ -71,7 +72,7 @@ func (ctl *TransactionController) PostTransaction(c *gin.Context) {
7172
var t core.Transaction
7273
c.ShouldBind(&t)
7374

74-
ts, err := l.(*ledger.Ledger).Commit([]core.Transaction{t})
75+
ts, err := l.(*ledger.Ledger).Commit(c, []core.Transaction{t})
7576
if err != nil {
7677
ctl.responseError(
7778
c,
@@ -101,7 +102,7 @@ func (ctl *TransactionController) PostTransaction(c *gin.Context) {
101102
// @Router /{ledger}/transactions/{txid} [get]
102103
func (ctl *TransactionController) GetTransaction(c *gin.Context) {
103104
l, _ := c.Get("ledger")
104-
tx, err := l.(*ledger.Ledger).GetTransaction(c.Param("txid"))
105+
tx, err := l.(*ledger.Ledger).GetTransaction(c, c.Param("txid"))
105106
if err != nil {
106107
ctl.responseError(
107108
c,
@@ -138,7 +139,7 @@ func (ctl *TransactionController) GetTransaction(c *gin.Context) {
138139
// @Router /{ledger}/transactions/{txid}/revert [post]
139140
func (ctl *TransactionController) RevertTransaction(c *gin.Context) {
140141
l, _ := c.Get("ledger")
141-
err := l.(*ledger.Ledger).RevertTransaction(c.Param("txid"))
142+
err := l.(*ledger.Ledger).RevertTransaction(c, c.Param("txid"))
142143
if err != nil {
143144
ctl.responseError(
144145
c,
@@ -172,6 +173,7 @@ func (ctl *TransactionController) PostTransactionMetadata(c *gin.Context) {
172173
c.ShouldBind(&m)
173174

174175
err := l.(*ledger.Ledger).SaveMeta(
176+
c,
175177
"transaction",
176178
c.Param("txid"),
177179
m,

api/middlewares/auth_middleware.go

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,22 +4,25 @@ import (
44
"strings"
55

66
"github.com/gin-gonic/gin"
7-
"github.com/spf13/viper"
87
)
98

109
// AuthMiddleware struct
11-
type AuthMiddleware struct{}
10+
type AuthMiddleware struct {
11+
HTTPBasic string
12+
}
1213

1314
// NewAuthMiddleware
14-
func NewAuthMiddleware() AuthMiddleware {
15-
return AuthMiddleware{}
15+
func NewAuthMiddleware(httpBasic string) AuthMiddleware {
16+
return AuthMiddleware{
17+
HTTPBasic: httpBasic,
18+
}
1619
}
1720

1821
// AuthMiddleware
1922
func (m AuthMiddleware) AuthMiddleware(engine *gin.Engine) gin.HandlerFunc {
2023
return func(c *gin.Context) {
21-
if auth := viper.Get("server.http.basic_auth"); auth != nil {
22-
segment := strings.Split(auth.(string), ":")
24+
if auth := m.HTTPBasic; auth != "" {
25+
segment := strings.Split(auth, ":")
2326
engine.Use(gin.BasicAuth(gin.Accounts{
2427
segment[0]: segment[1],
2528
}))

api/middlewares/ledger_middleware.go

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package middlewares
33
import (
44
"github.com/gin-gonic/gin"
55
"github.com/numary/ledger/ledger"
6+
"github.com/sirupsen/logrus"
67
)
78

89
// LedgerMiddleware struct
@@ -28,15 +29,21 @@ func (m *LedgerMiddleware) LedgerMiddleware() gin.HandlerFunc {
2829
return
2930
}
3031

31-
l, err := m.resolver.GetLedger(name)
32-
32+
l, err := m.resolver.GetLedger(c, name)
3333
if err != nil {
3434
c.JSON(400, gin.H{
3535
"ok": false,
3636
"err": err.Error(),
3737
})
3838
}
39-
39+
defer func() {
40+
err := l.Close(c)
41+
if err != nil {
42+
logrus.Printf("error closing ledger: %s", err)
43+
}
44+
}()
4045
c.Set("ledger", l)
46+
47+
c.Next()
4148
}
4249
}

api/middlewares/middlewares.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ import (
55
)
66

77
var Module = fx.Options(
8-
fx.Provide(NewAuthMiddleware),
8+
fx.Provide(
9+
fx.Annotate(NewAuthMiddleware, fx.ParamTags(`name:"httpBasic"`)),
10+
),
911
fx.Provide(NewLedgerMiddleware),
1012
)

0 commit comments

Comments
 (0)