merge - #3123
Conversation
- 兑换码新增订阅套餐类型,支持通过兑换码激活订阅 - 添加 push 触发的 Docker 镜像构建 workflow (GHCR) - 添加部署脚本、nginx 配置和部署文档 - 更新 docker-compose 配置 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 套餐支持配置 allowed_groups,限制用户仅能使用指定分组 - 创建/更新套餐时校验分组存在,API 请求时校验分组在允许列表 - 明确分组与 auto 选组后均校验;仅在有生效订阅且套餐配置限制时生效 - 套餐缓存 TTL 默认 30 分钟,创建/更新/状态变更后失效;事务内不写缓存 - 管理端与购买弹窗展示限制分组,多语言错误提示与 i18n Made-with: Cursor
|
Caution Review failedThe pull request is closed. ℹ️ Recent review info⚙️ Run configurationConfiguration used: Organization UI Review profile: CHILL Plan: Pro Run ID: 📒 Files selected for processing (40)
WalkthroughThis PR introduces two interconnected features: multi-type redemption code support (balance, subscription, combo) and per-subscription group restrictions. It includes database schema changes, backend validation and caching logic, middleware enforcement of group restrictions, frontend UI updates for managing redemptions and subscription plans, and deployment/Docker infrastructure changes with multi-instance support. Changes
Sequence Diagram(s)sequenceDiagram
participant User
participant Frontend
participant Controller
participant Model
participant Database
User->>Frontend: Enter redemption code
Frontend->>Controller: POST /topup (redemption key)
Controller->>Model: Redeem(key, userId)
Model->>Database: Fetch redemption by key
Database-->>Model: Redemption record (type, subscription_plan_id, upgrade_group)
alt Type = 1 (Quota)
Model->>Database: Update user quota
Model-->>Controller: RedeemResult{Quota, Type=1}
else Type = 2 (Subscription)
Model->>Database: Fetch subscription plan
Model->>Database: Create subscription record
Model->>Database: Apply resolved user group
Model-->>Controller: RedeemResult{Type=2, PlanTitle}
else Type = 3 (Combo)
Model->>Database: Update user quota
Model->>Database: Create subscription record
Model->>Database: Apply resolved user group
Model-->>Controller: RedeemResult{Quota, Type=3, PlanTitle}
end
Controller-->>Frontend: RedeemResult response
alt Type = 2
Frontend->>User: Show subscription activation modal
else Other
Frontend->>User: Show quota update success modal
Frontend->>User: Increment displayed quota
end
sequenceDiagram
participant User
participant Middleware
participant Model
participant Database
participant API
User->>Middleware: API request with group
Middleware->>Model: GetUserActiveSubscriptionPlan(userId)
Model->>Database: Fetch active subscription for user
Database-->>Model: SubscriptionPlan{allowed_groups}
alt allowed_groups is not empty
Middleware->>Model: IsGroupAllowed(group)
alt Group is in allowed_groups
Model-->>Middleware: true
Middleware->>API: Pass request through
API-->>User: Success response
else Group is NOT allowed
Model-->>Middleware: false
Middleware-->>User: 403 Forbidden (group restriction error)
end
else allowed_groups is empty (no restriction)
Middleware->>API: Pass request through
API-->>User: Success response
end
Estimated code review effort🎯 4 (Complex) | ⏱️ ~60 minutes Possibly related PRs
Suggested labels
Suggested reviewers
Poem
✨ Finishing Touches🧪 Generate unit tests (beta)
Tip Try Coding Plans. Let us write the prompt for your AI agent so you can ship faster (with fewer bugs). Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
Summary by CodeRabbit
New Features
Improvements