package upstreamimpl import ( "context" "fmt" "strconv" "strings" "time" "git.5iot.com/iotlcm-public/iotlcm-upstream-chan/internal/service/daihe" sharedtoken "git.5iot.com/iotlcm-public/iotlcm-upstream-chan/internal/token" ) type DaiheTokenConfig struct { BaseURL string Path string AppID string AppSecret string CMCCAppID string Timeout time.Duration } type DaiheTokenProvider struct{ config DaiheTokenConfig } type daiheTokenFetcher struct{ provider *DaiheTokenProvider } func NewDaiheTokenProvider(config DaiheTokenConfig) *DaiheTokenProvider { if strings.TrimSpace(config.Path) == "" { config.Path = "/sim/query/cmccToken" } if strings.TrimSpace(config.BaseURL) == "" { config.BaseURL = "https://open.flymodem.com.cn" } return &DaiheTokenProvider{config: config} } func (p *DaiheTokenProvider) Fetch(ctx context.Context) (sharedtoken.OneLinkToken, error) { if p == nil || p.config.AppID == "" || p.config.AppSecret == "" || p.config.CMCCAppID == "" { return sharedtoken.OneLinkToken{}, fmt.Errorf("daihe token credentials and cmccAppId are required") } client := daihe.NewClient(daihe.Config{BaseURL: p.config.BaseURL, AppID: p.config.AppID, AppSecret: p.config.AppSecret, Timeout: p.config.Timeout}) var response daihe.CMCCToken if err := client.QueryCMCCToken(ctx, p.config.CMCCAppID, &response); err != nil { return sharedtoken.OneLinkToken{}, err } token := strings.TrimSpace(response.Token) deviceToken := strings.TrimSpace(response.TokenDevice) if token == "" { return sharedtoken.OneLinkToken{}, fmt.Errorf("daihe cmcc token response is empty") } ttl, err := strconv.ParseInt(strings.TrimSpace(response.DeviceTTL), 10, 64) if err != nil || ttl <= 0 { return sharedtoken.OneLinkToken{}, fmt.Errorf("daihe device_ttl must be positive: %q", response.DeviceTTL) } now := time.Now() return sharedtoken.OneLinkToken{Value: token, DeviceValue: deviceToken, CreatedAt: now, ExpiresAt: now.Add(time.Duration(ttl) * time.Second)}, nil } func (f daiheTokenFetcher) FetchToken(ctx context.Context, _ string) (sharedtoken.OneLinkToken, error) { return f.provider.Fetch(ctx) }