- getStatusLogic 类型断言修复(*user.User) - restoreLogic 事务拆分为单条处理 + appAccountToken 解析 - attachTransactionLogic 提取 ParseProductIdDuration 共享函数 - 新增 config_helper.go 统一 Apple API 配置加载 - reconcileLogic 补充 BundleID 配置读取 - activateOrderLogic 邀请赠送天数逻辑完善 Co-Authored-By: claude-flow <ruv@ruv.net>
This commit is contained in:
@@ -2,6 +2,8 @@ package apple
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"strconv"
|
||||
"strings"
|
||||
"time"
|
||||
)
|
||||
|
||||
@@ -37,3 +39,44 @@ func CalcExpire(start time.Time, days int64) time.Time {
|
||||
}
|
||||
return start.Add(time.Duration(days) * 24 * time.Hour)
|
||||
}
|
||||
|
||||
// ParsedProduct holds the result of parsing an Apple product ID.
|
||||
type ParsedProduct struct {
|
||||
Unit string // "Day", "Month", "Year"
|
||||
Quantity int64
|
||||
}
|
||||
|
||||
// ParseProductIdDuration extracts time unit and quantity from Apple product IDs.
|
||||
// e.g. "com.app.vip.day30" -> {Unit: "Day", Quantity: 30}
|
||||
func ParseProductIdDuration(productId string) *ParsedProduct {
|
||||
pid := strings.ToLower(productId)
|
||||
parts := strings.Split(pid, ".")
|
||||
for i := len(parts) - 1; i >= 0; i-- {
|
||||
p := parts[i]
|
||||
var unit string
|
||||
switch {
|
||||
case strings.HasPrefix(p, "day"):
|
||||
unit = "Day"
|
||||
p = p[len("day"):]
|
||||
case strings.HasPrefix(p, "month"):
|
||||
unit = "Month"
|
||||
p = p[len("month"):]
|
||||
case strings.HasPrefix(p, "year"):
|
||||
unit = "Year"
|
||||
p = p[len("year"):]
|
||||
default:
|
||||
continue
|
||||
}
|
||||
digits := p
|
||||
for j := 0; j < len(digits); j++ {
|
||||
if digits[j] < '0' || digits[j] > '9' {
|
||||
digits = digits[:j]
|
||||
break
|
||||
}
|
||||
}
|
||||
if q, e := strconv.ParseInt(digits, 10, 64); e == nil && q > 0 {
|
||||
return &ParsedProduct{Unit: unit, Quantity: q}
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user