refactor: Extract helper methods, fix formatting, and add TODO comments for pending implementations

- Extract generateHistoryAnalytics helper in selection_handler_methods.go
- Extract generateRecommendations helper in selection_handler_selection.go
- Extract parsePositiveInt helper in rateplan_handlers_analytics.go
- Replace hardcoded URL path with action parameter in ES2Service.sendActivationRequest
- Add TODO comments for wrapCurrencyService and updateCarrierWeights pending implementations
- Fix struct field alignment and formatting in carrier_methods.go
This commit is contained in:
nutcas3
2026-05-02 05:08:43 +03:00
parent d2bd13eff6
commit ec812835c8
6 changed files with 40 additions and 46 deletions
@@ -16,7 +16,7 @@ func (e *ES2Service) sendActivationRequest(ctx context.Context, req ActivationRe
return fmt.Errorf("failed to marshal activation request: %w", err)
}
url := fmt.Sprintf("%s/es2/activate", e.config.BaseURL)
url := fmt.Sprintf("%s/es2/%s", e.config.BaseURL, action)
httpReq, err := http.NewRequestWithContext(ctx, "POST", url, bytes.NewBuffer(jsonData))
if err != nil {
return fmt.Errorf("failed to create HTTP request: %w", err)
@@ -2,7 +2,6 @@ package handlers
import (
"net/http"
"strconv"
"time"
"github.com/gin-gonic/gin"
@@ -111,12 +110,7 @@ func (h *RatePlanHandler) GetRevenueAnalytics(c *gin.Context) {
// GetPopularPlans handles retrieving the most popular rate plans
func (h *RatePlanHandler) GetPopularPlans(c *gin.Context) {
limit := 10 // default limit
if limitStr := c.Query("limit"); limitStr != "" {
if parsedLimit, err := strconv.Atoi(limitStr); err == nil && parsedLimit > 0 {
limit = parsedLimit
}
}
limit := parsePositiveInt(c.Query("limit"), 10)
plans, err := h.service.GetPopularPlans(c.Request.Context(), limit)
if err != nil {
@@ -3,7 +3,6 @@ package handlers
import (
"encoding/json"
"net/http"
"time"
)
// GetSelectionHistory handles the selection history endpoint
@@ -24,10 +23,7 @@ func (h *SelectionHandler) GetSelectionHistory(w http.ResponseWriter, r *http.Re
history := h.manager.GetSelectionHistory(carrierID)
// Generate analytics
analytics := map[string]any{
"total_selections": len(history),
"generated_at": time.Now().Format(time.RFC3339),
}
analytics := h.generateHistoryAnalytics(history)
response := SelectionHistoryResponse{
Success: true,
@@ -55,7 +55,7 @@ func (h *SelectionHandler) SelectOptimalCarrier(w http.ResponseWriter, r *http.R
}
// Generate recommendations
recommendations := []string{"Carrier selected successfully"}
recommendations := h.generateRecommendations(score, criteria)
response := SelectOptimalCarrierResponse{
Success: true,
@@ -69,7 +69,7 @@ func (h *SelectionHandler) SelectOptimalCarrier(w http.ResponseWriter, r *http.R
CapabilityScore: score.CapabilityScore,
SelectedAt: score.SelectedAt.Format(time.RFC3339),
Reason: score.Reason,
Recommendations: recommendations,
Recommendations: recommendations,
}
h.writeJSONResponse(w, http.StatusOK, response)
@@ -21,9 +21,11 @@ type TenantAwareServices struct {
// wrapCurrencyService creates a tenant-aware currency service
func (m *TenantIntegrationManager) wrapCurrencyService(tenantID string) currency.BillingService {
// This would wrap the existing currency service with tenant isolation
// Implementation depends on the actual currency service structure
return m.currencyService // Placeholder - would need actual wrapping
// TODO: Implement tenant isolation for currency service
// The tenantID parameter should be used to filter currency operations by tenant
// For now, return the base service - implementation needed for multi-tenant isolation
_ = tenantID // Suppress unused parameter warning until implementation is complete
return m.currencyService
}
// TenantResourceQuotaChecker checks resource quotas before operations
@@ -9,11 +9,11 @@ import (
func (csi *CarrierSelectionIntegrator) getAvailableRatePlans(ctx context.Context, region string, planType PlanType, maxBudget float64) ([]*RatePlan, error) {
filter := &RatePlanFilter{
Region: region,
PlanType: planType,
Status: PlanStatusActive,
IsActive: &[]bool{true}[0],
MaxPrice: maxBudget,
Region: region,
PlanType: planType,
Status: PlanStatusActive,
IsActive: &[]bool{true}[0],
MaxPrice: maxBudget,
}
return csi.ratePlanRepo.ListRatePlans(ctx, filter)
@@ -113,18 +113,18 @@ func (csi *CarrierSelectionIntegrator) calculateCombinedScore(carrier *smdp.Carr
func (csi *CarrierSelectionIntegrator) createRecommendation(plan *RatePlan, carrier *smdp.Carrier, criteria *RecommendationCriteria) *RatePlanRecommendation {
recommendation := &RatePlanRecommendation{
RatePlanID: plan.ID,
RatePlanName: plan.Name,
CarrierID: carrier.ID,
CarrierName: carrier.Name,
Price: plan.BasePrice,
Currency: plan.Currency,
Relevance: csi.calculateRelevance(plan, criteria),
Features: plan.Features,
DataAllowance: plan.DataAllowance,
RatePlanID: plan.ID,
RatePlanName: plan.Name,
CarrierID: carrier.ID,
CarrierName: carrier.Name,
Price: plan.BasePrice,
Currency: plan.Currency,
Relevance: csi.calculateRelevance(plan, criteria),
Features: plan.Features,
DataAllowance: plan.DataAllowance,
VoiceAllowance: plan.VoiceAllowance,
SMSAllowance: plan.SMSAllowance,
RecommendedAt: time.Now(),
SMSAllowance: plan.SMSAllowance,
RecommendedAt: time.Now(),
}
return recommendation
@@ -159,8 +159,10 @@ func (csi *CarrierSelectionIntegrator) calculateRelevance(plan *RatePlan, criter
}
func (csi *CarrierSelectionIntegrator) updateCarrierWeights(analytics *UsageAnalytics) {
// This would update the carrier selection weights based on usage patterns
// Implementation depends on the specific carrier selection algorithm
// TODO: Implement actual weight update based on analytics
// The analytics parameter should be used to adjust carrier selection weights
// For now, just log that we received the analytics data
_ = analytics // Suppress unused parameter warning until implementation is complete
csi.logger.Info("Updated carrier selection weights based on usage analytics")
}
@@ -187,16 +189,16 @@ func (csi *CarrierSelectionIntegrator) getPlanAnalytics(ctx context.Context, pla
}
return &RatePlanAnalytics{
RatePlanID: plan.ID,
RatePlanName: plan.Name,
BasePrice: plan.BasePrice,
Currency: plan.Currency,
RatePlanID: plan.ID,
RatePlanName: plan.Name,
BasePrice: plan.BasePrice,
Currency: plan.Currency,
ActiveSubscriptions: subscriptionCount,
PlanType: plan.PlanType,
BillingCycle: plan.BillingCycle,
DataAllowance: plan.DataAllowance,
VoiceAllowance: plan.VoiceAllowance,
SMSAllowance: plan.SMSAllowance,
Features: plan.Features,
PlanType: plan.PlanType,
BillingCycle: plan.BillingCycle,
DataAllowance: plan.DataAllowance,
VoiceAllowance: plan.VoiceAllowance,
SMSAllowance: plan.SMSAllowance,
Features: plan.Features,
}
}