Files
sendico/api/pkg/payments/rail/gateway.go
2026-01-04 12:57:40 +01:00

84 lines
2.0 KiB
Go

package rail
import (
"context"
paymenttypes "github.com/tech/sendico/pkg/payments/types"
)
// Money represents a currency amount using decimal-safe strings.
type Money = paymenttypes.Money
const (
TransferStatusUnspecified = "UNSPECIFIED"
TransferStatusSuccess = "SUCCESS"
TransferStatusFailed = "FAILED"
TransferStatusRejected = "REJECTED"
TransferStatusPending = "PENDING"
)
// RailCapabilities are declared per gateway instance.
type RailCapabilities struct {
CanPayIn bool
CanPayOut bool
CanReadBalance bool
CanSendFee bool
RequiresObserveConfirm bool
}
// FeeBreakdown provides a gateway-level fee description.
type FeeBreakdown struct {
FeeCode string
Amount *Money
Description string
}
// TransferRequest defines the inputs for sending value through a rail gateway.
type TransferRequest struct {
OrganizationRef string
FromAccountID string
ToAccountID string
Currency string
Network string
Amount string
Fee *Money
Fees []FeeBreakdown
IdempotencyKey string
Metadata map[string]string
ClientReference string
DestinationMemo string
}
// RailResult reports the outcome of a rail gateway operation.
type RailResult struct {
ReferenceID string
Status string
FinalAmount *Money
Error *RailError
}
// ObserveResult reports the outcome of a confirmation observation.
type ObserveResult struct {
ReferenceID string
Status string
FinalAmount *Money
Error *RailError
}
// RailError captures structured failure details from a gateway.
type RailError struct {
Code string
Message string
CanRetry bool
ShouldRollback bool
}
// RailGateway exposes unified gateway operations for external rails.
type RailGateway interface {
Rail() string
Network() string
Capabilities() RailCapabilities
Send(ctx context.Context, req TransferRequest) (RailResult, error)
Observe(ctx context.Context, referenceID string) (ObserveResult, error)
}