openmeter / app /common /subscription.go
Leon4gr45's picture
Upload folder using huggingface_hub (part 4)
1f10f31 verified
Raw
History Blame Contribute Delete
5.9 kB
package common
import (
"log/slog"
"github.com/google/wire"
"github.com/openmeterio/openmeter/openmeter/customer"
entdb "github.com/openmeterio/openmeter/openmeter/ent/db"
"github.com/openmeterio/openmeter/openmeter/productcatalog/addon"
"github.com/openmeterio/openmeter/openmeter/productcatalog/feature"
"github.com/openmeterio/openmeter/openmeter/productcatalog/plan"
"github.com/openmeterio/openmeter/openmeter/productcatalog/planaddon"
plansubscription "github.com/openmeterio/openmeter/openmeter/productcatalog/subscription"
subscriptionchangeservice "github.com/openmeterio/openmeter/openmeter/productcatalog/subscription/service"
"github.com/openmeterio/openmeter/openmeter/registry"
"github.com/openmeterio/openmeter/openmeter/subscription"
subscriptionaddon "github.com/openmeterio/openmeter/openmeter/subscription/addon"
subscriptionaddonrepo "github.com/openmeterio/openmeter/openmeter/subscription/addon/repo"
subscriptionaddonservice "github.com/openmeterio/openmeter/openmeter/subscription/addon/service"
subscriptionentitlement "github.com/openmeterio/openmeter/openmeter/subscription/entitlement"
annotationhook "github.com/openmeterio/openmeter/openmeter/subscription/hooks/annotations"
subscriptionrepo "github.com/openmeterio/openmeter/openmeter/subscription/repo"
subscriptionservice "github.com/openmeterio/openmeter/openmeter/subscription/service"
subscriptioncustomer "github.com/openmeterio/openmeter/openmeter/subscription/validators/customer"
subscriptionworkflow "github.com/openmeterio/openmeter/openmeter/subscription/workflow"
subscriptionworkflowservice "github.com/openmeterio/openmeter/openmeter/subscription/workflow/service"
"github.com/openmeterio/openmeter/openmeter/taxcode"
"github.com/openmeterio/openmeter/openmeter/watermill/eventbus"
"github.com/openmeterio/openmeter/pkg/ffx"
"github.com/openmeterio/openmeter/pkg/framework/lockr"
)
var Subscription = wire.NewSet(
NewSubscriptionServices,
)
// TODO: break up to multiple initializers
type SubscriptionServiceWithWorkflow struct {
Service subscription.Service
WorkflowService subscriptionworkflow.Service
PlanSubscriptionService plansubscription.PlanSubscriptionService
SubscriptionAddonService subscriptionaddon.Service
}
func NewSubscriptionServices(
logger *slog.Logger,
db *entdb.Client,
featureConnector feature.FeatureConnector,
entitlementRegistry *registry.Entitlement,
customerService customer.Service,
planService plan.Service,
planAddonService planaddon.Service,
addonService addon.Service,
eventPublisher eventbus.Publisher,
lockr *lockr.Locker,
featureFlags ffx.Service,
taxCodeService taxcode.Service,
) (SubscriptionServiceWithWorkflow, error) {
subscriptionRepo := subscriptionrepo.NewSubscriptionRepo(db)
subscriptionPhaseRepo := subscriptionrepo.NewSubscriptionPhaseRepo(db)
subscriptionItemRepo := subscriptionrepo.NewSubscriptionItemRepo(db)
subscriptionEntitlementAdapter := subscriptionentitlement.NewSubscriptionEntitlementAdapter(
entitlementRegistry.Entitlement,
subscriptionItemRepo,
subscriptionItemRepo,
)
subscriptionService, err := subscriptionservice.New(subscriptionservice.ServiceConfig{
SubscriptionRepo: subscriptionRepo,
SubscriptionPhaseRepo: subscriptionPhaseRepo,
SubscriptionItemRepo: subscriptionItemRepo,
CustomerService: customerService,
EntitlementAdapter: subscriptionEntitlementAdapter,
FeatureService: featureConnector,
TransactionManager: subscriptionRepo,
Publisher: eventPublisher,
FeatureFlags: featureFlags,
Lockr: lockr,
TaxCode: taxCodeService,
})
if err != nil {
return SubscriptionServiceWithWorkflow{}, err
}
subAddRepo := subscriptionaddonrepo.NewSubscriptionAddonRepo(db)
subAddQtyRepo := subscriptionaddonrepo.NewSubscriptionAddonQuantityRepo(db)
subAddSvc, err := subscriptionaddonservice.NewService(subscriptionaddonservice.Config{
TxManager: subAddRepo,
Logger: logger,
AddonService: addonService,
SubService: subscriptionService,
SubAddRepo: subAddRepo,
SubAddQtyRepo: subAddQtyRepo,
PlanAddonService: planAddonService,
Publisher: eventPublisher,
})
if err != nil {
return SubscriptionServiceWithWorkflow{}, err
}
subscriptionWorkflowService := subscriptionworkflowservice.NewWorkflowService(subscriptionworkflowservice.WorkflowServiceConfig{
Service: subscriptionService,
CustomerService: customerService,
TransactionManager: subscriptionRepo,
AddonService: subAddSvc,
Logger: logger.With("subsystem", "subscription.workflow.service"),
Lockr: lockr,
FeatureFlags: featureFlags,
})
planSubscriptionService := subscriptionchangeservice.New(subscriptionchangeservice.Config{
WorkflowService: subscriptionWorkflowService,
SubscriptionService: subscriptionService,
PlanService: planService,
CustomerService: customerService,
Logger: logger.With("subsystem", "subscription.change.service"),
})
validator, err := subscriptioncustomer.NewValidator(subscriptionService, customerService)
if err != nil {
return SubscriptionServiceWithWorkflow{}, err
}
annotationCleanupHook, err := annotationhook.NewAnnotationCleanupHook(subscriptionService, subscriptionRepo, logger)
if err != nil {
return SubscriptionServiceWithWorkflow{}, err
}
if err := subscriptionService.RegisterHook(annotationCleanupHook); err != nil {
return SubscriptionServiceWithWorkflow{}, err
}
customerService.RegisterRequestValidator(validator)
return SubscriptionServiceWithWorkflow{
Service: subscriptionService,
WorkflowService: subscriptionWorkflowService,
PlanSubscriptionService: planSubscriptionService,
SubscriptionAddonService: subAddSvc,
}, nil
}