125 lines
3.3 KiB
Go
125 lines
3.3 KiB
Go
package rail
|
|
|
|
import (
|
|
"context"
|
|
|
|
"github.com/tech/sendico/pkg/model/account_role"
|
|
paymenttypes "github.com/tech/sendico/pkg/payments/types"
|
|
)
|
|
|
|
// Money represents a currency amount using decimal-safe strings.
|
|
type Money = paymenttypes.Money
|
|
|
|
type TransferStatus string
|
|
|
|
const (
|
|
TransferStatusUnspecified TransferStatus = "unspecified"
|
|
TransferStatusCreated TransferStatus = "created"
|
|
TransferStatusSuccess TransferStatus = "success"
|
|
TransferStatusFailed TransferStatus = "failed"
|
|
TransferStatusWaiting TransferStatus = "waiting"
|
|
TransferStatusProcessing TransferStatus = "processing"
|
|
TransferStatusCancelled TransferStatus = "cancelled"
|
|
)
|
|
|
|
// OperationResult represents the outcome status of an operation in a gateway
|
|
type OperationResult string
|
|
|
|
const (
|
|
OperationResultSuccess OperationResult = "success"
|
|
OperationResultFailed OperationResult = "failed"
|
|
OperationResultCancelled OperationResult = "cancelled"
|
|
)
|
|
|
|
// RailCapabilities are declared per gateway instance.
|
|
type RailCapabilities struct {
|
|
CanPayIn bool
|
|
CanPayOut bool
|
|
CanReadBalance bool
|
|
CanSendFee bool
|
|
RequiresObserveConfirm bool
|
|
CanBlock bool
|
|
CanRelease 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
|
|
IntentRef string
|
|
OperationRef string
|
|
PaymentRef string
|
|
FromAccountID string
|
|
ToAccountID string
|
|
Currency string
|
|
Network string
|
|
Amount string
|
|
Fee *Money
|
|
Fees []FeeBreakdown
|
|
IdempotencyKey string
|
|
Metadata map[string]string
|
|
DestinationMemo string
|
|
FromRole account_role.AccountRole
|
|
ToRole account_role.AccountRole
|
|
}
|
|
|
|
// BlockRequest defines the inputs for reserving value through a rail gateway.
|
|
type BlockRequest struct {
|
|
OrganizationRef string
|
|
AccountID string
|
|
Currency string
|
|
Amount string
|
|
IdempotencyKey string
|
|
Metadata map[string]string
|
|
PaymentRef string
|
|
}
|
|
|
|
// ReleaseRequest defines the inputs for releasing a prior block.
|
|
type ReleaseRequest struct {
|
|
ReferenceID string
|
|
IdempotencyKey string
|
|
Metadata map[string]string
|
|
PaymentRef string
|
|
}
|
|
|
|
// RailResult reports the outcome of a rail gateway operation.
|
|
type RailResult struct {
|
|
ReferenceID string
|
|
Status TransferStatus
|
|
FinalAmount *Money
|
|
Error *Error
|
|
}
|
|
|
|
// ObserveResult reports the outcome of a confirmation observation.
|
|
type ObserveResult struct {
|
|
ReferenceID string
|
|
Status TransferStatus
|
|
FinalAmount *Money
|
|
Error *Error
|
|
}
|
|
|
|
// Error captures structured failure details from a gateway.
|
|
type Error 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)
|
|
Block(ctx context.Context, req BlockRequest) (RailResult, error)
|
|
Release(ctx context.Context, req ReleaseRequest) (RailResult, error)
|
|
}
|