mirror of
https://github.com/andwati/telecom-platform.git
synced 2026-10-18 11:02:54 +00:00
- Replace map[string]interface{} with map[string]any in GraphQL, metrics, payment gateway, and webhook handlers
- Replace []byte(fmt.Sprintf()) with fmt.Appendf(nil, ...) for cursor encoding in GraphQL resolvers and tests
- Replace strings.HasPrefix/TrimPrefix with strings.CutPrefix for webhook signature parsing
- Replace stripe.Int64/Bool with new() constructor for Stripe payment parameters
- Rename Error
376 lines
13 KiB
Go
376 lines
13 KiB
Go
package graphql
|
|
|
|
// This file will be generated by gqlgen
|
|
// Run: go run github.com/99designs/gqlgen generate
|
|
|
|
import (
|
|
"context"
|
|
"time"
|
|
|
|
"github.com/99designs/gqlgen/graphql"
|
|
"github.com/nutcas3/telecom-platform/apps/api-server/internal/models"
|
|
"github.com/vektah/gqlparser/v2/ast"
|
|
)
|
|
|
|
// GraphQL type definitions
|
|
type SubscriberStatus string
|
|
type ProfileStatus string
|
|
type UsageType string
|
|
type SessionStatus string
|
|
type PaymentMethodType string
|
|
type InvoiceStatus string
|
|
type AlertType string
|
|
type AlertSeverity string
|
|
type SubscriberSort string
|
|
type UsagePeriod string
|
|
type TrendDirection string
|
|
|
|
const (
|
|
SubscriberStatusActive SubscriberStatus = "ACTIVE"
|
|
SubscriberStatusInactive SubscriberStatus = "INACTIVE"
|
|
SubscriberStatusSuspended SubscriberStatus = "SUSPENDED"
|
|
SubscriberStatusTerminated SubscriberStatus = "TERMINATED"
|
|
SubscriberStatusProvisioning SubscriberStatus = "PROVISIONING"
|
|
)
|
|
|
|
const (
|
|
ProfileStatusActive ProfileStatus = "ACTIVE"
|
|
ProfileStatusInactive ProfileStatus = "INACTIVE"
|
|
ProfileStatusDownloading ProfileStatus = "DOWNLOADING"
|
|
ProfileStatusFailed ProfileStatus = "FAILED"
|
|
)
|
|
|
|
const (
|
|
UsageTypeData UsageType = "DATA"
|
|
UsageTypeVoice UsageType = "VOICE"
|
|
UsageTypeSMS UsageType = "SMS"
|
|
)
|
|
|
|
const (
|
|
SessionStatusActive SessionStatus = "ACTIVE"
|
|
SessionStatusCompleted SessionStatus = "COMPLETED"
|
|
SessionStatusTerminated SessionStatus = "TERMINATED"
|
|
)
|
|
|
|
const (
|
|
PaymentMethodTypeCreditCard PaymentMethodType = "CREDIT_CARD"
|
|
PaymentMethodTypeBankAccount PaymentMethodType = "BANK_ACCOUNT"
|
|
)
|
|
|
|
const (
|
|
InvoiceStatusDraft InvoiceStatus = "DRAFT"
|
|
InvoiceStatusPending InvoiceStatus = "PENDING"
|
|
InvoiceStatusPaid InvoiceStatus = "PAID"
|
|
InvoiceStatusOverdue InvoiceStatus = "OVERDUE"
|
|
InvoiceStatusCancelled InvoiceStatus = "CANCELLED"
|
|
)
|
|
|
|
const (
|
|
AlertTypeLowBalance AlertType = "LOW_BALANCE"
|
|
AlertTypeHighUsage AlertType = "HIGH_USAGE"
|
|
AlertTypePaymentFailed AlertType = "PAYMENT_FAILED"
|
|
AlertTypeSystemError AlertType = "SYSTEM_ERROR"
|
|
)
|
|
|
|
const (
|
|
AlertSeverityLow AlertSeverity = "LOW"
|
|
AlertSeverityMedium AlertSeverity = "MEDIUM"
|
|
AlertSeverityHigh AlertSeverity = "HIGH"
|
|
AlertSeverityCritical AlertSeverity = "CRITICAL"
|
|
)
|
|
|
|
const (
|
|
SubscriberSortCreatedAtAsc SubscriberSort = "CREATED_AT_ASC"
|
|
SubscriberSortCreatedAtDesc SubscriberSort = "CREATED_AT_DESC"
|
|
SubscriberSortUpdatedAtAsc SubscriberSort = "UPDATED_AT_ASC"
|
|
SubscriberSortUpdatedAtDesc SubscriberSort = "UPDATED_AT_DESC"
|
|
SubscriberSortFirstNameAsc SubscriberSort = "FIRST_NAME_ASC"
|
|
SubscriberSortFirstNameDesc SubscriberSort = "FIRST_NAME_DESC"
|
|
SubscriberSortLastNameAsc SubscriberSort = "LAST_NAME_ASC"
|
|
SubscriberSortLastNameDesc SubscriberSort = "LAST_NAME_DESC"
|
|
SubscriberSortEmailAsc SubscriberSort = "EMAIL_ASC"
|
|
SubscriberSortEmailDesc SubscriberSort = "EMAIL_DESC"
|
|
SubscriberSortBalanceAsc SubscriberSort = "BALANCE_ASC"
|
|
SubscriberSortBalanceDesc SubscriberSort = "BALANCE_DESC"
|
|
SubscriberSortDataUsedAsc SubscriberSort = "DATA_USED_ASC"
|
|
SubscriberSortDataUsedDesc SubscriberSort = "DATA_USED_DESC"
|
|
)
|
|
|
|
const (
|
|
UsagePeriodDaily UsagePeriod = "DAILY"
|
|
UsagePeriodWeekly UsagePeriod = "WEEKLY"
|
|
UsagePeriodMonthly UsagePeriod = "MONTHLY"
|
|
UsagePeriodYearly UsagePeriod = "YEARLY"
|
|
)
|
|
|
|
const (
|
|
TrendDirectionUp TrendDirection = "UP"
|
|
TrendDirectionDown TrendDirection = "DOWN"
|
|
TrendDirectionStable TrendDirection = "STABLE"
|
|
)
|
|
|
|
// Input types
|
|
type SubscriberFilter struct {
|
|
Status *SubscriberStatus `json:"status"`
|
|
OrganizationID *string `json:"organizationId"`
|
|
PlanID *int `json:"planId"`
|
|
Search *string `json:"search"`
|
|
BalanceMin *float64 `json:"balanceMin"`
|
|
BalanceMax *float64 `json:"balanceMax"`
|
|
DataUsageMin *float64 `json:"dataUsageMin"`
|
|
DataUsageMax *float64 `json:"dataUsageMax"`
|
|
}
|
|
|
|
type UsageEventFilter struct {
|
|
UsageType *UsageType `json:"usageType"`
|
|
TimestampGte *time.Time `json:"timestampGte"`
|
|
TimestampLte *time.Time `json:"timestampLte"`
|
|
CostMin *float64 `json:"costMin"`
|
|
CostMax *float64 `json:"costMax"`
|
|
}
|
|
|
|
type CreateSubscriberInput struct {
|
|
MSISDN string `json:"msisdn"`
|
|
FirstName string `json:"firstName"`
|
|
LastName string `json:"lastName"`
|
|
Email string `json:"email"`
|
|
OrganizationID *string `json:"organizationId"`
|
|
PlanID int `json:"planId"`
|
|
EUICCID *string `json:"euiccId"`
|
|
}
|
|
|
|
type UpdateSubscriberInput struct {
|
|
FirstName *string `json:"firstName"`
|
|
LastName *string `json:"lastName"`
|
|
Email *string `json:"email"`
|
|
OrganizationID *string `json:"organizationId"`
|
|
PlanID *int `json:"planId"`
|
|
}
|
|
|
|
type TopUpInput struct {
|
|
Amount float64 `json:"amount"`
|
|
PaymentMethodID *string `json:"paymentMethodId"`
|
|
}
|
|
|
|
type UsageStatsInput struct {
|
|
IMSI string `json:"imsi"`
|
|
Period UsagePeriod `json:"period"`
|
|
}
|
|
|
|
type PaymentMethodInput struct {
|
|
Type PaymentMethodType `json:"type"`
|
|
Token string `json:"token"`
|
|
IsDefault *bool `json:"isDefault"`
|
|
}
|
|
|
|
type CreateAlertInput struct {
|
|
Type AlertType `json:"type"`
|
|
Severity AlertSeverity `json:"severity"`
|
|
Message string `json:"message"`
|
|
SubscriberID *int `json:"subscriberId"`
|
|
}
|
|
|
|
// Output types
|
|
type PageInfo struct {
|
|
HasNextPage bool `json:"hasNextPage"`
|
|
HasPreviousPage bool `json:"hasPreviousPage"`
|
|
StartCursor *string `json:"startCursor"`
|
|
EndCursor *string `json:"endCursor"`
|
|
}
|
|
|
|
type SubscriberEdge struct {
|
|
Node *models.Subscriber `json:"node"`
|
|
Cursor string `json:"cursor"`
|
|
}
|
|
|
|
type SubscriberConnection struct {
|
|
Edges []*SubscriberEdge `json:"edges"`
|
|
PageInfo *PageInfo `json:"pageInfo"`
|
|
TotalCount int `json:"totalCount"`
|
|
}
|
|
|
|
type UsageEventEdge struct {
|
|
Node *models.UsageEvent `json:"node"`
|
|
Cursor string `json:"cursor"`
|
|
}
|
|
|
|
type UsageEventConnection struct {
|
|
Edges []*UsageEventEdge `json:"edges"`
|
|
PageInfo *PageInfo `json:"pageInfo"`
|
|
TotalCount int `json:"totalCount"`
|
|
}
|
|
|
|
type InvoiceEdge struct {
|
|
Node *models.Invoice `json:"node"`
|
|
Cursor string `json:"cursor"`
|
|
}
|
|
|
|
type InvoiceConnection struct {
|
|
Edges []*InvoiceEdge `json:"edges"`
|
|
PageInfo *PageInfo `json:"pageInfo"`
|
|
TotalCount int `json:"totalCount"`
|
|
}
|
|
|
|
type AlertEdge struct {
|
|
Node *models.Alert `json:"node"`
|
|
Cursor string `json:"cursor"`
|
|
}
|
|
|
|
type AlertConnection struct {
|
|
Edges []*AlertEdge `json:"edges"`
|
|
PageInfo *PageInfo `json:"pageInfo"`
|
|
TotalCount int `json:"totalCount"`
|
|
}
|
|
|
|
type ChargingSessionEdge struct {
|
|
Node *ChargingSession `json:"node"`
|
|
Cursor string `json:"cursor"`
|
|
}
|
|
|
|
type ChargingSessionConnection struct {
|
|
Edges []*ChargingSessionEdge `json:"edges"`
|
|
PageInfo *PageInfo `json:"pageInfo"`
|
|
TotalCount int `json:"totalCount"`
|
|
}
|
|
|
|
type UsageTrend struct {
|
|
Direction TrendDirection `json:"direction"`
|
|
Percentage float64 `json:"percentage"`
|
|
PeriodOverPeriod float64 `json:"periodOverPeriod"`
|
|
}
|
|
|
|
type UsageStats struct {
|
|
DataUsage float64 `json:"dataUsage"`
|
|
VoiceUsage float64 `json:"voiceUsage"`
|
|
SmsUsage float64 `json:"smsUsage"`
|
|
Cost float64 `json:"cost"`
|
|
Period string `json:"period"`
|
|
Trend *UsageTrend `json:"trend"`
|
|
}
|
|
|
|
type CurrentSession struct {
|
|
SessionID string `json:"sessionId"`
|
|
StartTime time.Time `json:"startTime"`
|
|
DataUsed float64 `json:"dataUsed"`
|
|
VoiceUsed float64 `json:"voiceUsed"`
|
|
SmsUsed float64 `json:"smsUsed"`
|
|
Cost float64 `json:"cost"`
|
|
}
|
|
|
|
type TodayUsage struct {
|
|
DataUsed float64 `json:"dataUsed"`
|
|
VoiceUsed float64 `json:"voiceUsed"`
|
|
SmsUsed float64 `json:"smsUsed"`
|
|
Cost float64 `json:"cost"`
|
|
}
|
|
|
|
type RealTimeUsage struct {
|
|
CurrentSession *CurrentSession `json:"currentSession"`
|
|
TodayUsage *TodayUsage `json:"todayUsage"`
|
|
}
|
|
|
|
type ESIMProvisionResult struct {
|
|
ProfileID string `json:"profileId"`
|
|
ActivationCode string `json:"activationCode"`
|
|
QRCode string `json:"qrCode"`
|
|
}
|
|
|
|
type ChargingSession struct {
|
|
SessionID string `json:"sessionId"`
|
|
IMSI string `json:"imsi"`
|
|
StartTime time.Time `json:"startTime"`
|
|
EndTime *time.Time `json:"endTime"`
|
|
DataBytes float64 `json:"dataBytes"`
|
|
VoiceSeconds float64 `json:"voiceSeconds"`
|
|
SmsCount float64 `json:"smsCount"`
|
|
TotalCost float64 `json:"totalCost"`
|
|
Status SessionStatus `json:"status"`
|
|
}
|
|
|
|
// GraphQL configuration
|
|
type Config struct {
|
|
Resolvers ResolverRoot
|
|
}
|
|
|
|
type ResolverRoot interface {
|
|
Query() QueryResolver
|
|
Mutation() MutationResolver
|
|
Subscription() SubscriptionResolver
|
|
}
|
|
|
|
type QueryResolver interface {
|
|
Subscriber(ctx context.Context, id string) (*models.Subscriber, error)
|
|
SubscriberByImsi(ctx context.Context, imsi string) (*models.Subscriber, error)
|
|
Subscribers(ctx context.Context, first *int, after *string, filter *SubscriberFilter, sort *SubscriberSort) (*SubscriberConnection, error)
|
|
SubscriberAccount(ctx context.Context, imsi string) (*models.SubscriberAccount, error)
|
|
UsageEvents(ctx context.Context, first *int, after *string, imsi *string, filter *UsageEventFilter) (*UsageEventConnection, error)
|
|
UsageStats(ctx context.Context, input UsageStatsInput) (*UsageStats, error)
|
|
RealTimeUsage(ctx context.Context, imsi string) (*RealTimeUsage, error)
|
|
Invoices(ctx context.Context, first *int, after *string, imsi *string, status *models.InvoiceStatus) (*InvoiceConnection, error)
|
|
Invoice(ctx context.Context, id string) (*models.Invoice, error)
|
|
RatingPlans(ctx context.Context) ([]*models.RatingPlan, error)
|
|
RatingPlan(ctx context.Context, planId string) (*models.RatingPlan, error)
|
|
ChargingSessions(ctx context.Context, first *int, after *string, imsi *string, status *SessionStatus) (*ChargingSessionConnection, error)
|
|
ChargingSession(ctx context.Context, sessionId string) (*ChargingSession, error)
|
|
Alerts(ctx context.Context, first *int, after *string, subscriberId *int, severity *models.AlertSeverity, resolved *bool) (*AlertConnection, error)
|
|
SystemStats(ctx context.Context) (*models.SystemStats, error)
|
|
HealthStatus(ctx context.Context) (*models.HealthStatus, error)
|
|
SearchSubscribers(ctx context.Context, query string, limit int) ([]*models.Subscriber, error)
|
|
SearchUsageEvents(ctx context.Context, query string, limit int) ([]*models.UsageEvent, error)
|
|
}
|
|
|
|
type MutationResolver interface {
|
|
CreateSubscriber(ctx context.Context, input CreateSubscriberInput) (*models.Subscriber, error)
|
|
UpdateSubscriber(ctx context.Context, id string, input UpdateSubscriberInput) (*models.Subscriber, error)
|
|
DeleteSubscriber(ctx context.Context, id string) (bool, error)
|
|
TopUpBalance(ctx context.Context, imsi string, input TopUpInput) (*models.SubscriberAccount, error)
|
|
SuspendSubscriber(ctx context.Context, id string) (*models.Subscriber, error)
|
|
ActivateSubscriber(ctx context.Context, id string) (*models.Subscriber, error)
|
|
TerminateSubscriber(ctx context.Context, id string) (*models.Subscriber, error)
|
|
ProvisionESIM(ctx context.Context, imsi string) (*ESIMProvisionResult, error)
|
|
ActivateESIM(ctx context.Context, imsi string, profileId string) (bool, error)
|
|
DeactivateESIM(ctx context.Context, imsi string, profileId string) (bool, error)
|
|
AddPaymentMethod(ctx context.Context, subscriberId int, input PaymentMethodInput) (*models.PaymentMethod, error)
|
|
RemovePaymentMethod(ctx context.Context, paymentMethodId string) (bool, error)
|
|
SetDefaultPaymentMethod(ctx context.Context, paymentMethodId string) (*models.PaymentMethod, error)
|
|
ResolveAlert(ctx context.Context, alertId string) (*models.Alert, error)
|
|
CreateAlert(ctx context.Context, input CreateAlertInput) (*models.Alert, error)
|
|
TriggerSystemMaintenance(ctx context.Context) (bool, error)
|
|
}
|
|
|
|
type SubscriptionResolver interface {
|
|
SubscriberUpdates(ctx context.Context, subscriberId string) (<-chan *models.Subscriber, error)
|
|
UsageUpdates(ctx context.Context, imsi string) (<-chan *models.UsageEvent, error)
|
|
AlertUpdates(ctx context.Context, severity models.AlertSeverity) (<-chan *models.Alert, error)
|
|
SystemStatsUpdates(ctx context.Context) (<-chan *models.SystemStats, error)
|
|
}
|
|
|
|
func NewExecutableSchema(cfg Config) graphql.ExecutableSchema {
|
|
return &executableSchema{
|
|
resolvers: cfg.Resolvers,
|
|
}
|
|
}
|
|
|
|
type executableSchema struct {
|
|
resolvers ResolverRoot
|
|
}
|
|
|
|
func (e *executableSchema) Schema() *ast.Schema {
|
|
// This would be generated by gqlgen
|
|
return nil
|
|
}
|
|
|
|
func (e *executableSchema) Complexity(ctx context.Context, typeName, fieldName string, childComplexity int, args map[string]any) (int, bool) {
|
|
// Default complexity calculation
|
|
return childComplexity, true
|
|
}
|
|
|
|
func (e *executableSchema) Exec(ctx context.Context) graphql.ResponseHandler {
|
|
// This would be generated by gqlgen
|
|
return nil
|
|
}
|
|
|
|
func (e *executableSchema) Extensions() map[string]any {
|
|
return map[string]any{}
|
|
}
|