108 lines
2.5 KiB
Go
108 lines
2.5 KiB
Go
package server
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
|
|
"github.com/lbryio/herald.go/db"
|
|
"github.com/lbryio/herald.go/internal/metrics"
|
|
pb "github.com/lbryio/herald.go/protobuf/go"
|
|
"github.com/prometheus/client_golang/prometheus"
|
|
log "github.com/sirupsen/logrus"
|
|
)
|
|
|
|
type ClaimtrieService struct {
|
|
DB *db.ReadOnlyDBColumnFamily
|
|
Server *Server
|
|
}
|
|
|
|
type ResolveData struct {
|
|
Data []string `json:"data"`
|
|
}
|
|
|
|
type Result struct {
|
|
Data string `json:"data"`
|
|
}
|
|
|
|
type GetClaimByIDData struct {
|
|
ClaimID string `json:"claim_id"`
|
|
}
|
|
|
|
// Resolve is the json rpc endpoint for 'blockchain.claimtrie.resolve'.
|
|
func (t *ClaimtrieService) Resolve(args *ResolveData, result **pb.Outputs) error {
|
|
log.Println("Resolve")
|
|
res, err := InternalResolve(args.Data, t.DB)
|
|
*result = res
|
|
return err
|
|
}
|
|
|
|
// Search is the json rpc endpoint for 'blockchain.claimtrie.search'.
|
|
func (t *ClaimtrieService) Search(args *pb.SearchRequest, result **pb.Outputs) error {
|
|
log.Println("Search")
|
|
if t.Server == nil {
|
|
log.Warnln("Server is nil in Search")
|
|
*result = nil
|
|
return nil
|
|
}
|
|
ctx := context.Background()
|
|
res, err := t.Server.Search(ctx, args)
|
|
*result = res
|
|
return err
|
|
}
|
|
|
|
// GetClaimByID is the json rpc endpoint for 'blockchain.claimtrie.getclaimbyid'.
|
|
func (t *ClaimtrieService) GetClaimByID(args *GetClaimByIDData, result **pb.Outputs) error {
|
|
log.Println("GetClaimByID")
|
|
if len(args.ClaimID) != 40 {
|
|
*result = nil
|
|
return fmt.Errorf("len(claim_id) != 40")
|
|
}
|
|
|
|
rows, extras, err := t.DB.GetClaimByID(args.ClaimID)
|
|
if err != nil {
|
|
*result = nil
|
|
return err
|
|
}
|
|
|
|
metrics.RequestsCount.With(prometheus.Labels{"method": "blockchain.claimtrie.getclaimbyid"}).Inc()
|
|
|
|
// FIXME: this has txos and extras and so does GetClaimById?
|
|
allTxos := make([]*pb.Output, 0)
|
|
allExtraTxos := make([]*pb.Output, 0)
|
|
|
|
for _, row := range rows {
|
|
txos, extraTxos, err := row.ToOutputs()
|
|
if err != nil {
|
|
*result = nil
|
|
return err
|
|
}
|
|
// TODO: there may be a more efficient way to do this.
|
|
allTxos = append(allTxos, txos...)
|
|
allExtraTxos = append(allExtraTxos, extraTxos...)
|
|
}
|
|
|
|
for _, extra := range extras {
|
|
txos, extraTxos, err := extra.ToOutputs()
|
|
if err != nil {
|
|
*result = nil
|
|
return err
|
|
}
|
|
// TODO: there may be a more efficient way to do this.
|
|
allTxos = append(allTxos, txos...)
|
|
allExtraTxos = append(allExtraTxos, extraTxos...)
|
|
}
|
|
|
|
res := &pb.Outputs{
|
|
Txos: allTxos,
|
|
ExtraTxos: allExtraTxos,
|
|
Total: uint32(len(allTxos) + len(allExtraTxos)),
|
|
Offset: 0, //TODO
|
|
Blocked: nil, //TODO
|
|
BlockedTotal: 0, //TODO
|
|
}
|
|
|
|
log.Warn(res)
|
|
|
|
*result = res
|
|
return nil
|
|
}
|