refactored payment orchestration

This commit is contained in:
Stephan D
2026-02-03 00:40:46 +01:00
parent 05d998e0f7
commit 5e87e2f2f9
184 changed files with 3920 additions and 2219 deletions

View File

@@ -6,18 +6,20 @@ import (
"github.com/tech/sendico/pkg/db/storable"
"github.com/tech/sendico/pkg/mservice"
paymenttypes "github.com/tech/sendico/pkg/payments/types"
moneyv1 "github.com/tech/sendico/pkg/proto/common/money/v1"
)
type TransferStatus string
const (
TransferStatusPending TransferStatus = "pending"
TransferStatusSigning TransferStatus = "signing"
TransferStatusSubmitted TransferStatus = "submitted"
TransferStatusConfirmed TransferStatus = "confirmed"
TransferStatusFailed TransferStatus = "failed"
TransferStatusCancelled TransferStatus = "cancelled"
TransferStatusCreated TransferStatus = "created" // record exists, not started
TransferStatusProcessing TransferStatus = "processing" // we are working on it
TransferStatusWaiting TransferStatus = "waiting" // waiting external world
TransferStatusSuccess TransferStatus = "success" // final success
TransferStatusFailed TransferStatus = "failed" // final failure
TransferStatusCancelled TransferStatus = "cancelled" // final cancelled
)
// ServiceFee represents a fee component applied to a transfer.
@@ -38,21 +40,23 @@ type TransferDestination struct {
type Transfer struct {
storable.Base `bson:",inline" json:",inline"`
OperationRef string `bson:"operationRef" json:"operationRef"`
TransferRef string `bson:"transferRef" json:"transferRef"`
IdempotencyKey string `bson:"idempotencyKey" json:"idempotencyKey"`
IntentRef string `bson:"intentRef" json:"intentRef"`
OrganizationRef string `bson:"organizationRef" json:"organizationRef"`
SourceWalletRef string `bson:"sourceWalletRef" json:"sourceWalletRef"`
Destination TransferDestination `bson:"destination" json:"destination"`
Network string `bson:"network" json:"network"`
TokenSymbol string `bson:"tokenSymbol" json:"tokenSymbol"`
ContractAddress string `bson:"contractAddress" json:"contractAddress"`
RequestedAmount *moneyv1.Money `bson:"requestedAmount" json:"requestedAmount"`
NetAmount *moneyv1.Money `bson:"netAmount" json:"netAmount"`
RequestedAmount *paymenttypes.Money `bson:"requestedAmount" json:"requestedAmount"`
NetAmount *paymenttypes.Money `bson:"netAmount" json:"netAmount"`
Fees []ServiceFee `bson:"fees,omitempty" json:"fees,omitempty"`
Status TransferStatus `bson:"status" json:"status"`
TxHash string `bson:"txHash,omitempty" json:"txHash,omitempty"`
FailureReason string `bson:"failureReason,omitempty" json:"failureReason,omitempty"`
ClientReference string `bson:"clientReference,omitempty" json:"clientReference,omitempty"`
PaymentRef string `bson:"paymentRef,omitempty" json:"paymentRef,omitempty"`
LastStatusAt time.Time `bson:"lastStatusAt" json:"lastStatusAt"`
}
@@ -81,6 +85,7 @@ func (t *Transfer) Normalize() {
t.TransferRef = strings.TrimSpace(t.TransferRef)
t.IdempotencyKey = strings.TrimSpace(t.IdempotencyKey)
t.OrganizationRef = strings.TrimSpace(t.OrganizationRef)
t.IntentRef = strings.TrimSpace(t.IntentRef)
t.SourceWalletRef = strings.TrimSpace(t.SourceWalletRef)
t.Network = strings.TrimSpace(strings.ToLower(t.Network))
t.TokenSymbol = strings.TrimSpace(strings.ToUpper(t.TokenSymbol))
@@ -89,5 +94,5 @@ func (t *Transfer) Normalize() {
t.Destination.ExternalAddress = normalizeWalletAddress(t.Destination.ExternalAddress)
t.Destination.ExternalAddressOriginal = strings.TrimSpace(t.Destination.ExternalAddressOriginal)
t.Destination.Memo = strings.TrimSpace(t.Destination.Memo)
t.ClientReference = strings.TrimSpace(t.ClientReference)
t.PaymentRef = strings.TrimSpace(t.PaymentRef)
}

View File

@@ -79,7 +79,7 @@ func (t *Transfers) Create(ctx context.Context, transfer *model.Transfer) (*mode
return nil, merrors.InvalidArgument("transfersStore: empty idempotencyKey")
}
if transfer.Status == "" {
transfer.Status = model.TransferStatusPending
transfer.Status = model.TransferStatusCreated
}
if transfer.LastStatusAt.IsZero() {
transfer.LastStatusAt = time.Now().UTC()