diff --git a/client/lib.go b/client/lib.go index 09a47878fdee6ed736f27afb856b538c2bbe54c9..9f2da12438e084b097a11712fce31d194df26f9b 100644 --- a/client/lib.go +++ b/client/lib.go @@ -29,6 +29,7 @@ var ( ErrNotFound = errors.New("not found") ErrUnauthorized = errors.New("unauthorized") ErrUnknownError = errors.New("unknown error") + ErrNotImplemented = errors.New("operation not implemented/supported/available") ) const ( @@ -87,6 +88,8 @@ func interpretBody(res *http.Response, decodeTo interface{}) error { return fmt.Errorf("%w: %s", ErrBadRequest, errRes.Error) case http.StatusUnauthorized: return fmt.Errorf("%w: %s", ErrUnauthorized, errRes.Error) + case http.StatusNotImplemented: + return fmt.Errorf("%w: %s", ErrNotImplemented, errRes.Error) } return fmt.Errorf("%w: %s", ErrUnknownError, errRes.Error) diff --git a/plugins/webapi/broadcastData/plugin.go b/plugins/webapi/broadcastData/plugin.go index 0ed2562f146492ef62128844986641b4d73846f7..2e30888e10d830d62765a3576b0f0efcf992a3c4 100644 --- a/plugins/webapi/broadcastData/plugin.go +++ b/plugins/webapi/broadcastData/plugin.go @@ -33,7 +33,7 @@ func broadcastData(c echo.Context) error { var request Request if err := c.Bind(&request); err != nil { log.Info(err.Error()) - return requestFailed(c, err.Error()) + return c.JSON(http.StatusBadRequest, Response{Error: err.Error()}) } log.Debug("Received - address:", request.Address, " data:", request.Data) @@ -44,22 +44,22 @@ func broadcastData(c echo.Context) error { buffer := make([]byte, 2187) if len(request.Data) > 2187 { - log.Warn("Data exceeding 2187 byte limit -", len(request.Data)) - return requestFailed(c, "Data exceeding 2187 byte limit") + log.Warnf("data exceeds 2187 byte limit - (payload data size: %d)", len(request.Data)) + return c.JSON(http.StatusBadRequest, Response{Error: "data exceeds 2187 byte limit"}) } copy(buffer, typeutils.StringToBytes(request.Data)) trytes, err := trinary.BytesToTrytes(buffer) if err != nil { - log.Warn("Trytes conversion failed", err.Error()) - return requestFailed(c, err.Error()) + log.Warnf("trytes conversion failed: %s", err.Error()) + return c.JSON(http.StatusBadRequest, Response{Error: err.Error()}) } err = address.ValidAddress(request.Address) if err != nil { - log.Warn("Invalid Address:", request.Address) - return requestFailed(c, err.Error()) + log.Warnf("invalid Address: %s", request.Address) + return c.JSON(http.StatusBadRequest, Response{Error: err.Error()}) } tx.SetAddress(request.Address) @@ -69,24 +69,12 @@ func broadcastData(c echo.Context) error { tx.SetTrunkTransactionHash(tipselection.GetRandomTip()) tx.SetTimestamp(uint(time.Now().Unix())) if err := tx.DoProofOfWork(meta_transaction.MIN_WEIGHT_MAGNITUDE); err != nil { - log.Warn("PoW failed", err) - return requestFailed(c, err.Error()) + log.Warnf("PoW failed: %s", err) + return c.JSON(http.StatusInternalServerError, Response{Error: err.Error()}) } gossip.Events.TransactionReceived.Trigger(&gossip.TransactionReceivedEvent{Data: tx.GetBytes(), Peer: &local.GetInstance().Peer}) - return requestSuccessful(c, tx.GetHash()) -} - -func requestSuccessful(c echo.Context, txHash string) error { - return c.JSON(http.StatusCreated, Response{ - Hash: txHash, - }) -} - -func requestFailed(c echo.Context, message string) error { - return c.JSON(http.StatusBadRequest, Response{ - Error: message, - }) + return c.JSON(http.StatusOK, Response{Hash: tx.GetHash()}) } type Response struct { diff --git a/plugins/webapi/findTransactionHashes/plugin.go b/plugins/webapi/findTransactionHashes/plugin.go index 07a626d9fc7bbecea5b6a23e0f7d4f88849c6da9..7ae655f84217564fa4811c0fd9025670ef4284d2 100644 --- a/plugins/webapi/findTransactionHashes/plugin.go +++ b/plugins/webapi/findTransactionHashes/plugin.go @@ -28,7 +28,7 @@ func findTransactionHashes(c echo.Context) error { if err := c.Bind(&request); err != nil { log.Info(err.Error()) - return requestFailed(c, err.Error()) + return c.JSON(http.StatusBadRequest, Response{Error: err.Error()}) } log.Debug("Received:", request.Addresses) result := make([][]trinary.Trytes, len(request.Addresses)) @@ -36,24 +36,12 @@ func findTransactionHashes(c echo.Context) error { for i, address := range request.Addresses { txs, err := tangle.ReadTransactionHashesForAddressFromDatabase(address) if err != nil { - return requestFailed(c, err.Error()) + return c.JSON(http.StatusInternalServerError, Response{Error: err.Error()}) } result[i] = append(result[i], txs...) } - return requestSuccessful(c, result) -} - -func requestSuccessful(c echo.Context, txHashes [][]trinary.Trytes) error { - return c.JSON(http.StatusOK, Response{ - Transactions: txHashes, - }) -} - -func requestFailed(c echo.Context, message string) error { - return c.JSON(http.StatusNotFound, Response{ - Error: message, - }) + return c.JSON(http.StatusOK, Response{Transactions: result}) } type Response struct { diff --git a/plugins/webapi/getNeighbors/plugin.go b/plugins/webapi/getNeighbors/plugin.go index 71e718ff817f9fc40121bc7b327a09b115efceb7..1ac033ce5b14bc057ece461eaa3d8645bbd3a1f9 100644 --- a/plugins/webapi/getNeighbors/plugin.go +++ b/plugins/webapi/getNeighbors/plugin.go @@ -26,11 +26,11 @@ func getNeighbors(c echo.Context) error { knownPeers := []Neighbor{} if autopeering.Selection == nil { - return requestFailed(c, "Neighbor Selection is not enabled") + return c.JSON(http.StatusNotImplemented, Response{Error: "Neighbor Selection is not enabled"}) } if autopeering.Discovery == nil { - return requestFailed(c, "Neighbor Discovery is not enabled") + return c.JSON(http.StatusNotImplemented, Response{Error: "Neighbor Discovery is not enabled"}) } if c.QueryParam("known") == "1" { @@ -45,7 +45,6 @@ func getNeighbors(c echo.Context) error { } for _, peer := range autopeering.Selection.GetOutgoingNeighbors() { - n := Neighbor{ ID: peer.ID().String(), PublicKey: base64.StdEncoding.EncodeToString(peer.PublicKey()), @@ -62,21 +61,7 @@ func getNeighbors(c echo.Context) error { accepted = append(accepted, n) } - return requestSuccessful(c, knownPeers, chosen, accepted) -} - -func requestSuccessful(c echo.Context, knownPeers, chosen, accepted []Neighbor) error { - return c.JSON(http.StatusOK, Response{ - KnownPeers: knownPeers, - Chosen: chosen, - Accepted: accepted, - }) -} - -func requestFailed(c echo.Context, message string) error { - return c.JSON(http.StatusNotFound, Response{ - Error: message, - }) + return c.JSON(http.StatusOK, Response{KnownPeers: knownPeers, Chosen: chosen, Accepted: accepted}) } type Response struct { diff --git a/plugins/webapi/getTransactionObjectsByHash/plugin.go b/plugins/webapi/getTransactionObjectsByHash/plugin.go index 221def3cdba855e876fdbaad72cb475dc38a6c1f..e2b0e766658d8f15765fbb017f31174a7001160d 100644 --- a/plugins/webapi/getTransactionObjectsByHash/plugin.go +++ b/plugins/webapi/getTransactionObjectsByHash/plugin.go @@ -1,6 +1,7 @@ package getTransactionObjectsByHash import ( + "fmt" "net/http" "github.com/iotaledger/goshimmer/plugins/tangle" @@ -30,7 +31,7 @@ func getTransactionObjectsByHash(c echo.Context) error { if err := c.Bind(&request); err != nil { log.Info(err.Error()) - return requestFailed(c, err.Error()) + return c.JSON(http.StatusBadRequest, Response{Error: err.Error()}) } log.Debug("Received:", request.Hashes) @@ -38,43 +39,28 @@ func getTransactionObjectsByHash(c echo.Context) error { for _, hash := range request.Hashes { tx, err := tangle.GetTransaction(hash) if err != nil { - return requestFailed(c, err.Error()) + return c.JSON(http.StatusInternalServerError, Response{Error: err.Error()}) } - if tx != nil { - t := Transaction{ - Hash: tx.GetHash(), - WeightMagnitude: tx.GetWeightMagnitude(), - TrunkTransactionHash: tx.GetTrunkTransactionHash(), - BranchTransactionHash: tx.GetBranchTransactionHash(), - Head: tx.IsHead(), - Tail: tx.IsTail(), - Nonce: tx.GetNonce(), - Address: tx.GetAddress(), - Value: tx.GetValue(), - Timestamp: tx.GetTimestamp(), - SignatureMessageFragment: tx.GetSignatureMessageFragment(), - } - result = append(result, t) - } else { - //tx not found - result = append(result, Transaction{}) + if tx == nil { + return c.JSON(http.StatusNotFound, Response{Error: fmt.Sprintf("transaction not found: %s", hash)}) } - + t := Transaction{ + Hash: tx.GetHash(), + WeightMagnitude: tx.GetWeightMagnitude(), + TrunkTransactionHash: tx.GetTrunkTransactionHash(), + BranchTransactionHash: tx.GetBranchTransactionHash(), + Head: tx.IsHead(), + Tail: tx.IsTail(), + Nonce: tx.GetNonce(), + Address: tx.GetAddress(), + Value: tx.GetValue(), + Timestamp: tx.GetTimestamp(), + SignatureMessageFragment: tx.GetSignatureMessageFragment(), + } + result = append(result, t) } - return requestSuccessful(c, result) -} - -func requestSuccessful(c echo.Context, txs []Transaction) error { - return c.JSON(http.StatusOK, Response{ - Transactions: txs, - }) -} - -func requestFailed(c echo.Context, message string) error { - return c.JSON(http.StatusNotFound, Response{ - Error: message, - }) + return c.JSON(http.StatusOK, Response{Transactions: result}) } type Response struct { diff --git a/plugins/webapi/getTransactionTrytesByHash/plugin.go b/plugins/webapi/getTransactionTrytesByHash/plugin.go index b4bb36136d59cca735b790ed677f306e8e3d175c..3b9a00b4406eda75a28095844afc150041501cfa 100644 --- a/plugins/webapi/getTransactionTrytesByHash/plugin.go +++ b/plugins/webapi/getTransactionTrytesByHash/plugin.go @@ -1,6 +1,7 @@ package getTransactionTrytesByHash import ( + "fmt" "net/http" "github.com/iotaledger/goshimmer/plugins/tangle" @@ -29,38 +30,23 @@ func getTransactionTrytesByHash(c echo.Context) error { result := []trinary.Trytes{} if err := c.Bind(&request); err != nil { log.Info(err.Error()) - return requestFailed(c, err.Error()) + return c.JSON(http.StatusBadRequest, Response{Error: err.Error()}) } log.Debug("Received:", request.Hashes) for _, hash := range request.Hashes { tx, err := tangle.GetTransaction(hash) if err != nil { - return requestFailed(c, err.Error()) + return c.JSON(http.StatusInternalServerError, Response{Error: err.Error()}) } - if tx != nil { - trytes := trinary.MustTritsToTrytes(tx.GetTrits()) - result = append(result, trytes) - } else { - //tx not found - result = append(result, "") + if tx == nil { + return c.JSON(http.StatusNotFound, Response{Error: fmt.Sprintf("transaction not found: %s", hash)}) } - + trytes := trinary.MustTritsToTrytes(tx.GetTrits()) + result = append(result, trytes) } - return requestSuccessful(c, result) -} - -func requestSuccessful(c echo.Context, txTrytes []trinary.Trytes) error { - return c.JSON(http.StatusOK, Response{ - Trytes: txTrytes, - }) -} - -func requestFailed(c echo.Context, message string) error { - return c.JSON(http.StatusNotFound, Response{ - Error: message, - }) + return c.JSON(http.StatusOK, Response{Trytes: result}) } type Response struct { diff --git a/plugins/webapi/spammer/plugin.go b/plugins/webapi/spammer/plugin.go index fdc1aca338a2ddbbfdbcd666ce9ac802866b63be..7aa057fc2fc18c85982fa27ef373b1f8a3b586b6 100644 --- a/plugins/webapi/spammer/plugin.go +++ b/plugins/webapi/spammer/plugin.go @@ -19,7 +19,7 @@ func WebApiHandler(c echo.Context) error { var request Request if err := c.Bind(&request); err != nil { - return requestFailed(c, err.Error()) + return c.JSON(http.StatusBadRequest, Response{Error: err.Error()}) } switch request.Cmd { @@ -30,33 +30,18 @@ func WebApiHandler(c echo.Context) error { transactionspammer.Stop() transactionspammer.Start(request.Tps) - - return requestSuccessful(c, "started spamming transactions") - + return c.JSON(http.StatusOK, Response{Message: "started spamming transactions"}) case "stop": transactionspammer.Stop() - - return requestSuccessful(c, "stopped spamming transactions") - + return c.JSON(http.StatusOK, Response{Message: "stopped spamming transactions"}) default: - return requestFailed(c, "invalid cmd in request") + return c.JSON(http.StatusBadRequest, Response{Error: "invalid cmd in request"}) } } -func requestSuccessful(c echo.Context, message string) error { - return c.JSON(http.StatusOK, Response{ - Message: message, - }) -} - -func requestFailed(c echo.Context, message string) error { - return c.JSON(http.StatusNotFound, Response{ - Message: message, - }) -} - type Response struct { Message string `json:"message"` + Error string `json:"error"` } type Request struct {