Files
sendico/api/payments/quotation/internal/service/quotation/internal_helpers.go
2026-02-26 02:39:48 +01:00

123 lines
3.2 KiB
Go

package quotation
import (
"context"
"strings"
"time"
payecon "github.com/tech/sendico/pkg/payments/economics"
feesv1 "github.com/tech/sendico/pkg/proto/billing/fees/v1"
fxv1 "github.com/tech/sendico/pkg/proto/common/fx/v1"
quotationv2 "github.com/tech/sendico/pkg/proto/payments/quotation/v2"
sharedv1 "github.com/tech/sendico/pkg/proto/payments/shared/v1"
)
func (s *Service) withTimeout(ctx context.Context, d time.Duration) (context.Context, context.CancelFunc) {
if d <= 0 {
return context.WithCancel(ctx)
}
return context.WithTimeout(ctx, d)
}
func triggerFromKind(kind sharedv1.PaymentKind, requiresFX bool) feesv1.Trigger {
switch kind {
case sharedv1.PaymentKind_PAYMENT_KIND_PAYOUT:
return feesv1.Trigger_TRIGGER_PAYOUT
case sharedv1.PaymentKind_PAYMENT_KIND_INTERNAL_TRANSFER:
return feesv1.Trigger_TRIGGER_CAPTURE
case sharedv1.PaymentKind_PAYMENT_KIND_FX_CONVERSION:
return feesv1.Trigger_TRIGGER_FX_CONVERSION
default:
if requiresFX {
return feesv1.Trigger_TRIGGER_FX_CONVERSION
}
return feesv1.Trigger_TRIGGER_UNSPECIFIED
}
}
func shouldEstimateNetworkFee(intent *sharedv1.PaymentIntent) bool {
if intent == nil {
return false
}
dest := intent.GetDestination()
if dest == nil {
return false
}
if dest.GetCard() != nil {
return false
}
if intent.GetKind() == sharedv1.PaymentKind_PAYMENT_KIND_PAYOUT {
return true
}
if dest.GetManagedWallet() != nil || dest.GetExternalChain() != nil {
return true
}
return false
}
func shouldRequestFX(intent *sharedv1.PaymentIntent) bool {
if intent == nil {
return false
}
return fxIntentForQuote(intent) != nil
}
func fxIntentForQuote(intent *sharedv1.PaymentIntent) *sharedv1.FXIntent {
if intent == nil {
return nil
}
if fx := intent.GetFx(); fx != nil && fx.GetPair() != nil {
side := fx.GetSide()
if side == fxv1.Side_SIDE_UNSPECIFIED {
side = fxv1.Side_SELL_BASE_BUY_QUOTE
}
return &sharedv1.FXIntent{
Pair: &fxv1.CurrencyPair{
Base: strings.TrimSpace(fx.GetPair().GetBase()),
Quote: strings.TrimSpace(fx.GetPair().GetQuote()),
},
Side: side,
Firm: fx.GetFirm(),
TtlMs: fx.GetTtlMs(),
PreferredProvider: strings.TrimSpace(fx.GetPreferredProvider()),
MaxAgeMs: fx.GetMaxAgeMs(),
}
}
amount := intent.GetAmount()
if amount == nil {
return nil
}
settlementCurrency := strings.TrimSpace(intent.GetSettlementCurrency())
if settlementCurrency == "" {
return nil
}
if strings.EqualFold(amount.GetCurrency(), settlementCurrency) {
return nil
}
return &sharedv1.FXIntent{
Pair: &fxv1.CurrencyPair{
Base: strings.TrimSpace(amount.GetCurrency()),
Quote: settlementCurrency,
},
Side: fxv1.Side_SELL_BASE_BUY_QUOTE,
}
}
func resolvedFeeTreatmentForQuote(intent *sharedv1.PaymentIntent) quotationv2.FeeTreatment {
if intent == nil {
return payecon.DefaultFeeTreatment()
}
attrs := intent.GetAttributes()
if len(attrs) == 0 {
return payecon.DefaultFeeTreatment()
}
keys := []string{"fee_treatment", "feeTreatment"}
for _, key := range keys {
if value := strings.TrimSpace(attrs[key]); value != "" {
return payecon.ResolveFeeTreatmentFromStringOrDefault(value)
}
}
return payecon.DefaultFeeTreatment()
}