esplora.go raw

   1  package api
   2  
   3  import (
   4  	"context"
   5  	"encoding/json"
   6  	"errors"
   7  	"fmt"
   8  	"io"
   9  	"net/http"
  10  	"time"
  11  
  12  	"github.com/getAlby/hub/logger"
  13  	"github.com/sirupsen/logrus"
  14  )
  15  
  16  func (api *api) RequestEsploraApi(ctx context.Context, endpoint string) (interface{}, error) {
  17  	url := api.cfg.GetEnv().LDKEsploraServer + endpoint
  18  
  19  	client := http.Client{
  20  		Timeout: time.Second * 10,
  21  	}
  22  
  23  	req, err := http.NewRequestWithContext(ctx, http.MethodGet, url, nil)
  24  	if err != nil {
  25  		logger.Logger.WithError(err).WithFields(logrus.Fields{
  26  			"url": url,
  27  		}).Error("Failed to create http request")
  28  		return nil, err
  29  	}
  30  
  31  	res, err := client.Do(req)
  32  	if err != nil {
  33  		logger.Logger.WithError(err).WithFields(logrus.Fields{
  34  			"url": url,
  35  		}).Error("Failed to send request")
  36  		return nil, err
  37  	}
  38  
  39  	defer res.Body.Close()
  40  
  41  	body, readErr := io.ReadAll(res.Body)
  42  	if readErr != nil {
  43  		logger.Logger.WithError(err).WithFields(logrus.Fields{
  44  			"url": url,
  45  		}).Error("Failed to read response body")
  46  		return nil, errors.New("failed to read response body")
  47  	}
  48  
  49  	if res.StatusCode != http.StatusOK {
  50  		logger.Logger.WithFields(logrus.Fields{
  51  			"endpoint":    endpoint,
  52  			"status_code": res.StatusCode,
  53  			"body":        string(body),
  54  		}).Error("Esplora endpoint returned non-success code")
  55  		return nil, fmt.Errorf("esplora endpoint returned non-success code: %s", string(body))
  56  	}
  57  
  58  	var jsonContent interface{}
  59  	jsonErr := json.Unmarshal(body, &jsonContent)
  60  	if jsonErr != nil {
  61  		logger.Logger.WithError(jsonErr).WithFields(logrus.Fields{
  62  			"url": url,
  63  		}).Error("Failed to deserialize json")
  64  		return nil, fmt.Errorf("failed to deserialize json %s %s", url, string(body))
  65  	}
  66  	return jsonContent, nil
  67  }
  68