Files
nutcas3 8fddb29716 refactor: Replace fmt.Printf with structured logging using logrus in api-server subscriber and invoice services
- Add logrus import to invoice.go, subscriber_crud.go, subscriber_esim.go, and subscriber_lifecycle.go
- Replace fmt.Printf with logrus.WithError and WithField for structured error logging
- Update invoice email notification placeholder to use logrus.Info with invoice_id field
- Replace eSIM provisioning error print with logrus.Warn including subscriber_id field
- Add comment explaining derived
2026-04-29 04:36:02 +03:00

95 lines
3.2 KiB
Go

package services
import (
"context"
"fmt"
"github.com/nutcas3/telecom-platform/apps/api-server/internal/models"
"github.com/sirupsen/logrus"
)
// provisionESIMProfile provisions an eSIM profile for the subscriber
func (s *SubscriberService) provisionESIMProfile(ctx context.Context, subscriberID uint) error {
// Get subscriber details
subscriber, err := s.db.GetSubscriber(ctx, subscriberID)
if err != nil {
return fmt.Errorf("failed to get subscriber: %w", err)
}
// Validate EID
if err := s.es2Service.ValidateEID(subscriber.EUICCID); err != nil {
return fmt.Errorf("invalid EID: %w", err)
}
// Provision profile via ES2+ API
profileInfo, err := s.es2Service.ProvisionProfile(ctx, subscriber)
if err != nil {
return fmt.Errorf("failed to provision profile: %w", err)
}
// Update subscriber with profile information
subscriber.ProfileID = profileInfo.ProfileID
subscriber.ProfileStatus = models.ProfileStatusDownloading
if err := s.db.UpdateSubscriber(ctx, subscriber); err != nil {
return fmt.Errorf("failed to update subscriber: %w", err)
}
// Activate profile
if err := s.es2Service.ActivateProfile(ctx, subscriber.EUICCID, profileInfo.ProfileID); err != nil {
return fmt.Errorf("failed to activate profile: %w", err)
}
// Update subscriber status
subscriber.ProfileStatus = models.ProfileStatusActive
if err := s.db.UpdateSubscriber(ctx, subscriber); err != nil {
return fmt.Errorf("failed to update subscriber status: %w", err)
}
// Notify AMF of new subscriber
if err := s.amfClient.NotifySubscriberUpdate(ctx, subscriber.IMSI, models.SubscriberStatusActive); err != nil {
logrus.WithError(err).WithField("imsi", subscriber.IMSI).Warn("Failed to notify AMF of subscriber activation")
}
return nil
}
// deactivateESIMProfile deactivates an eSIM profile
func (s *SubscriberService) deactivateESIMProfile(ctx context.Context, subscriberID uint) error {
// Get subscriber details
subscriber, err := s.db.GetSubscriber(ctx, subscriberID)
if err != nil {
return fmt.Errorf("failed to get subscriber: %w", err)
}
// Check if subscriber has active profile
if subscriber.ProfileID == "" || subscriber.ProfileStatus != models.ProfileStatusActive {
return fmt.Errorf("no active profile to deactivate")
}
// Deactivate profile via ES2+ API
if err := s.es2Service.DeactivateProfile(ctx, subscriber.EUICCID, subscriber.ProfileID); err != nil {
return fmt.Errorf("failed to deactivate profile: %w", err)
}
// Update subscriber status
subscriber.ProfileStatus = models.ProfileStatusInactive
subscriber.Status = models.SubscriberStatusInactive
if err := s.db.UpdateSubscriber(ctx, subscriber); err != nil {
return fmt.Errorf("failed to update subscriber: %w", err)
}
// Terminate all sessions
if err := s.terminateSubscriberSessions(ctx, subscriber.IMSI); err != nil {
logrus.WithError(err).WithField("imsi", subscriber.IMSI).Warn("Failed to terminate sessions")
}
// Notify AMF of subscriber deactivation
if err := s.amfClient.NotifySubscriberUpdate(ctx, subscriber.IMSI, models.SubscriberStatusInactive); err != nil {
logrus.WithError(err).WithField("imsi", subscriber.IMSI).Warn("Failed to notify AMF of subscriber deactivation")
}
return nil
}