mirror of
https://github.com/andwati/telecom-platform.git
synced 2026-10-26 22:52:16 +00:00
- Split profile_handlers.go into profile_handlers_core.go, profile_handlers_management_core.go, and profile_handlers_management_delete.go - Simplify OrderProfileHandlerWithRepo with ICCID/IMSI-only validation and "downloaded" state - Remove webhook and message queue notifications from order handler - Add UpdateProfileHandler with state validation for downloaded/activated/deactivated/expired - Add DeleteProfileHandler with existence
200 lines
5.3 KiB
Go
200 lines
5.3 KiB
Go
package integration
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
"github.com/nutcas3/telecom-platform/apps/carrier-connector/internal/handlers"
|
|
"github.com/nutcas3/telecom-platform/apps/carrier-connector/internal/repository"
|
|
"github.com/nutcas3/telecom-platform/apps/carrier-connector/internal/service"
|
|
"github.com/nutcas3/telecom-platform/apps/carrier-connector/internal/smdp"
|
|
"github.com/sirupsen/logrus"
|
|
)
|
|
|
|
// SMDPIntegration integrates the multi-carrier SM-DP+ system with the existing carrier connector
|
|
type SMDPIntegration struct {
|
|
service *service.SMDPService
|
|
handler *handlers.SMDPHandler
|
|
repository *repository.PostgresProfileStore
|
|
logger *logrus.Logger
|
|
}
|
|
|
|
// NewSMDPIntegration creates a new SM-DP+ integration
|
|
func NewSMDPIntegration(repo *repository.PostgresProfileStore) *SMDPIntegration {
|
|
logger := logrus.New()
|
|
logger.SetLevel(logrus.InfoLevel)
|
|
|
|
svc := service.NewSMDPService(repo)
|
|
manager := svc.GetManager()
|
|
hnd := handlers.NewSMDPHandler(manager)
|
|
|
|
integration := &SMDPIntegration{
|
|
service: svc,
|
|
handler: hnd,
|
|
repository: repo,
|
|
logger: logger,
|
|
}
|
|
|
|
// Initialize default carriers
|
|
if err := integration.InitializeSystem(); err != nil {
|
|
logger.WithError(err).Error("Failed to initialize SM-DP+ integration")
|
|
}
|
|
|
|
return integration
|
|
}
|
|
|
|
// InitializeSystem sets up the SM-DP+ system with default carriers and configuration
|
|
func (i *SMDPIntegration) InitializeSystem() error {
|
|
i.logger.Info("Initializing SM-DP+ Multi-Carrier Integration")
|
|
|
|
// Initialize default carriers
|
|
if err := i.service.InitializeDefaultCarriers(); err != nil {
|
|
return fmt.Errorf("failed to initialize default carriers: %w", err)
|
|
}
|
|
|
|
// Log system status
|
|
carriers := i.service.GetCarrierHealth()
|
|
i.logger.WithField("carrier_count", len(carriers)).Info("SM-DP+ system initialized")
|
|
|
|
for id, carrier := range carriers {
|
|
i.logger.WithFields(logrus.Fields{
|
|
"carrier_id": id,
|
|
"carrier_name": carrier.Name,
|
|
"country": carrier.CountryCode,
|
|
"health_status": carrier.HealthStatus,
|
|
"is_active": carrier.IsActive,
|
|
}).Info("Carrier loaded")
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// RegisterRoutes registers SM-DP+ routes with the Gin router
|
|
func (i *SMDPIntegration) RegisterRoutes(router *gin.RouterGroup) {
|
|
smdp := router.Group("/smdp")
|
|
{
|
|
// Profile management
|
|
smdp.POST("/download", i.handler.DownloadProfile)
|
|
smdp.POST("/status", i.handler.GetProfileStatus)
|
|
|
|
// Carrier management
|
|
smdp.POST("/carriers", i.handler.AddCarrier)
|
|
smdp.DELETE("/carriers/:id", i.handler.RemoveCarrier)
|
|
smdp.GET("/carriers/status", i.handler.GetCarrierStatus)
|
|
|
|
// Health and metrics
|
|
smdp.GET("/health", i.healthHandler)
|
|
smdp.GET("/metrics", i.metricsHandler)
|
|
}
|
|
|
|
i.logger.Info("SM-DP+ routes registered")
|
|
}
|
|
|
|
// healthHandler returns system health status
|
|
func (i *SMDPIntegration) healthHandler(c *gin.Context) {
|
|
carriers := i.service.GetCarrierHealth()
|
|
|
|
healthyCount := 0
|
|
totalCount := len(carriers)
|
|
|
|
for _, carrier := range carriers {
|
|
if carrier.HealthStatus == smdp.CarrierStatusHealthy {
|
|
healthyCount++
|
|
}
|
|
}
|
|
|
|
status := "healthy"
|
|
if healthyCount == 0 {
|
|
status = "unhealthy"
|
|
} else if healthyCount < totalCount {
|
|
status = "degraded"
|
|
}
|
|
|
|
c.JSON(200, gin.H{
|
|
"status": status,
|
|
"healthy_carriers": healthyCount,
|
|
"total_carriers": totalCount,
|
|
"carriers": carriers,
|
|
})
|
|
}
|
|
|
|
// metricsHandler returns system metrics
|
|
func (i *SMDPIntegration) metricsHandler(c *gin.Context) {
|
|
metrics := i.service.GetCarrierMetrics()
|
|
carriers := i.service.GetCarrierHealth()
|
|
|
|
response := gin.H{
|
|
"carrier_metrics": metrics,
|
|
"carrier_details": carriers,
|
|
"timestamp": gin.H{},
|
|
}
|
|
|
|
// Calculate total metrics
|
|
var totalRequests, totalSuccess, totalFailed uint64
|
|
for _, metric := range metrics {
|
|
totalRequests += metric.TotalRequests
|
|
totalSuccess += metric.SuccessfulRequests
|
|
totalFailed += metric.FailedRequests
|
|
}
|
|
|
|
response["total_metrics"] = gin.H{
|
|
"total_requests": totalRequests,
|
|
"successful_requests": totalSuccess,
|
|
"failed_requests": totalFailed,
|
|
"success_rate": float64(totalSuccess) / float64(totalRequests),
|
|
}
|
|
|
|
c.JSON(200, response)
|
|
}
|
|
|
|
// GetService returns the SM-DP+ service for direct access
|
|
func (i *SMDPIntegration) GetService() *service.SMDPService {
|
|
return i.service
|
|
}
|
|
|
|
// GetHandler returns the SM-DP+ handler for direct access
|
|
func (i *SMDPIntegration) GetHandler() *handlers.SMDPHandler {
|
|
return i.handler
|
|
}
|
|
|
|
// ExampleUsage demonstrates how to use the SM-DP+ integration
|
|
func ExampleUsage() {
|
|
// This would typically be in your main.go or router setup
|
|
|
|
/*
|
|
// Initialize repository
|
|
repo, err := repository.NewPostgresProfileStore("postgres://user:pass@localhost/db")
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
defer repo.Close()
|
|
|
|
// Create SM-DP+ integration
|
|
smdpIntegration := integration.NewSMDPIntegration(repo)
|
|
|
|
// Register routes
|
|
router := gin.Default()
|
|
api := router.Group("/api/v1")
|
|
smdpIntegration.RegisterRoutes(api)
|
|
|
|
// Get service for direct use
|
|
service := smdpIntegration.GetService()
|
|
|
|
// Example: Download profile
|
|
ctx := context.Background()
|
|
req := &smdp.ProfileRequest{
|
|
EID: "eid-example",
|
|
ICCID: "iccid-example",
|
|
ProfileType: "operational",
|
|
}
|
|
|
|
response, err := service.DownloadProfile(ctx, req)
|
|
if err != nil {
|
|
log.Printf("Profile download failed: %v", err)
|
|
return
|
|
}
|
|
|
|
log.Printf("Profile downloaded successfully from carrier %s", response.CarrierID)
|
|
*/
|
|
}
|