move api/server to api/edge/bff
This commit is contained in:
136
api/edge/bff/internal/server/walletapiimp/routing.go
Normal file
136
api/edge/bff/internal/server/walletapiimp/routing.go
Normal file
@@ -0,0 +1,136 @@
|
||||
package walletapiimp
|
||||
|
||||
import (
|
||||
"context"
|
||||
"errors"
|
||||
"strings"
|
||||
|
||||
"github.com/tech/sendico/pkg/discovery"
|
||||
"github.com/tech/sendico/pkg/merrors"
|
||||
"github.com/tech/sendico/pkg/model"
|
||||
connectorv1 "github.com/tech/sendico/pkg/proto/connector/v1"
|
||||
"go.uber.org/zap"
|
||||
)
|
||||
|
||||
func normalizeNetworkName(raw string) string {
|
||||
value := strings.TrimSpace(raw)
|
||||
if value == "" {
|
||||
return ""
|
||||
}
|
||||
|
||||
if idx := strings.Index(value, "-"); idx > 0 {
|
||||
value = value[:idx]
|
||||
}
|
||||
|
||||
value = strings.ToLower(value)
|
||||
value = strings.TrimPrefix(value, "chain_network_")
|
||||
return strings.TrimSpace(value)
|
||||
}
|
||||
|
||||
func (a *WalletAPI) rememberWalletRoute(ctx context.Context, organizationRef string, walletRef string, network string, gatewayID string) {
|
||||
if a.routes == nil {
|
||||
return
|
||||
}
|
||||
|
||||
walletRef = strings.TrimSpace(walletRef)
|
||||
organizationRef = strings.TrimSpace(organizationRef)
|
||||
network = normalizeNetworkName(network)
|
||||
gatewayID = strings.TrimSpace(gatewayID)
|
||||
|
||||
if walletRef == "" || organizationRef == "" || (network == "" && gatewayID == "") {
|
||||
return
|
||||
}
|
||||
|
||||
if err := a.routes.Upsert(ctx, &model.ChainWalletRoute{
|
||||
OrganizationRef: organizationRef,
|
||||
WalletRef: walletRef,
|
||||
Network: network,
|
||||
GatewayID: gatewayID,
|
||||
}); err != nil {
|
||||
a.logger.Warn("Failed to persist wallet route",
|
||||
zap.String("organization_ref", organizationRef),
|
||||
zap.String("wallet_ref", walletRef),
|
||||
zap.String("network", network),
|
||||
zap.String("gateway_id", gatewayID),
|
||||
zap.Error(err))
|
||||
} else {
|
||||
a.logger.Debug("Persisted wallet route",
|
||||
zap.String("organization_ref", organizationRef),
|
||||
zap.String("wallet_ref", walletRef),
|
||||
zap.String("network", network),
|
||||
zap.String("gateway_id", gatewayID))
|
||||
}
|
||||
}
|
||||
|
||||
func (a *WalletAPI) walletRoute(ctx context.Context, organizationRef string, walletRef string) (*model.ChainWalletRoute, error) {
|
||||
if a.routes == nil {
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
walletRef = strings.TrimSpace(walletRef)
|
||||
organizationRef = strings.TrimSpace(organizationRef)
|
||||
if walletRef == "" || organizationRef == "" {
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
route, err := a.routes.Get(ctx, organizationRef, walletRef)
|
||||
if err != nil {
|
||||
if errors.Is(err, merrors.ErrNoData) {
|
||||
return nil, nil
|
||||
}
|
||||
return nil, err
|
||||
}
|
||||
return route, nil
|
||||
}
|
||||
|
||||
func findGatewayForRoute(gateways []discovery.GatewaySummary, route *model.ChainWalletRoute) *discovery.GatewaySummary {
|
||||
if route == nil {
|
||||
return nil
|
||||
}
|
||||
|
||||
gatewayID := strings.TrimSpace(route.GatewayID)
|
||||
if gatewayID != "" {
|
||||
for _, gw := range gateways {
|
||||
if strings.EqualFold(strings.TrimSpace(gw.ID), gatewayID) &&
|
||||
strings.EqualFold(gw.Rail, cryptoRail) &&
|
||||
gw.Healthy &&
|
||||
strings.TrimSpace(gw.InvokeURI) != "" {
|
||||
return &gw
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return findGatewayForNetwork(gateways, route.Network)
|
||||
}
|
||||
|
||||
func accountNetwork(account *connectorv1.Account) string {
|
||||
if account == nil {
|
||||
return ""
|
||||
}
|
||||
|
||||
if details := account.GetProviderDetails(); details != nil {
|
||||
if field, ok := details.GetFields()["network"]; ok && field != nil {
|
||||
if network := normalizeNetworkName(field.GetStringValue()); network != "" {
|
||||
return network
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return normalizeNetworkName(account.GetAsset())
|
||||
}
|
||||
|
||||
func dropGatewayByInvokeURI(gateways []discovery.GatewaySummary, invokeURI string) []discovery.GatewaySummary {
|
||||
invokeURI = strings.ToLower(strings.TrimSpace(invokeURI))
|
||||
if invokeURI == "" || len(gateways) == 0 {
|
||||
return gateways
|
||||
}
|
||||
|
||||
result := make([]discovery.GatewaySummary, 0, len(gateways))
|
||||
for _, gw := range gateways {
|
||||
if strings.ToLower(strings.TrimSpace(gw.InvokeURI)) == invokeURI {
|
||||
continue
|
||||
}
|
||||
result = append(result, gw)
|
||||
}
|
||||
return result
|
||||
}
|
||||
Reference in New Issue
Block a user