Skip to content

Commit

Permalink
feat(BUX-727) filter for transactions and more generic approach with …
Browse files Browse the repository at this point in the history
…destinations (#549)

* feat(BUX-727): filter transactions & introduced common generics

* feat(BUX-727): update swagger

* feat(BUX-727): fixed wrong type for XpubMetadata

* feat(BUX-727): leave only applicable fields in the filter

* feat(BUX-727): adjust to the review

* feat(BUX-727): tx direction filter - removed

* feat(BUX-727): update swagger
  • Loading branch information
chris-4chain authored Apr 16, 2024
1 parent 271d217 commit fd27c46
Show file tree
Hide file tree
Showing 21 changed files with 882 additions and 329 deletions.
22 changes: 22 additions & 0 deletions actions/common/search_models.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package common

import (
"github.com/bitcoin-sv/spv-wallet/engine"
"github.com/bitcoin-sv/spv-wallet/engine/datastore"
)

// ConditionsModel is a generic model for handling conditions with metadata
type ConditionsModel[TFilter any] struct {
// Custom conditions used for filtering the search results
Conditions TFilter `json:"conditions"`
// Accepts a JSON object for embedding custom metadata, enabling arbitrary additional information to be associated with the resource
Metadata *engine.Metadata `json:"metadata,omitempty" swaggertype:"object,string" example:"key:value,key2:value2"`
}

// SearchModel is a generic model for handling searching with filters and metadata
type SearchModel[TFilter any] struct {
ConditionsModel[TFilter]

// Pagination and sorting options to streamline data exploration and analysis
QueryParams *datastore.QueryParams `json:"params,omitempty" swaggertype:"object,string" example:"page:1,page_size:10,order_by_field:created_at,order_by_direction:desc"`
}
20 changes: 9 additions & 11 deletions actions/destinations/count.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ package destinations
import (
"net/http"

"github.com/bitcoin-sv/spv-wallet/actions"
"github.com/bitcoin-sv/spv-wallet/server/auth"
"github.com/gin-gonic/gin"
)
Expand All @@ -14,29 +13,28 @@ import (
// @Description Count Destinations
// @Tags Destinations
// @Produce json
// @Param CountRequestParameters body actions.CountRequestParameters false "Enables precise filtering of resource counts using custom conditions or metadata, catering to specific business or analysis needs"
// @Param CountDestinations body CountDestinations false "Enables precise filtering of resource counts using custom conditions or metadata, catering to specific business or analysis needs"
// @Success 200 {number} int64 "Count of destinations"
// @Failure 400 "Bad request - Error while parsing CountRequestParameters from request body"
// @Failure 400 "Bad request - Error while parsing CountDestinations from request body"
// @Failure 500 "Internal Server Error - Error while fetching count of destinations"
// @Router /v1/destination/count [post]
// @Security x-auth-xpub
func (a *Action) count(c *gin.Context) {
reqXPubID := c.GetString(auth.ParamXPubHashKey)

metadata, conditions, err := actions.GetCountQueryParameters(c)
if err != nil {
var reqParams CountDestinations
if err := c.Bind(&reqParams); err != nil {
c.JSON(http.StatusBadRequest, err.Error())
return
}

// Record a new transaction (get the hex from parameters)
var count int64
if count, err = a.Services.SpvWalletEngine.GetDestinationsByXpubIDCount(
count, err := a.Services.SpvWalletEngine.GetDestinationsByXpubIDCount(
c.Request.Context(),
reqXPubID,
metadata,
conditions,
); err != nil {
reqParams.Metadata,
reqParams.Conditions.ToDbConditions(),
)
if err != nil {
c.JSON(http.StatusInternalServerError, err.Error())
return
}
Expand Down
25 changes: 0 additions & 25 deletions actions/destinations/methods.go

This file was deleted.

8 changes: 8 additions & 0 deletions actions/destinations/models.go
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
package destinations

import (
"github.com/bitcoin-sv/spv-wallet/actions/common"
"github.com/bitcoin-sv/spv-wallet/engine"
"github.com/bitcoin-sv/spv-wallet/models/filter"
)

// CreateDestination is the model for creating a destination
Expand All @@ -21,3 +23,9 @@ type UpdateDestination struct {
// LockingScript of the destination
LockingScript string `json:"locking_script" example:"76a9147b05764a97f3b4b981471492aa703b188e45979b88ac"`
}

// SearchDestinations is a model for handling searching with filters and metadata
type SearchDestinations = common.SearchModel[filter.DestinationFilter]

// CountDestinations is a model for handling counting filtered destinations
type CountDestinations = common.ConditionsModel[filter.DestinationFilter]
8 changes: 3 additions & 5 deletions actions/destinations/search.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ package destinations
import (
"net/http"

"github.com/bitcoin-sv/spv-wallet/engine"
"github.com/bitcoin-sv/spv-wallet/mappings"
"github.com/bitcoin-sv/spv-wallet/models"
"github.com/bitcoin-sv/spv-wallet/server/auth"
Expand All @@ -16,22 +15,21 @@ import (
// @Description Search for a destination
// @Tags Destinations
// @Produce json
// @Param SearchRequestDestinationParameters body SearchRequestDestinationParameters false "Supports targeted resource searches with filters for metadata and custom conditions, plus options for pagination and sorting to streamline data exploration and analysis"
// @Param SearchDestinations body SearchDestinations false "Supports targeted resource searches with filters for metadata and custom conditions, plus options for pagination and sorting to streamline data exploration and analysis"
// @Success 200 {object} []models.Destination "List of destinations
// @Failure 400 "Bad request - Error while parsing SearchRequestDestinationParameters from request body"
// @Failure 400 "Bad request - Error while parsing SearchDestinations from request body"
// @Failure 500 "Internal server error - Error while searching for destinations"
// @Router /v1/destination/search [post]
// @Security x-auth-xpub
func (a *Action) search(c *gin.Context) {
reqXPubID := c.GetString(auth.ParamXPubHashKey)

var reqParams SearchRequestDestinationParameters
var reqParams SearchDestinations
if err := c.Bind(&reqParams); err != nil {
c.JSON(http.StatusBadRequest, err.Error())
return
}

var destinations []*engine.Destination
destinations, err := a.Services.SpvWalletEngine.GetDestinationsByXpubID(
c.Request.Context(),
reqXPubID,
Expand Down
19 changes: 9 additions & 10 deletions actions/transactions/count.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ package transactions
import (
"net/http"

"github.com/bitcoin-sv/spv-wallet/actions"
"github.com/bitcoin-sv/spv-wallet/server/auth"
"github.com/gin-gonic/gin"
)
Expand All @@ -14,28 +13,28 @@ import (
// @Description Count of transactions
// @Tags Transactions
// @Produce json
// @Param CountRequestParameters body actions.CountRequestParameters false "Enables precise filtering of resource counts using custom conditions or metadata, catering to specific business or analysis needs"
// @Param CountTransactions body CountTransactions false "Enables precise filtering of resource counts using custom conditions or metadata, catering to specific business or analysis needs"
// @Success 200 {number} int64 "Count of access keys"
// @Failure 400 "Bad request - Error while parsing CountRequestParameters from request body"
// @Failure 400 "Bad request - Error while parsing CountTransactions from request body"
// @Failure 500 "Internal Server Error - Error while fetching count of transactions"
// @Router /v1/transaction/count [post]
// @Security x-auth-xpub
func (a *Action) count(c *gin.Context) {
reqXPubID := c.GetString(auth.ParamXPubHashKey)

metadata, conditions, err := actions.GetCountQueryParameters(c)
if err != nil {
var reqParams CountTransactions
if err := c.Bind(&reqParams); err != nil {
c.JSON(http.StatusBadRequest, err.Error())
return
}

var count int64
if count, err = a.Services.SpvWalletEngine.GetTransactionsByXpubIDCount(
count, err := a.Services.SpvWalletEngine.GetTransactionsByXpubIDCount(
c.Request.Context(),
reqXPubID,
metadata,
conditions,
); err != nil {
reqParams.Metadata,
reqParams.Conditions.ToDbConditions(),
)
if err != nil {
c.JSON(http.StatusInternalServerError, err.Error())
return
}
Expand Down
8 changes: 8 additions & 0 deletions actions/transactions/models.go
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
package transactions

import (
"github.com/bitcoin-sv/spv-wallet/actions/common"
"github.com/bitcoin-sv/spv-wallet/engine"
"github.com/bitcoin-sv/spv-wallet/models"
"github.com/bitcoin-sv/spv-wallet/models/filter"
)

// UpdateTransaction is the model for updating a transaction
Expand Down Expand Up @@ -30,3 +32,9 @@ type NewTransaction struct {
// Accepts a JSON object for embedding custom metadata, enabling arbitrary additional information to be associated with the resource
Metadata engine.Metadata `json:"metadata" swaggertype:"object,string" example:"key:value,key2:value2"`
}

// SearchTransactions is a model for handling searching with filters and metadata
type SearchTransactions = common.SearchModel[filter.TransactionFilter]

// CountTransactions is a model for handling counting filtered transactions
type CountTransactions = common.ConditionsModel[filter.TransactionFilter]
22 changes: 10 additions & 12 deletions actions/transactions/search.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,6 @@ package transactions
import (
"net/http"

"github.com/bitcoin-sv/spv-wallet/actions"
"github.com/bitcoin-sv/spv-wallet/engine"
"github.com/bitcoin-sv/spv-wallet/mappings"
"github.com/bitcoin-sv/spv-wallet/models"
"github.com/bitcoin-sv/spv-wallet/server/auth"
Expand All @@ -17,30 +15,30 @@ import (
// @Description Search transaction
// @Tags Transactions
// @Produce json
// @Param SearchRequestParameters body actions.SearchRequestParameters false "Supports targeted resource searches with filters for metadata and custom conditions, plus options for pagination and sorting to streamline data exploration and analysis"
// @Param SearchTransactions body SearchTransactions false "Supports targeted resource searches with filters for metadata and custom conditions, plus options for pagination and sorting to streamline data exploration and analysis"
// @Success 200 {object} []models.Transaction "List of transactions"
// @Failure 400 "Bad request - Error while parsing SearchRequestParameters from request body"
// @Failure 400 "Bad request - Error while parsing SearchTransactions from request body"
// @Failure 500 "Internal server error - Error while searching for transactions"
// @Router /v1/transaction/search [post]
// @Security x-auth-xpub
func (a *Action) search(c *gin.Context) {
reqXPubID := c.GetString(auth.ParamXPubHashKey)

queryParams, metadata, conditions, err := actions.GetSearchQueryParameters(c)
if err != nil {
var reqParams SearchTransactions
if err := c.Bind(&reqParams); err != nil {
c.JSON(http.StatusBadRequest, err.Error())
return
}

// Record a new transaction (get the hex from parameters)a
var transactions []*engine.Transaction
if transactions, err = a.Services.SpvWalletEngine.GetTransactionsByXpubID(
transactions, err := a.Services.SpvWalletEngine.GetTransactionsByXpubID(
c.Request.Context(),
reqXPubID,
metadata,
conditions,
queryParams,
); err != nil {
reqParams.Metadata,
reqParams.Conditions.ToDbConditions(),
reqParams.QueryParams,
)
if err != nil {
c.JSON(http.StatusInternalServerError, err.Error())
return
}
Expand Down
Loading

0 comments on commit fd27c46

Please sign in to comment.