- Add subscribe traffic_limit schema and migration\n- Support traffic_limit in admin create/update and list/details\n- Apply traffic_limit when building server user list speed limits\n- Add public user traffic stats API
- Node group CRUD operations with traffic-based filtering
- Three grouping modes: average distribution, subscription-based, and traffic-based
- Automatic and manual group recalculation with history tracking
- Group assignment preview before applying changes
- User subscription group locking to prevent automatic reassignment
- Subscribe-to-group mapping configuration
- Group calculation history and detailed reports
- System configuration for group management (enabled/mode/auto_create)
Database:
- Add node_group table for group definitions
- Add group_history and group_history_detail tables for tracking
- Add node_group_ids (JSON) to nodes and subscribe tables
- Add node_group_id and group_locked fields to user_subscribe table
- Add migration files for schema changes
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
- Fix task error handling: return actual errors instead of nil to enable retry
- Add idempotency check: skip processing for already finished orders
- Extend temp order cache: increase from 15 minutes to 24 hours
- Configure retry policy: add MaxRetry(5) for all payment callbacks (Epay, Alipay, Stripe)
This fixes the critical issue where paid orders were being lost due to:
1. Failed tasks being marked as successful and deleted from queue
2. Temporary order info expiring before queue processing
3. No retry mechanism for transient failures
Changes:
- queue/logic/order/activateOrderLogic.go: Fix error returns and add idempotency
- internal/logic/public/portal/purchaseLogic.go: Extend cache to 24 hours
- internal/logic/notify/*NotifyLogic.go: Add retry configuration
- Add quota check in preCreateOrderLogic for order preview
- Move quota check inside transaction in purchaseLogic to prevent race condition
- Add quota check in activateOrderLogic as final safeguard when creating subscription
- Add quota check in redeemCodeLogic when redeeming codes for new subscriptions
* fix(database): correct name entry for SingBox in initialization script
* fix(purchase): update gift amount deduction logic and handle zero-amount order status
* feat: add type and default fields to rule group requests and update related logic
* feat(rule): implement logic to set a default rule group during creation and update
* fix(rule): add type and default fields to rule group model and update related logic
* feat(proxy): enhance proxy group handling and sorting logic
* refactor(proxy): replace hardcoded group names with constants for better maintainability
* fix(proxy): update group selection logic to skip empty and default names
* feat(proxy): enhance proxy and group handling with new configuration options
* feat(surge): add Surge adapter support and enhance subscription URL handling
* feat(traffic): implement traffic reset logic for subscription cycles
* feat(auth): improve email and mobile config unmarshalling with default values
* fix(auth) upbind email not update
* fix(order) discount set default 1
* fix(order) discount set default 1
* fix: refactor surfboard proxy handling and enhance configuration template
* fix(renewal) discount set default 1
* feat(loon): add Loon configuration template and enhance proxy handling
* feat(subscription): update user subscription status based on expiration time
* fix(renewal): update subscription retrieval method to use token instead of order ID
* feat(order): enhance order processing logic with improved error handling and user subscription management
* fix(order): improve code quality and fix critical bugs in order processing logic
- Fix inconsistent logging calls across all order logic files
- Fix critical gift amount deduction logic bug in renewal process
- Fix variable shadowing errors in database transactions
- Add comprehensive Go-standard documentation comments
- Improve log prefix consistency for better debugging
- Remove redundant discount validation code
* fix(docker): add build argument for version in Docker image build process
* feat(version): add endpoint to retrieve application version information
* fix(auth): improve user authentication method logic and update user cache
* feat(user): add ordering functionality to user list retrieval
* fix(RevenueStatistics) fill list
* fix(UserStatistics) fill list
* fix(user): implement user cache clearing after auth method operations
* fix(auth): enhance OAuth login logic with improved request handling and user registration flow
* fix(user): implement sorting for authentication methods based on priority
* fix(user): correct ordering clause for user retrieval based on filter
* refactor(user): streamline cache management and enhance cache clearing logic
* feat(logs) set logs volume in develop
* fix(handler): implement browser interception to deny access for specific user agents
* fix(resetTraffic) reset daily server
* refactor(trojan): remove unused parameter and clean up logging in slice
* fix(middleware): add domain length check and improve user-agent handling
* fix(middleware): reorder domain processing and enhance user-agent handling
* fix(resetTraffic): update subscription reset logic to use expire_time for monthly and yearly checks
* fix(scheduler): update reset traffic task schedule to run daily at 00:30
* fix(traffic): enhance traffic reset logic for subscriptions and adjust status checks
* fix(activateOrder): update traffic reset logic to include reset day check
* feat(marketing): add batch email task management API and logic
* feat(application): implement CRUD operations for subscribe applications
* feat(types): add user agent limit and list to subscription configuration
* feat(application): update subscription application requests to include structured download links
* feat(application): add scheme field and download link handling to subscribe application
* feat(application): add endpoint to retrieve client information
* feat(application): move DownloadLink and SubscribeApplication types to types.api
* feat(application): add DownloadLink and SubscribeClient types, update client response structure
* feat(application): remove ProxyTemplate field from application API
* feat(application): implement adapter for client configuration and add preview template functionality
* feat(application): move DownloadLink type to types.api and remove from common.api
* feat(application): update PreviewSubscribeTemplate to return structured response
* feat(application): remove ProxyTemplate field from application API
* feat(application): enhance cache key generation for user list and server data
* feat(subscribe): add ClearCache method to manage subscription cache invalidation
* feat(payment): add Description field to PaymentMethodDetail response
* feat(subscribe): update next reset time calculation to use ExpireTime
* feat(purchase): include handling fee in total amount calculation
* feat(subscribe): add V2SubscribeHandler and logic for enhanced subscription management
* feat(subscribe): add output format configuration to subscription adapter
* feat(application): default data
---------
Co-authored-by: Chang lue Tsen <tension@ppanel.dev>
Co-authored-by: NoWay <Bob455668@hotmail.com>