Skip to content
Snippets Groups Projects
  • Hans Moog's avatar
    c31c2e5d
    Feat: refactored message + started to add tests (#316) · c31c2e5d
    Hans Moog authored
    * Feat: refactored message + started to add tests
    
    * Refactor: go mod tidy
    
    * Refactor: continued to refactor message
    
    * Feat: updated to last hive.go + added Signature() methid
    
    * Feat: go mod tidy
    
    * Feat: added mutex to the signature write in Bytes()
    
    * Fix: fixed Signature method
    
    * Feat: refactored message methods
    Feat: refactored message + started to add tests (#316)
    Hans Moog authored
    * Feat: refactored message + started to add tests
    
    * Refactor: go mod tidy
    
    * Refactor: continued to refactor message
    
    * Feat: updated to last hive.go + added Signature() methid
    
    * Feat: go mod tidy
    
    * Feat: added mutex to the signature write in Bytes()
    
    * Fix: fixed Signature method
    
    * Feat: refactored message methods
explorer_routes.go 3.94 KiB
package spa

import (
	"net/http"
	"sync"

	"github.com/iotaledger/goshimmer/packages/binary/messagelayer/message"
	"github.com/iotaledger/goshimmer/plugins/messagelayer"

	"github.com/labstack/echo"
	"github.com/pkg/errors"
)

type ExplorerTx struct {
	Hash                     string `json:"hash"`
	SignatureMessageFragment string `json:"signature_message_fragment"`
	Address                  string `json:"address"`
	Value                    int64  `json:"value"`
	Timestamp                uint   `json:"timestamp"`
	Trunk                    string `json:"trunk"`
	Branch                   string `json:"branch"`
	Solid                    bool   `json:"solid"`
	MWM                      int    `json:"mwm"`
}

func createExplorerTx(tx *message.Message) (*ExplorerTx, error) {
	transactionId := tx.Id()

	txMetadata := messagelayer.Tangle.MessageMetadata(transactionId)

	t := &ExplorerTx{
		Hash:                     transactionId.String(),
		SignatureMessageFragment: "",
		Address:                  "",
		Timestamp:                0,
		Value:                    0,
		Trunk:                    tx.TrunkId().String(),
		Branch:                   tx.BranchId().String(),
		Solid:                    txMetadata.Unwrap().IsSolid(),
	}

	// TODO: COMPUTE MWM
	t.MWM = 0

	return t, nil
}

type ExplorerAdress struct {
	Txs []*ExplorerTx `json:"txs"`
}

type SearchResult struct {
	Tx        *ExplorerTx     `json:"tx"`
	Address   *ExplorerAdress `json:"address"`
	Milestone *ExplorerTx     `json:"milestone"`
}

func setupExplorerRoutes(routeGroup *echo.Group) {
	routeGroup.GET("/tx/:hash", func(c echo.Context) (err error) {
		transactionId, err := message.NewId(c.Param("hash"))
		if err != nil {
			return
		}

		t, err := findTransaction(transactionId)
		if err != nil {
			return
		}

		return c.JSON(http.StatusOK, t)
	})

	routeGroup.GET("/addr/:hash", func(c echo.Context) error {
		addr, err := findAddress(c.Param("hash"))
		if err != nil {
			return err
		}
		return c.JSON(http.StatusOK, addr)
	})

	routeGroup.GET("/search/:search", func(c echo.Context) error {
		search := c.Param("search")
		result := &SearchResult{}

		if len(search) < 81 {
			return errors.Wrapf(ErrInvalidParameter, "search hash invalid: %s", search)
		}

		wg := sync.WaitGroup{}
		wg.Add(2)
		go func() {
			defer wg.Done()

			transactionId, err := message.NewId(search)
			if err != nil {
				return
			}

			tx, err := findTransaction(transactionId)
			if err == nil {
				result.Tx = tx
			}
		}()

		go func() {
			defer wg.Done()
			addr, err := findAddress(search)
			if err == nil {
				result.Address = addr
			}
		}()
		wg.Wait()

		return c.JSON(http.StatusOK, result)
	})
}

func findTransaction(transactionId message.Id) (explorerTx *ExplorerTx, err error) {
	if !messagelayer.Tangle.Message(transactionId).Consume(func(transaction *message.Message) {
		explorerTx, err = createExplorerTx(transaction)
	}) {
		err = errors.Wrapf(ErrNotFound, "tx hash: %s", transactionId.String())
	}

	return
}

func findAddress(address string) (*ExplorerAdress, error) {
	return nil, errors.Wrapf(ErrNotFound, "address %s not found", address)

	// TODO: ADD ADDRESS LOOKUPS ONCE THE VALUE TRANSFER ONTOLOGY IS MERGED

	/*
		if len(hash) > 81 {
			hash = hash[:81]
		}
		if !guards.IsTrytesOfExactLength(hash, consts.HashTrytesSize) {
			return nil, errors.Wrapf(ErrInvalidParameter, "hash invalid: %s", hash)
		}
		txHashes, err := tangle_old.ReadTransactionHashesForAddressFromDatabase(hash)
		if err != nil {
			return nil, ErrInternalError
		}

		if len(txHashes) == 0 {
			return nil, errors.Wrapf(ErrNotFound, "address %s not found", hash)
		}

		txs := make([]*ExplorerTx, 0, len(txHashes))
		for i := 0; i < len(txHashes); i++ {
			txHash := txHashes[i]

			tx, err := tangle_old.GetTransaction(hash)
			if err != nil {
				continue
			}
			if tx == nil {
				continue
			}
			expTx, err := createExplorerTx(txHash, tx)
			if err != nil {
				return nil, err
			}
			txs = append(txs, expTx)
		}

		return &ExplorerAdress{Txs: txs}, nil
	*/
}