72 lines
1.6 KiB
Go
72 lines
1.6 KiB
Go
package quotation
|
|
|
|
import (
|
|
ledgerclient "github.com/tech/sendico/ledger/client"
|
|
"github.com/tech/sendico/payments/storage"
|
|
clockpkg "github.com/tech/sendico/pkg/clock"
|
|
"github.com/tech/sendico/pkg/mlogger"
|
|
"go.uber.org/zap"
|
|
)
|
|
|
|
type serviceError string
|
|
|
|
func (e serviceError) Error() string {
|
|
return string(e)
|
|
}
|
|
|
|
const (
|
|
defaultFeeQuoteTTLMillis int64 = 600000
|
|
defaultOracleTTLMillis int64 = 600000
|
|
)
|
|
|
|
var (
|
|
errStorageUnavailable = serviceError("payments.quotation: storage not initialised")
|
|
)
|
|
|
|
// Service hosts quotation-v2 runtime dependencies.
|
|
type Service struct {
|
|
logger mlogger.Logger
|
|
storage storage.Repository
|
|
clock clockpkg.Clock
|
|
|
|
deps serviceDependencies
|
|
}
|
|
|
|
type serviceDependencies struct {
|
|
fees feesDependency
|
|
gateway gatewayDependency
|
|
oracle oracleDependency
|
|
ledger ledgerclient.Client
|
|
gatewayRegistry GatewayRegistry
|
|
gatewayInvokeResolver GatewayInvokeResolver
|
|
cardRoutes map[string]CardGatewayRoute
|
|
feeLedgerAccounts map[string]string
|
|
}
|
|
|
|
// NewService constructs the quotation service core.
|
|
func NewService(logger mlogger.Logger, repo storage.Repository, opts ...Option) *Service {
|
|
if logger == nil {
|
|
logger = zap.NewNop()
|
|
}
|
|
|
|
svc := &Service{
|
|
logger: logger.Named("service"),
|
|
storage: repo,
|
|
clock: clockpkg.NewSystem(),
|
|
}
|
|
|
|
for _, opt := range opts {
|
|
if opt != nil {
|
|
opt(svc)
|
|
}
|
|
}
|
|
|
|
if svc.clock == nil {
|
|
svc.clock = clockpkg.NewSystem()
|
|
}
|
|
return svc
|
|
}
|
|
|
|
// Shutdown releases runtime resources. Quotation v2 has no background workers.
|
|
func (s *Service) Shutdown() {}
|