From 7a3d914487cbe82da3e57d4a3f53e87a066937ac Mon Sep 17 00:00:00 2001 From: Ragot Geoffrey Date: Wed, 26 Jan 2022 16:29:04 +0100 Subject: [PATCH] expose transaction batch commit to http api MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Geoffrey Ragot Co-authored-by: Clément Salaün --- pkg/api/controllers/transaction_controller.go | 31 +++++++++++++++++++ pkg/api/routes/routes.go | 1 + pkg/core/transaction.go | 5 +++ 3 files changed, 37 insertions(+) diff --git a/pkg/api/controllers/transaction_controller.go b/pkg/api/controllers/transaction_controller.go index 5f294ca7d..01fb0ea7f 100644 --- a/pkg/api/controllers/transaction_controller.go +++ b/pkg/api/controllers/transaction_controller.go @@ -216,3 +216,34 @@ func (ctl *TransactionController) PostTransactionMetadata(c *gin.Context) { nil, ) } + +// PostTransactionsBatch godoc +// @Summary Create Transactions Batch +// @Description Create a new ledger transactions batch +// @Tags transactions +// @Schemes +// @Description Commit a batch of new transactions to the ledger +// @Param ledger path string true "ledger" +// @Param transactions body core.Transactions true "transactions" +// @Accept json +// @Produce json +// @Success 200 {object} controllers.BaseResponse +// @Failure 400 +// @Router /{ledger}/transactions/batch [post] +func (ctl *TransactionController) PostTransactionsBatch(c *gin.Context) { + l, _ := c.Get("ledger") + + var transactions core.Transactions + if err := c.ShouldBindJSON(&transactions); err != nil { + ctl.responseError(c, http.StatusBadRequest, err) + return + } + + ret, err := l.(*ledger.Ledger).Commit(c.Request.Context(), transactions.Transactions) + if err != nil { + ctl.responseError(c, http.StatusBadRequest, err) + return + } + + ctl.response(c, http.StatusOK, ret) +} diff --git a/pkg/api/routes/routes.go b/pkg/api/routes/routes.go index 85680e5f1..7e7dd554e 100644 --- a/pkg/api/routes/routes.go +++ b/pkg/api/routes/routes.go @@ -103,6 +103,7 @@ func (r *Routes) Engine(cc cors.Config) *gin.Engine { // TransactionController ledger.GET("/transactions", r.transactionController.GetTransactions) ledger.POST("/transactions", r.transactionController.PostTransaction) + ledger.POST("/transactions/batch", r.transactionController.PostTransactionsBatch) ledger.GET("/transactions/:txid", r.transactionController.GetTransaction) ledger.POST("/transactions/:txid/revert", r.transactionController.RevertTransaction) ledger.POST("/transactions/:txid/metadata", r.transactionController.PostTransactionMetadata) diff --git a/pkg/core/transaction.go b/pkg/core/transaction.go index a6eb3ebfd..de1557f84 100644 --- a/pkg/core/transaction.go +++ b/pkg/core/transaction.go @@ -6,6 +6,11 @@ import ( "fmt" ) +// Transactions struct +type Transactions struct { + Transactions []Transaction `json:"transactions" binding:"required,dive"` +} + type Transaction struct { ID int64 `json:"txid"` Postings Postings `json:"postings"`