Files
tastytrade/transactions.go
2024-05-14 21:51:10 -04:00

164 lines
4.9 KiB
Go

package tastytrade
import (
"encoding/json"
"fmt"
"net/url"
)
type Transaction struct {
ID int `json:"id"`
AccountNumber string `json:"account-number"`
Symbol string `json:"symbol"`
InstrumentType string `json:"instrument-type"`
UnderlyingSymbol string `json:"underlying-symbol"`
TransactionType string `json:"transaction-type"`
TransactionSubType string `json:"transaction-sub-type"`
Description string `json:"description"`
Action string `json:"action"`
Quantity string `json:"quantity"`
Price string `json:"price"`
ExecutedAt string `json:"executed-at"`
TransactionDate string `json:"transaction-date"`
Value string `json:"value"`
ValueEffect string `json:"value-effect"`
NetValue string `json:"net-value"`
NetValueEffect string `json:"net-value-effect"`
IsEstimatedFee bool `json:"is-estimated-fee"`
}
type TransactionResponse struct {
Data Transaction `json:"data"`
Context string `json:"context"`
}
type Pagination struct {
PerPage int `json:"per-page"`
PageOffset int `json:"page-offset"`
ItemOffset int `json:"item-offset"`
TotalItems int `json:"total-items"`
TotalPages int `json:"total-pages"`
CurrentItemCount int `json:"current-item-count"`
PreviousLink *string `json:"previous-link"`
NextLink *string `json:"next-link"`
PagingLinkTemplate *string `json:"paging-link-template"`
}
type TransactionsResponse struct {
Data struct {
Items []Transaction `json:"items"`
} `json:"data"`
APIVersion string `json:"api-version"`
Context string `json:"context"`
Pagination Pagination `json:"pagination"`
}
type TransactionQueryParams struct {
Sort string `json:"sort"`
Type string `json:"type"`
SubType []string `json:"sub-type"`
Types []string `json:"types"`
StartDate string `json:"start-date"`
EndDate string `json:"end-date"`
InstrumentType string `json:"instrument-type"`
Symbol string `json:"symbol"`
UnderlyingSymbol string `json:"underlying-symbol"`
Action string `json:"action"`
PartitionKey string `json:"partition-key"`
FuturesSymbol string `json:"futures-symbol"`
StartAt string `json:"start-at"`
EndAt string `json:"end-at"`
}
// GetTransactions retrieves transactions for a specific account
func (api *TastytradeAPI) GetTransactions(accountNumber string, params *TransactionQueryParams) (TransactionsResponse, error) {
urlVal := fmt.Sprintf("%s/accounts/%s/transactions", api.host, accountNumber)
if params != nil {
queryParams := url.Values{}
if params.Sort != "" {
queryParams.Add("sort", params.Sort)
}
if params.Type != "" {
queryParams.Add("type", params.Type)
}
for _, subType := range params.SubType {
queryParams.Add("sub-type", subType)
}
for _, types := range params.Types {
queryParams.Add("types", types)
}
if params.StartDate != "" {
queryParams.Add("start-date", params.StartDate)
}
if params.EndDate != "" {
queryParams.Add("end-date", params.EndDate)
}
if params.InstrumentType != "" {
queryParams.Add("instrument-type", params.InstrumentType)
}
if params.Symbol != "" {
queryParams.Add("symbol", params.Symbol)
}
if params.UnderlyingSymbol != "" {
queryParams.Add("underlying-symbol", params.UnderlyingSymbol)
}
if params.Action != "" {
queryParams.Add("action", params.Action)
}
if params.PartitionKey != "" {
queryParams.Add("partition-key", params.PartitionKey)
}
if params.FuturesSymbol != "" {
queryParams.Add("futures-symbol", params.FuturesSymbol)
}
if params.StartAt != "" {
queryParams.Add("start-at", params.StartAt)
}
if params.EndAt != "" {
queryParams.Add("end-at", params.EndAt)
}
urlVal = fmt.Sprintf("%s?%s", urlVal, queryParams.Encode())
}
data, err := api.fetchData(urlVal)
if err != nil {
return TransactionsResponse{}, err
}
var response TransactionsResponse
jsonData, err := json.Marshal(data)
if err != nil {
return TransactionsResponse{}, err
}
err = json.Unmarshal(jsonData, &response)
if err != nil {
return TransactionsResponse{}, err
}
return response, nil
}
// GetTransaction retrieves a specific transaction for a specific account
func (api *TastytradeAPI) GetTransaction(accountNumber string, transactionID string) (TransactionResponse, error) {
urlVal := fmt.Sprintf("%s/accounts/%s/transactions/%s", api.host, accountNumber, transactionID)
data, err := api.fetchData(urlVal)
if err != nil {
return TransactionResponse{}, err
}
var response TransactionResponse
jsonData, err := json.Marshal(data)
if err != nil {
return TransactionResponse{}, err
}
err = json.Unmarshal(jsonData, &response)
if err != nil {
return TransactionResponse{}, err
}
return response, nil
}