Files
2026-06-30 16:16:55 +08:00

111 lines
2.9 KiB
Go

package versionSer
import (
"context"
"encoding/json"
"stat/common/log"
"stat/common/utils"
"stat/models/downloadCpc"
"stat/models/versionMod"
"stat/service/cacheSer"
"stat/statg"
"strings"
"time"
)
// IosMobileconfigCfg iOS mobileconfig 生成所需的应用级配置
type IosMobileconfigCfg struct {
AppId int32
IosDownSuff string // 下载文件名(如 madou.mobileconfig)
H5Origin string
H5Target string
H5Config string
}
// ParseChannel 解析 channel(json 字符串)为 pc/dc/ch;非法 JSON 时返回空字符串,dc 走 RepairDC
func ParseChannel(channel string) (pc, dc, ch string) {
if channel == "" {
return
}
var p ChannelParams
_ = json.Unmarshal([]byte(channel), &p)
dc = utils.RepairDC(p.DC)
pc = p.PC
ch = p.CH
return
}
// RecordCpcDownload 记录 cpc 下载到 landingpage_cpc 表(走异步 writer);相同 IP 1 小时内只记一次
func RecordCpcDownload(ctx context.Context, isIos bool, appId int32, channel, ip, userAgent string) {
if ip == "" {
return
}
pc, dc, ch := ParseChannel(channel)
sysType := "android"
if isIos {
sysType = "ios"
}
devType := ""
if strings.Contains(userAgent, "iPhone") {
devType = "iphone"
} else if strings.Contains(userAgent, "iPad") {
devType = "ipad"
} else if strings.Contains(userAgent, "Android") {
devType = "android"
}
info := &downloadCpc.DownloadCpc{
AppId: appId,
PC: pc,
DC: dc,
CH: ch,
IP: ip,
DevType: devType,
SysType: sysType,
PeerIP: ip,
CreatedAt: time.Now(),
}
if landPageVisit.TryLock(ip, time.Now().Add(landPageVisitIpTimeout)) {
cacheSer.Writers.LandPageVisitWriter.Add(info)
}
}
// LatestAndroidDownloadUrl 取应用最新 Android 版本的下载链接(第一个 Link),没有返回空字符串
func LatestAndroidDownloadUrl(appId int32) string {
ctx := context.Background()
data, err := versionMod.ButtonClick(ctx, appId, "android", 0)
if err != nil || data == nil {
log.Warn("LatestAndroidDownloadUrl ButtonClick failed", log.E(err), log.Any("appId", appId))
return ""
}
if len(data.Link) == 0 {
return ""
}
return data.Link[0]
}
// IosMobileconfigByAppId 取应用的 iOS mobileconfig 配置;endpoint 未配置 H5 三件套则返回 nil
func IosMobileconfigByAppId(appId int32) *IosMobileconfigCfg {
endpoint := statg.GlobalAppIdEndpoints[appId]
if endpoint == nil {
return nil
}
if endpoint.H5Origin == "" || endpoint.H5Target == "" || endpoint.H5Config == "" {
return nil
}
return &IosMobileconfigCfg{
AppId: appId,
IosDownSuff: endpoint.H5Config,
H5Origin: endpoint.H5Origin,
H5Target: endpoint.H5Target,
H5Config: endpoint.H5Config,
}
}
// BuildMobileconfig 用 dc/pc 生成 mobileconfig 字节流和文件名
func BuildMobileconfig(cfg *IosMobileconfigCfg, dc, pc string) ([]byte, string) {
if cfg == nil {
return nil, ""
}
return GenerateConfigFile(cfg.H5Origin, cfg.H5Target, cfg.H5Config, dc, pc)
}