124 Commits

Author SHA1 Message Date
2cc1124dd8 fix: 任何人注销账号都解散整个家庭组,删除所有成员的登录方式和订阅
All checks were successful
Build docker and publish / build (20.15.1) (push) Successful in 7m41s
统一 member/owner 注销逻辑:无论谁注销,都解散家庭、
删除所有成员的 AuthMethods + Subscribe、踢出所有设备、清除所有缓存。

Co-Authored-By: claude-flow <ruv@ruv.net>
2026-03-12 06:23:11 -07:00
b6405c8f28 fix: IAP attach 后立即清除订阅缓存,修复 App 查到旧数据;返回值改用累计到期时间
All checks were successful
Build docker and publish / build (20.15.1) (push) Successful in 7m33s
Co-Authored-By: claude-flow <ruv@ruv.net>
2026-03-12 04:56:17 -07:00
add27aa4d9 fix: Apple IAP attach 支持家庭成员购买场景
All checks were successful
Build docker and publish / build (20.15.1) (push) Successful in 7m15s
member 发起购买后订阅归属于 owner,但 attach 交易时校验
orderSub.UserId != u.Id 报"订单订阅与当前用户不匹配"。
现在通过 ResolveEntitlementUser 获取 EffectiveUserID,
允许 member 绑定属于其家庭 owner 的订阅。

Co-Authored-By: claude-flow <ruv@ruv.net>
2026-03-12 03:38:42 -07:00
2f33e1e680 fix: 踢其他设备时不再清除踢人者自己的 session
All checks were successful
Build docker and publish / build (20.15.1) (push) Successful in 7m29s
logoutUnbind 循环清理家庭成员时,踢人者(kicker)也在成员列表中,
导致 kicker 的设备被踢、session 被清,自己也下线了。
现在跳过 kickerUserID,只清缓存不踢设备不清 session。

Co-Authored-By: claude-flow <ruv@ruv.net>
2026-03-12 03:05:34 -07:00
e4ec85c176 fix: clearAllSessions 改用 SCAN 查找 session,修复会话清理无效
All checks were successful
Build docker and publish / build (20.15.1) (push) Successful in 7m37s
根因:登录时只写了 auth:session_id:{sessionId} (Redis SET),
从未写入 auth:user_sessions:{userId} sorted set,
导致 clearAllSessions 用 ZRange 永远返回空,session 根本没被清除。

修复:改用 SCAN auth:session_id:* 遍历所有 session key,
按 value 匹配 userId 找出该用户的全部 session 后删除,
同时清理关联的 device cache key。

Co-Authored-By: claude-flow <ruv@ruv.net>
2026-03-12 02:47:32 -07:00
dddb8c7fe2 fix: 平级踢人后更新被踢设备 online 状态为 false
Some checks failed
Build docker and publish / build (20.15.1) (push) Has been cancelled
unbindDeviceLogic.logoutUnbind 中 KickDevice 后缺少
device.Online = false + UpdateDevice,导致后台仍显示在线

Co-Authored-By: claude-flow <ruv@ruv.net>
2026-03-12 02:37:12 -07:00
384c8df506 fix: 踢出用户时清除所有 session,确保旧 token 立即失效
All checks were successful
Build docker and publish / build (20.15.1) (push) Successful in 7m43s
- kickOfflineByUserDeviceLogic: 管理员踢设备后新增 clearAllSessions,
  之前只清单个 WebSocket session,用户可用旧 token 继续访问
- unbindDeviceLogic: 家庭成员被踢时增加踢设备+清 session;
  补全 session detail key 清理

Co-Authored-By: claude-flow <ruv@ruv.net>
2026-03-12 02:19:35 -07:00
7d5b4fcb84 邮箱修复
All checks were successful
Build docker and publish / build (20.15.1) (push) Successful in 7m13s
2026-03-12 01:24:21 -07:00
a3cc23bbd4 feat: 绑定新邮箱时创建独立邮箱用户并转移订阅,而非挂在设备用户上
All checks were successful
Build docker and publish / build (20.15.1) (push) Successful in 8m5s
- bindEmailWithVerificationLogic: 新邮箱路径改为创建独立 email user + joinFamily
- familyBindingHelper: clearMemberSubscribes → transferMemberSubscribesToOwner,订阅转移给 owner 而非删除
- accountMergeHelper: 同步更新调用点

Co-Authored-By: claude-flow <ruv@ruv.net>
2026-03-12 00:52:50 -07:00
3f56fc6def feat: Owner 退出登录时转移订阅/邮箱/家庭权限给 member,而非解散家庭
All checks were successful
Build docker and publish / build (20.15.1) (push) Successful in 7m45s
Co-Authored-By: claude-flow <ruv@ruv.net>
2026-03-11 09:00:35 -07:00
bb80df5786 权限问题
Some checks failed
Build docker and publish / build (20.15.1) (push) Has been cancelled
2026-03-11 08:06:13 -07:00
fafb229295 feat: 为折扣计算函数 getDiscount 引入新用户判断逻辑以支持新用户专属折扣。
All checks were successful
Build docker and publish / build (20.15.1) (push) Successful in 7m37s
2026-03-11 03:56:48 -07:00
48383fa0a9 更新支付方式相关业务逻辑。
All checks were successful
Build docker and publish / build (20.15.1) (push) Successful in 7m31s
2026-03-10 21:42:02 -07:00
26f6400e74 feat: 苹果支付uuid 及设备逻辑
All checks were successful
Build docker and publish / build (20.15.1) (push) Successful in 8m3s
2026-03-10 19:53:19 -07:00
662ef6edb3 15分钟修改成5分钟
All checks were successful
Build docker and publish / build (20.15.1) (push) Successful in 7m38s
2026-03-09 22:29:30 -07:00
a542a6df46 fix: 修复 退出登录 auth问题
All checks were successful
Build docker and publish / build (20.15.1) (push) Successful in 7m45s
2026-03-09 09:04:47 -07:00
57fa2b4d69 fix: IAP 重复交易检测优化,防止续期误拦和孤儿订单
All checks were successful
Build docker and publish / build (20.15.1) (push) Successful in 7m33s
1. 关闭孤儿订单:检测到重复交易时,立即关闭新的 pending 订单(status=3)
2. tradeNo 候选改为只用 transactionId,不再用 originalTransactionId
   - originalTransactionId 是整个订阅族共享的,续期时会误命中旧订单
   - originalTransactionId 仍用于 IAP 事务表幂等检查(FindByOriginalId)
2026-03-09 02:32:42 -07:00
b303f16525 fix: 退出登录不删除用户订阅,保留订阅数据
All checks were successful
Build docker and publish / build (20.15.1) (push) Successful in 7m52s
2026-03-09 01:48:54 -07:00
9c197442a6 fix: 退出登录时删除用户订阅并清理订阅缓存
All checks were successful
Build docker and publish / build (20.15.1) (push) Successful in 7m45s
- 事务内删除用户所有订阅记录
- 事务后清理订阅缓存、套餐缓存、节点缓存
2026-03-09 01:31:04 -07:00
d6437f043f fix: 退出登录时解绑邮箱和家庭组,清除所有session
All checks were successful
Build docker and publish / build (20.15.1) (push) Successful in 7m54s
- logoutUnbind 新增删除非 device 类型的 auth_methods(解绑邮箱)
- 清除用户所有 session 而非仅当前 session
- 事务前收集家庭成员 ID,事务后清理成员缓存
- 清理邮箱相关 Redis 缓存
2026-03-09 01:12:38 -07:00
130fb702ab fix: IAP 支付流程优化与关键 bug 修复
All checks were successful
Build docker and publish / build (20.15.1) (push) Successful in 7m42s
- getStatusLogic 类型断言修复(*user.User)
- restoreLogic 事务拆分为单条处理 + appAccountToken 解析
- attachTransactionLogic 提取 ParseProductIdDuration 共享函数
- 新增 config_helper.go 统一 Apple API 配置加载
- reconcileLogic 补充 BundleID 配置读取
- activateOrderLogic 邀请赠送天数逻辑完善

Co-Authored-By: claude-flow <ruv@ruv.net>
2026-03-09 00:27:16 -07:00
79a97ec569 限制套餐具体到 档位
All checks were successful
Build docker and publish / build (20.15.1) (push) Successful in 7m45s
2026-03-08 21:25:07 -07:00
94f5d0c07d map对齐
All checks were successful
Build docker and publish / build (20.15.1) (push) Successful in 7m29s
2026-03-07 07:42:09 -08:00
1e14e2dbd9 map对齐
All checks were successful
Build docker and publish / build (20.15.1) (push) Successful in 7m7s
2026-03-07 07:16:01 -08:00
a0ae7b1c8d map对齐
All checks were successful
Build docker and publish / build (20.15.1) (push) Successful in 8m21s
2026-03-07 05:54:49 -08:00
71f4bd1f5f 双倍
All checks were successful
Build docker and publish / build (20.15.1) (push) Successful in 7m33s
2026-03-07 04:10:58 -08:00
03573d2e65 双倍时间bug
All checks were successful
Build docker and publish / build (20.15.1) (push) Successful in 8m33s
2026-03-07 02:05:48 -08:00
4d913c1728 修复缓存
All checks were successful
Build docker and publish / build (20.15.1) (push) Successful in 7m26s
2026-03-06 21:58:29 -08:00
19932bb9f7 x
All checks were successful
Build docker and publish / build (20.15.1) (push) Successful in 7m56s
2026-03-06 05:47:47 -08:00
b625dda4c9 修复:goctl api 生成的代码没有在路由中加入Ipa模式
All checks were successful
Build docker and publish / build (20.15.1) (push) Successful in 7m48s
2026-03-06 00:15:35 -08:00
6e13e67dc8 修改签名头
All checks were successful
Build docker and publish / build (20.15.1) (push) Successful in 7m44s
2026-03-05 23:31:45 -08:00
7308aa9191 无订阅 支付后出现两个订阅
Some checks failed
Build docker and publish / build (20.15.1) (push) Failing after 7m37s
2026-03-05 21:53:36 -08:00
a1ab0fefa4 无订阅 支付后出现两个订阅
All checks were successful
Build docker and publish / build (20.15.1) (push) Successful in 8m15s
2026-03-05 07:59:49 -08:00
ce6351368d 家庭组逻辑导致支付失败
All checks were successful
Build docker and publish / build (20.15.1) (push) Successful in 8m11s
2026-03-05 03:20:38 -08:00
9f4d71770b 家庭组逻辑导致支付失败
Some checks failed
Build docker and publish / build (20.15.1) (push) Failing after 9m9s
2026-03-05 02:13:28 -08:00
69ac1f104d 修复订单支付显示方式
Some checks failed
Build docker and publish / build (20.15.1) (push) Has been cancelled
2026-03-04 23:20:36 -08:00
70c0483ca9 修复订阅
Some checks failed
Build docker and publish / build (20.15.1) (push) Failing after 8m2s
2026-03-04 23:08:46 -08:00
4349a7ea2f 家庭组 权益修改
All checks were successful
Build docker and publish / build (20.15.1) (push) Successful in 8m16s
2026-03-04 22:02:42 -08:00
3594097d47 各种配置项修复,优化到后台管理端配置
All checks were successful
Build docker and publish / build (20.15.1) (push) Successful in 7m59s
2026-03-04 20:03:03 -08:00
2215df8c0b 各种配置项修复,优化到后台管理端配置 2026-03-04 19:42:21 -08:00
4752f844ef 各种配置项修复,优化到后台管理端配置
Some checks failed
Build docker and publish / build (20.15.1) (push) Has been cancelled
2026-03-04 17:58:40 -08:00
6c8f22adc8 fix gitea workflow path and runner label
Some checks failed
Build docker and publish / build (20.15.1) (push) Failing after 7m49s
2026-03-04 04:28:54 -08:00
b08202fd08 fix gitea workflow path and runner label
Some checks failed
Build docker and publish / build (20.15.1) (push) Failing after 7m52s
2026-03-04 03:30:17 -08:00
6c370485d1 fix gitea workflow path and runner label
Some checks failed
Build docker and publish / build (20.15.1) (push) Failing after 8m1s
2026-03-04 03:07:41 -08:00
0c544268e5 refactor payment platform canonicalization and order method consistency
Some checks failed
Build docker and publish / build (20.15.1) (push) Failing after 8m1s
2026-03-04 02:15:32 -08:00
8bdc8afea3 fix gitea workflow path and runner label
Some checks failed
Build docker and publish / build (20.15.1) (push) Failing after 7m54s
2026-03-03 19:10:59 -08:00
b0eb6595ac add: 新增ci diamanté 2026-03-03 17:29:45 -08:00
4d8516b2e1 同步历史版本代码 2026-03-03 09:32:22 -08:00
EUForest
31e75efacb Merge upstream/master into master 2026-02-13 23:06:43 +08:00
EUForest
34372fe0b3 fix(redemption): enhance redemption code flow with transaction safety and idempotency
This commit addresses critical issues in the redemption code activation flow
to ensure data consistency, prevent duplicate redemptions, and improve user
experience.

Key improvements:

1. Transaction Safety (P0)
   - Wrap subscription creation, used count update, and record insertion in
     a single database transaction
   - Ensure atomicity: all operations succeed or all rollback
   - Prevent orphaned records and data inconsistencies

2. Idempotency Protection (P0)
   - Add redemption record check before processing to prevent duplicate
     operations on queue task retries
   - Maintain idempotency at multiple layers: interface, order, and record

3. Distributed Lock (P1)
   - Implement Redis-based distributed lock (10s timeout) to prevent
     concurrent duplicate redemptions
   - Lock key format: redemption_lock:{user_id}:{code}

4. IsNew Field Correction (P2)
   - Fix IsNew field to correctly determine first-time purchases using
     IsUserEligibleForNewOrder method
   - Ensure accurate statistics and future commission calculations

5. Quota Pre-check (P2)
   - Add quota validation at interface layer for immediate user feedback
   - Prevent "processing" status followed by eventual failure

6. Extended Cache TTL (P2)
   - Increase Redis cache expiration from 30 minutes to 2 hours
   - Ensure queue tasks can retrieve redemption data even with delays

7. Error Handling (P2)
   - Clean up Order records when Redis cache or queue enqueue fails
   - Prevent orphaned Order records in the database

8. Cache Clearing Optimization
   - Add user subscription cache clearing after activation
   - Ensure both node-side and user-side display latest subscription info

Technical details:
- Modified: internal/logic/public/redemption/redeemCodeLogic.go
- Modified: queue/logic/order/activateOrderLogic.go
- Modified: internal/model/redemption/default.go (transaction support)

Testing:
- All changes compiled successfully
- Comprehensive flow verification completed
- Ready for production deployment

BREAKING CHANGE: None
2026-02-09 01:07:39 +08:00