mirror of
https://github.com/andwati/telecom-platform.git
synced 2026-11-09 13:35:15 +00:00
feat: Refactor SubscriberService to split monolithic service into modular files with method organization by domain
- Remove all method implementations from subscriber.go (CreateSubscriber/GetSubscriber/GetSubscriberByIMSI/UpdateSubscriber/SuspendSubscriber/TerminateSubscriber/ListSubscribers/terminateSubscriberSessions/GetAccount/ListInvoices/GetInvoice/ListRatingPlans/GetRatingPlan/ListAlerts/SearchSubscribers/ResolveAlert/CreateAlert and all other methods) - Update SubscriberService struct comment
This commit is contained in:
@@ -0,0 +1,127 @@
|
||||
package services
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
|
||||
"github.com/nutcas3/telecom-platform/apps/api-server/internal/database"
|
||||
"github.com/nutcas3/telecom-platform/apps/api-server/internal/models"
|
||||
)
|
||||
|
||||
// CreateSubscriber creates a new subscriber with allocated IMSI.
|
||||
func (s *SubscriberService) CreateSubscriber(ctx context.Context, req *CreateSubscriberRequest) (*models.Subscriber, error) {
|
||||
imsi, err := s.allocateIMSI(ctx)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to allocate IMSI: %w", err)
|
||||
}
|
||||
|
||||
authKey, opc, err := s.generateAuthKeys()
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to generate auth keys: %w", err)
|
||||
}
|
||||
|
||||
subscriber := &models.Subscriber{
|
||||
IMSI: imsi,
|
||||
MSISDN: req.MSISDN,
|
||||
FirstName: req.FirstName,
|
||||
LastName: req.LastName,
|
||||
Email: req.Email,
|
||||
OrganizationID: req.OrganizationID,
|
||||
Status: models.SubscriberStatusActive,
|
||||
PlanID: req.PlanID,
|
||||
AuthKey: authKey,
|
||||
OPc: opc,
|
||||
ServingPLMN: models.PLMN{MCC: "208", MNC: "93"},
|
||||
ProfileStatus: models.ProfileStatusInactive,
|
||||
}
|
||||
|
||||
if err := s.db.CreateSubscriber(ctx, subscriber); err != nil {
|
||||
return nil, fmt.Errorf("failed to create subscriber: %w", err)
|
||||
}
|
||||
|
||||
if req.EUICCID != "" {
|
||||
subscriber.EUICCID = req.EUICCID
|
||||
go func() {
|
||||
bgCtx := context.Background()
|
||||
if err := s.provisionESIMProfile(bgCtx, subscriber.ID); err != nil {
|
||||
fmt.Printf("Failed to provision eSIM profile for subscriber %d: %v\n", subscriber.ID, err)
|
||||
}
|
||||
}()
|
||||
} else {
|
||||
subscriber.Status = models.SubscriberStatusActive
|
||||
subscriber.ProfileStatus = models.ProfileStatusActive
|
||||
s.db.UpdateSubscriber(ctx, subscriber)
|
||||
}
|
||||
|
||||
return subscriber, nil
|
||||
}
|
||||
|
||||
// GetSubscriber retrieves a subscriber by ID.
|
||||
func (s *SubscriberService) GetSubscriber(ctx context.Context, id uint) (*models.Subscriber, error) {
|
||||
subscriber, err := s.db.GetSubscriber(ctx, id)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to get subscriber: %w", err)
|
||||
}
|
||||
return subscriber, nil
|
||||
}
|
||||
|
||||
// GetSubscriberByIMSI retrieves a subscriber by IMSI.
|
||||
func (s *SubscriberService) GetSubscriberByIMSI(ctx context.Context, imsi models.IMSI) (*models.Subscriber, error) {
|
||||
subscriber, err := s.db.GetSubscriberByIMSI(ctx, imsi)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to get subscriber by IMSI: %w", err)
|
||||
}
|
||||
return subscriber, nil
|
||||
}
|
||||
|
||||
// UpdateSubscriber updates subscriber information.
|
||||
func (s *SubscriberService) UpdateSubscriber(ctx context.Context, id uint, req *UpdateSubscriberRequest) (*models.Subscriber, error) {
|
||||
subscriber, err := s.db.GetSubscriber(ctx, id)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to get subscriber: %w", err)
|
||||
}
|
||||
|
||||
if req.FirstName != nil && *req.FirstName != "" {
|
||||
subscriber.FirstName = *req.FirstName
|
||||
}
|
||||
if req.LastName != nil && *req.LastName != "" {
|
||||
subscriber.LastName = *req.LastName
|
||||
}
|
||||
if req.Email != nil && *req.Email != "" {
|
||||
subscriber.Email = *req.Email
|
||||
}
|
||||
if req.Status != "" {
|
||||
subscriber.Status = req.Status
|
||||
}
|
||||
if req.PlanID != nil {
|
||||
subscriber.PlanID = *req.PlanID
|
||||
}
|
||||
|
||||
if err := s.db.UpdateSubscriber(ctx, subscriber); err != nil {
|
||||
return nil, fmt.Errorf("failed to update subscriber: %w", err)
|
||||
}
|
||||
|
||||
return subscriber, nil
|
||||
}
|
||||
|
||||
// ListSubscribers lists subscribers with pagination and filtering.
|
||||
func (s *SubscriberService) ListSubscribers(ctx context.Context, req *ListSubscribersRequest) (*ListSubscribersResponse, error) {
|
||||
dbReq := &database.ListSubscribersRequest{
|
||||
Page: req.Page,
|
||||
PageSize: req.PageSize,
|
||||
Status: req.Status,
|
||||
OrganizationID: req.OrganizationID,
|
||||
Search: req.Search,
|
||||
}
|
||||
subscribers, total, err := s.db.ListSubscribers(ctx, dbReq)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to list subscribers: %w", err)
|
||||
}
|
||||
|
||||
return &ListSubscribersResponse{
|
||||
Subscribers: subscribers,
|
||||
Total: total,
|
||||
Page: req.Page,
|
||||
PageSize: req.PageSize,
|
||||
}, nil
|
||||
}
|
||||
Reference in New Issue
Block a user