btc-pay-checker/internal/services/btc/rpc_request.go

93 lines
1.9 KiB
Go

package btc
import (
"bytes"
"encoding/json"
"fmt"
"io"
"log"
"net/http"
)
const (
GET_BLOCK RPCMethod = "getblock"
GET_BALANCE RPCMethod = "getbalance"
GET_RAW_TRANSACTION RPCMethod = "getrawtransaction"
GET_TRANSACTION RPCMethod = "gettransaction"
DECODE_RAW_TRANSACTION RPCMethod = "decoderawtransaction"
LIST_ADDRESS_GROUPINGS RPCMethod = "listaddressgroupings"
)
type RPCMethod string
type RPCRequest struct {
host string
auth string
Jsonrpc string `json:"jsonrpc"`
ID string `json:"id"`
Method RPCMethod `json:"method"`
Params []interface{} `json:"params,omitempty"`
debug bool
}
func (b *BitcoinService) NewRPCRequest() *RPCRequest {
return &RPCRequest{
host: b.host,
auth: b.auth,
Jsonrpc: "1.0",
ID: "curltest",
Params: make([]interface{}, 0),
}
}
func (r *RPCRequest) WithDebug() *RPCRequest {
r.debug = true
return r
}
func (r *RPCRequest) WithMethod(method RPCMethod) *RPCRequest {
r.Method = method
return r
}
func (r *RPCRequest) Call(params ...interface{}) ([]byte, error) {
if len(params) > 0 && params != nil {
r.Params = append(r.Params, params...)
}
reqBody, err := json.Marshal(r)
if err != nil {
fmt.Println(err)
return nil, err
}
if r.debug {
log.Printf("%s \n body: \n%s \n", r.Method, string(reqBody))
}
payload := bytes.NewReader(reqBody)
client := &http.Client{}
req, err := http.NewRequest(http.MethodPost, r.host, payload)
if err != nil {
fmt.Println(err)
return nil, err
}
req.Header.Add("Accept", "text/plain")
req.Header.Add("Authorization", r.auth)
req.Header.Add("Content-Type", "application/json")
res, err := client.Do(req)
if err != nil {
return nil, err
}
defer res.Body.Close()
body, err := io.ReadAll(res.Body)
if err != nil {
return nil, err
}
if r.debug {
log.Printf("body response: \n%s \n", body)
}
return body, nil
}