diff --git a/apps/carrier-connector/internal/services/service.go b/apps/carrier-connector/internal/services/service.go index 940dc46..63860fd 100644 --- a/apps/carrier-connector/internal/services/service.go +++ b/apps/carrier-connector/internal/services/service.go @@ -6,24 +6,25 @@ import ( "time" "github.com/google/uuid" + "github.com/nutcas3/telecom-platform/apps/carrier-connector/internal/repository" "github.com/sirupsen/logrus" ) // Service provides business logic for rate plan operations type Service struct { - repo Repository + repo repository.Repository logger *logrus.Logger } // NewService creates a new rate plan service -func NewService(repo Repository, logger *logrus.Logger) *Service { +func NewService(repo repository.Repository, logger *logrus.Logger) *Service { return &Service{ repo: repo, logger: logger, } } -func (s *Service) CreateRatePlan(ctx context.Context, plan *RatePlan) (*RatePlan, error) { +func (s *Service) CreateRatePlan(ctx context.Context, plan *repository.RatePlan) (*repository.RatePlan, error) { // Generate ID if not provided if plan.ID == "" { plan.ID = uuid.New().String() @@ -45,7 +46,7 @@ func (s *Service) CreateRatePlan(ctx context.Context, plan *RatePlan) (*RatePlan } // GetRatePlan retrieves a rate plan by ID -func (s *Service) GetRatePlan(ctx context.Context, id string) (*RatePlan, error) { +func (s *Service) GetRatePlan(ctx context.Context, id string) (*repository.RatePlan, error) { plan, err := s.repo.GetRatePlan(ctx, id) if err != nil { s.logger.WithError(err).WithField("plan_id", id).Error("Failed to get rate plan") @@ -56,7 +57,7 @@ func (s *Service) GetRatePlan(ctx context.Context, id string) (*RatePlan, error) } // UpdateRatePlan updates an existing rate plan -func (s *Service) UpdateRatePlan(ctx context.Context, plan *RatePlan) (*RatePlan, error) { +func (s *Service) UpdateRatePlan(ctx context.Context, plan *repository.RatePlan) (*repository.RatePlan, error) { // Validate rate plan if err := s.validateRatePlan(plan); err != nil { return nil, fmt.Errorf("validation failed: %w", err) @@ -81,9 +82,9 @@ func (s *Service) UpdateRatePlan(ctx context.Context, plan *RatePlan) (*RatePlan // DeleteRatePlan deletes a rate plan func (s *Service) DeleteRatePlan(ctx context.Context, id string) error { // Check if plan has active subscriptions - subscriptions, err := s.repo.ListSubscriptions(ctx, "", &SubscriptionFilter{ + subscriptions, err := s.repo.ListSubscriptions(ctx, "", &repository.SubscriptionFilter{ RatePlanID: id, - Status: SubscriptionStatusActive, + Status: repository.SubscriptionStatusActive, Limit: 1, }) if err != nil { @@ -105,7 +106,7 @@ func (s *Service) DeleteRatePlan(ctx context.Context, id string) error { } // ListRatePlans retrieves rate plans with filtering -func (s *Service) ListRatePlans(ctx context.Context, filter *RatePlanFilter) ([]*RatePlan, error) { +func (s *Service) ListRatePlans(ctx context.Context, filter *repository.RatePlanFilter) ([]*repository.RatePlan, error) { plans, err := s.repo.ListRatePlans(ctx, filter) if err != nil { s.logger.WithError(err).Error("Failed to list rate plans") @@ -116,12 +117,12 @@ func (s *Service) ListRatePlans(ctx context.Context, filter *RatePlanFilter) ([] } // SearchRatePlans searches for rate plans based on criteria -func (s *Service) SearchRatePlans(ctx context.Context, criteria SearchCriteria) ([]*RatePlan, error) { - filter := &RatePlanFilter{ +func (s *Service) SearchRatePlans(ctx context.Context, criteria repository.SearchCriteria) ([]*repository.RatePlan, error) { + filter := &repository.RatePlanFilter{ CarrierID: criteria.CarrierID, Region: criteria.Region, PlanType: criteria.PlanType, - Status: PlanStatusActive, + Status: repository.PlanStatusActive, IsActive: &[]bool{true}[0], MinPrice: criteria.MinPrice, MaxPrice: criteria.MaxPrice, @@ -133,8 +134,9 @@ func (s *Service) SearchRatePlans(ctx context.Context, criteria SearchCriteria) return s.repo.ListRatePlans(ctx, filter) } + // CalculateCost calculates the cost for a rate plan based on usage -func (s *Service) CalculateCost(ctx context.Context, req *CalculateCostRequest) (*RatePlanCostCalculation, error) { +func (s *Service) CalculateCost(ctx context.Context, req *repository.CalculateCostRequest) (*repository.RatePlanCostCalculation, error) { // Get the rate plan plan, err := s.repo.GetRatePlan(ctx, req.RatePlanID) if err != nil { @@ -166,9 +168,9 @@ func (s *Service) CalculateCost(ctx context.Context, req *CalculateCostRequest) for _, discount := range plan.Discounts { if discount.ID == discountID && discount.IsActive { switch discount.Type { - case DiscountTypePercentage: + case repository.DiscountTypePercentage: discountCost += baseCost * discount.Value / 100 - case DiscountTypeFixed: + case repository.DiscountTypeFixed: discountCost += discount.Value } } @@ -178,7 +180,7 @@ func (s *Service) CalculateCost(ctx context.Context, req *CalculateCostRequest) totalCost := baseCost + overageCost - discountCost - calculation := &RatePlanCostCalculation{ + calculation := &repository.RatePlanCostCalculation{ RatePlanID: req.RatePlanID, BaseCost: baseCost, OverageCost: overageCost, diff --git a/apps/carrier-connector/internal/services/service_subscription.go b/apps/carrier-connector/internal/services/service_subscription.go index 4bfec0a..d0c914e 100644 --- a/apps/carrier-connector/internal/services/service_subscription.go +++ b/apps/carrier-connector/internal/services/service_subscription.go @@ -6,10 +6,11 @@ import ( "time" "github.com/google/uuid" + "github.com/nutcas3/telecom-platform/apps/carrier-connector/internal/repository" "github.com/sirupsen/logrus" ) -func (s *Service) SubscribeToPlan(ctx context.Context, req *SubscribeRequest) (*RatePlanSubscription, error) { +func (s *Service) SubscribeToPlan(ctx context.Context, req *repository.SubscribeRequest) (*repository.RatePlanSubscription, error) { if err := s.validateSubscribeRequest(req); err != nil { return nil, fmt.Errorf("validation failed: %w", err) } @@ -19,7 +20,7 @@ func (s *Service) SubscribeToPlan(ctx context.Context, req *SubscribeRequest) (* return nil, err } - if !plan.IsActive || plan.Status != PlanStatusActive { + if !plan.IsActive || plan.Status != repository.PlanStatusActive { return nil, fmt.Errorf("rate plan is not available for subscription") } @@ -33,11 +34,11 @@ func (s *Service) SubscribeToPlan(ctx context.Context, req *SubscribeRequest) (* } // Create subscription - subscription := &RatePlanSubscription{ + subscription := &repository.RatePlanSubscription{ ID: uuid.New().String(), ProfileID: req.ProfileID, RatePlanID: req.RatePlanID, - Status: SubscriptionStatusActive, + Status: repository.SubscriptionStatusActive, StartedAt: time.Now(), BillingCycle: plan.BillingCycle, NextBillingDate: s.calculateNextBillingDate(plan.BillingCycle, time.Now()), @@ -62,7 +63,7 @@ func (s *Service) SubscribeToPlan(ctx context.Context, req *SubscribeRequest) (* } // GetSubscription retrieves a subscription by ID -func (s *Service) GetSubscription(ctx context.Context, id string) (*RatePlanSubscription, error) { +func (s *Service) GetSubscription(ctx context.Context, id string) (*repository.RatePlanSubscription, error) { subscription, err := s.repo.GetSubscription(ctx, id) if err != nil { s.logger.WithError(err).WithField("subscription_id", id).Error("Failed to get subscription") @@ -73,7 +74,7 @@ func (s *Service) GetSubscription(ctx context.Context, id string) (*RatePlanSubs } // UpdateSubscription updates an existing subscription -func (s *Service) UpdateSubscription(ctx context.Context, subscription *RatePlanSubscription) (*RatePlanSubscription, error) { +func (s *Service) UpdateSubscription(ctx context.Context, subscription *repository.RatePlanSubscription) (*repository.RatePlanSubscription, error) { if err := s.repo.UpdateSubscription(ctx, subscription); err != nil { s.logger.WithError(err).Error("Failed to update subscription") return nil, err @@ -90,12 +91,12 @@ func (s *Service) CancelSubscription(ctx context.Context, subscriptionID string, return err } - if subscription.Status != SubscriptionStatusActive { + if subscription.Status != repository.SubscriptionStatusActive { return fmt.Errorf("subscription is not active") } now := time.Now() - subscription.Status = SubscriptionStatusCancelled + subscription.Status = repository.SubscriptionStatusCancelled subscription.EndedAt = &now subscription.UpdatedAt = now @@ -114,7 +115,7 @@ func (s *Service) CancelSubscription(ctx context.Context, subscriptionID string, } // GetActiveSubscription retrieves the active subscription for a profile -func (s *Service) GetActiveSubscription(ctx context.Context, profileID string) (*RatePlanSubscription, error) { +func (s *Service) GetActiveSubscription(ctx context.Context, profileID string) (*repository.RatePlanSubscription, error) { subscription, err := s.repo.GetActiveSubscription(ctx, profileID) if err != nil { s.logger.WithError(err).WithField("profile_id", profileID).Error("Failed to get active subscription") @@ -125,7 +126,7 @@ func (s *Service) GetActiveSubscription(ctx context.Context, profileID string) ( } // ListSubscriptions retrieves subscriptions for a profile -func (s *Service) ListSubscriptions(ctx context.Context, profileID string, filter *SubscriptionFilter) ([]*RatePlanSubscription, error) { +func (s *Service) ListSubscriptions(ctx context.Context, profileID string, filter *repository.SubscriptionFilter) ([]*repository.RatePlanSubscription, error) { subscriptions, err := s.repo.ListSubscriptions(ctx, profileID, filter) if err != nil { s.logger.WithError(err).Error("Failed to list subscriptions") @@ -135,7 +136,7 @@ func (s *Service) ListSubscriptions(ctx context.Context, profileID string, filte return subscriptions, nil } -func (s *Service) RecordUsage(ctx context.Context, req *RecordUsageRequest) (*RatePlanUsage, error) { +func (s *Service) RecordUsage(ctx context.Context, req *repository.RecordUsageRequest) (*repository.RatePlanUsage, error) { // Get active subscription subscription, err := s.repo.GetActiveSubscription(ctx, req.ProfileID) if err != nil { @@ -153,10 +154,10 @@ func (s *Service) RecordUsage(ctx context.Context, req *RecordUsageRequest) (*Ra } // Create or update usage record - var usage *RatePlanUsage + var usage *repository.RatePlanUsage if currentUsage == nil { // Create new usage record - usage = &RatePlanUsage{ + usage = &repository.RatePlanUsage{ ID: uuid.New().String(), RatePlanID: subscription.RatePlanID, ProfileID: req.ProfileID,