OSDN Git Service

Hulk did something
[bytom/vapor.git] / api / request.go
diff --git a/api/request.go b/api/request.go
new file mode 100644 (file)
index 0000000..28f62b3
--- /dev/null
@@ -0,0 +1,70 @@
+package api
+
+import (
+       "context"
+       "strings"
+
+       "github.com/vapor/consensus"
+       "github.com/vapor/encoding/json"
+       "github.com/vapor/errors"
+       "github.com/vapor/protocol/bc/types"
+)
+
+// action error
+var (
+       ErrBadActionType         = errors.New("bad action type")
+       ErrBadAction             = errors.New("bad action object")
+       ErrBadActionConstruction = errors.New("bad action construction")
+)
+
+// BuildRequest is main struct when building transactions
+type BuildRequest struct {
+       Tx        *types.TxData            `json:"base_transaction"`
+       Actions   []map[string]interface{} `json:"actions"`
+       TTL       json.Duration            `json:"ttl"`
+       TimeRange uint64                   `json:"time_range"`
+}
+
+func (a *API) completeMissingIDs(ctx context.Context, br *BuildRequest) error {
+       for i, m := range br.Actions {
+               if err := a.completeMissingAssetID(m, i); err != nil {
+                       return err
+               }
+               if err := a.completeMissingAccountID(m, i, ctx); err != nil {
+                       return err
+               }
+       }
+       return nil
+}
+
+func (a *API) completeMissingAssetID(m map[string]interface{}, index int) error {
+       id, _ := m["asset_id"].(string)
+       alias, _ := m["asset_alias"].(string)
+       if id == "" && alias != "" {
+               alias = strings.ToUpper(alias)
+               switch alias {
+               case consensus.BTMAlias:
+                       m["asset_id"] = consensus.BTMAssetID.String()
+               default:
+                       asset, err := a.wallet.AssetReg.FindByAlias(alias)
+                       if err != nil {
+                               return errors.WithDetailf(err, "invalid asset alias %s on action %d", alias, index)
+                       }
+                       m["asset_id"] = asset.AssetID.String()
+               }
+       }
+       return nil
+}
+
+func (a *API) completeMissingAccountID(m map[string]interface{}, index int, ctx context.Context) error {
+       id, _ := m["account_id"].(string)
+       alias, _ := m["account_alias"].(string)
+       if id == "" && alias != "" {
+               acc, err := a.wallet.AccountMgr.FindByAlias(alias)
+               if err != nil {
+                       return errors.WithDetailf(err, "invalid account alias %s on action %d", alias, index)
+               }
+               m["account_id"] = acc.ID
+       }
+       return nil
+}