| package common |
|
|
| import ( |
| "fmt" |
| "log/slog" |
|
|
| "github.com/google/wire" |
| "go.opentelemetry.io/otel/trace" |
|
|
| "github.com/openmeterio/openmeter/app/config" |
| "github.com/openmeterio/openmeter/openmeter/billing" |
| "github.com/openmeterio/openmeter/openmeter/customer" |
| customeradapter "github.com/openmeterio/openmeter/openmeter/customer/adapter" |
| customerservice "github.com/openmeterio/openmeter/openmeter/customer/service" |
| customerservicehooks "github.com/openmeterio/openmeter/openmeter/customer/service/hooks" |
| entdb "github.com/openmeterio/openmeter/openmeter/ent/db" |
| ledgerresolvers "github.com/openmeterio/openmeter/openmeter/ledger/resolvers" |
| "github.com/openmeterio/openmeter/openmeter/registry" |
| "github.com/openmeterio/openmeter/openmeter/subject" |
| "github.com/openmeterio/openmeter/openmeter/watermill/eventbus" |
| ) |
|
|
| var Customer = wire.NewSet( |
| NewCustomerService, |
| ) |
|
|
| func NewCustomerService( |
| logger *slog.Logger, |
| db *entdb.Client, |
| eventPublisher eventbus.Publisher, |
| ) (customer.Service, error) { |
| customerAdapter, err := customeradapter.New(customeradapter.Config{ |
| Client: db, |
| Logger: logger.WithGroup("customer.postgres"), |
| }) |
| if err != nil { |
| return nil, fmt.Errorf("failed to create customer adapter: %w", err) |
| } |
|
|
| service, err := customerservice.New(customerservice.Config{ |
| Adapter: customerAdapter, |
| Publisher: eventPublisher, |
| }) |
| if err != nil { |
| return nil, fmt.Errorf("failed to create customer service: %w", err) |
| } |
|
|
| return service, nil |
| } |
|
|
| type CustomerSubjectHook customerservicehooks.SubjectCustomerHook |
|
|
| type CustomerLedgerHook ledgerresolvers.CustomerLedgerHook |
|
|
| func NewCustomerLedgerServiceHook( |
| creditsConfig config.CreditsConfiguration, |
| tracer trace.Tracer, |
| accountResolver customerLedgerProvisioner, |
| customerService customer.Service, |
| ) (CustomerLedgerHook, error) { |
| if !creditsConfig.Enabled { |
| return ledgerresolvers.NoopCustomerLedgerHook{}, nil |
| } |
|
|
| h, err := ledgerresolvers.NewCustomerLedgerHook(ledgerresolvers.CustomerLedgerHookConfig{ |
| Service: accountResolver, |
| Tracer: tracer, |
| }) |
| if err != nil { |
| return nil, fmt.Errorf("failed to create customer ledger hook: %w", err) |
| } |
|
|
| customerService.RegisterHooks(h) |
|
|
| return h, nil |
| } |
|
|
| func NewCustomerSubjectServiceHook( |
| config config.CustomerConfiguration, |
| logger *slog.Logger, |
| tracer trace.Tracer, |
| subjectService subject.Service, |
| customerService customer.Service, |
| customerOverrideService billing.CustomerOverrideService, |
| ) (CustomerSubjectHook, error) { |
| if !config.EnableSubjectHook { |
| return new(customerservicehooks.NoopSubjectCustomerHook), nil |
| } |
|
|
| |
| h, err := customerservicehooks.NewSubjectCustomerHook(customerservicehooks.SubjectCustomerHookConfig{ |
| Customer: customerService, |
| CustomerOverride: customerOverrideService, |
| Logger: logger, |
| Tracer: tracer, |
| IgnoreErrors: config.IgnoreErrors, |
| }) |
| if err != nil { |
| return nil, fmt.Errorf("failed to create customer subject hook: %w", err) |
| } |
|
|
| subjectService.RegisterHooks(h) |
|
|
| return h, nil |
| } |
|
|
| type CustomerEntitlementValidatorHook customerservicehooks.EntitlementValidatorHook |
|
|
| func NewCustomerEntitlementValidatorServiceHook( |
| logger *slog.Logger, |
| entitlementRegistry *registry.Entitlement, |
| customerService customer.Service, |
| ) (CustomerEntitlementValidatorHook, error) { |
| h, err := customerservicehooks.NewEntitlementValidatorHook(customerservicehooks.EntitlementValidatorHookConfig{ |
| EntitlementService: entitlementRegistry.Entitlement, |
| }) |
| if err != nil { |
| return nil, fmt.Errorf("failed to create customer entitlement validator hook: %w", err) |
| } |
|
|
| customerService.RegisterHooks(h) |
|
|
| return h, nil |
| } |
|
|