github.com/stellar/stellar-etl@v1.0.1-0.20240312145900-4874b6bf2b89/cmd/export_trades.go (about)

     1  package cmd
     2  
     3  import (
     4  	"fmt"
     5  
     6  	"github.com/sirupsen/logrus"
     7  	"github.com/stellar/stellar-etl/internal/toid"
     8  
     9  	"github.com/spf13/cobra"
    10  	"github.com/stellar/stellar-etl/internal/input"
    11  	"github.com/stellar/stellar-etl/internal/transform"
    12  	"github.com/stellar/stellar-etl/internal/utils"
    13  )
    14  
    15  // tradesCmd represents the trades command
    16  var tradesCmd = &cobra.Command{
    17  	Use:   "export_trades",
    18  	Short: "Exports the trade data",
    19  	Long:  `Exports trade data within the specified range to an output file`,
    20  	Run: func(cmd *cobra.Command, args []string) {
    21  		cmdLogger.SetLevel(logrus.InfoLevel)
    22  		endNum, strictExport, isTest, isFuture, extra := utils.MustCommonFlags(cmd.Flags(), cmdLogger)
    23  		cmdLogger.StrictExport = strictExport
    24  		startNum, path, limit := utils.MustArchiveFlags(cmd.Flags(), cmdLogger)
    25  		env := utils.GetEnvironmentDetails(isTest, isFuture)
    26  		cloudStorageBucket, cloudCredentials, cloudProvider := utils.MustCloudStorageFlags(cmd.Flags(), cmdLogger)
    27  
    28  		trades, err := input.GetTrades(startNum, endNum, limit, env)
    29  		if err != nil {
    30  			cmdLogger.Fatal("could not read trades ", err)
    31  		}
    32  
    33  		outFile := mustOutFile(path)
    34  		numFailures := 0
    35  		totalNumBytes := 0
    36  		for _, tradeInput := range trades {
    37  			trades, err := transform.TransformTrade(tradeInput.OperationIndex, tradeInput.OperationHistoryID, tradeInput.Transaction, tradeInput.CloseTime)
    38  			if err != nil {
    39  				parsedID := toid.Parse(tradeInput.OperationHistoryID)
    40  				cmdLogger.LogError(fmt.Errorf("from ledger %d, transaction %d, operation %d: %v", parsedID.LedgerSequence, parsedID.TransactionOrder, parsedID.OperationOrder, err))
    41  				numFailures += 1
    42  				continue
    43  			}
    44  
    45  			for _, transformed := range trades {
    46  				numBytes, err := exportEntry(transformed, outFile, extra)
    47  				if err != nil {
    48  					cmdLogger.LogError(err)
    49  					numFailures += 1
    50  					continue
    51  				}
    52  				totalNumBytes += numBytes
    53  			}
    54  		}
    55  
    56  		outFile.Close()
    57  		cmdLogger.Info("Number of bytes written: ", totalNumBytes)
    58  
    59  		printTransformStats(len(trades), numFailures)
    60  
    61  		maybeUpload(cloudCredentials, cloudStorageBucket, cloudProvider, path)
    62  	},
    63  }
    64  
    65  func init() {
    66  	rootCmd.AddCommand(tradesCmd)
    67  	utils.AddCommonFlags(tradesCmd.Flags())
    68  	utils.AddArchiveFlags("trades", tradesCmd.Flags())
    69  	utils.AddCloudStorageFlags(tradesCmd.Flags())
    70  	tradesCmd.MarkFlagRequired("end-ledger")
    71  
    72  	/*
    73  		TODO: implement extra flags if possible
    74  			serialize-method: the method for serialization of the output data (JSON, XDR, etc)
    75  			start and end time as a replacement for start and end sequence numbers
    76  	*/
    77  }