x
Build docker and publish / build (20.15.1) (push) Successful in 7m28s

This commit is contained in:
2026-03-30 04:49:55 -07:00
parent df7303738a
commit 2a9c01ff8b
3 changed files with 53 additions and 21 deletions
@@ -106,6 +106,8 @@ func (l *PreCreateOrderLogic) PreCreateOrder(req *types.PurchaseOrderRequest) (r
}
// check new user only restriction (tier-level only)
// Only block users who registered more than 24h ago; users within 24h who already purchased
// are allowed to preview (they just won't receive the new-user discount).
var newUserOnly bool
if !isSingleModeRenewal && sub.Discount != "" {
var dis []types.SubscribeDiscount
@@ -116,20 +118,30 @@ func (l *PreCreateOrderLogic) PreCreateOrder(req *types.PurchaseOrderRequest) (r
if time.Since(u.CreatedAt) > 24*time.Hour {
return nil, errors.Wrapf(xerr.NewErrCode(xerr.SubscribeNewUserOnly), "not a new user")
}
var historyCount int64
if e := l.svcCtx.DB.Model(&order.Order{}).
Where("user_id = ? AND subscribe_id = ? AND type = 1 AND status IN ?",
u.Id, targetSubscribeID, []int64{2, 5}).
Count(&historyCount).Error; e != nil {
return nil, errors.Wrapf(xerr.NewErrCode(xerr.DatabaseQueryError), "check new user purchase history error: %v", e.Error())
}
if historyCount >= 1 {
return nil, errors.Wrapf(xerr.NewErrCode(xerr.SubscribeNewUserOnly), "already purchased new user plan")
}
}
var discount float64 = 1
isNewUserForDiscount := time.Since(u.CreatedAt) <= 24*time.Hour
if isNewUserForDiscount && sub.Discount != "" {
// If the matched tier is new_user_only, check whether the user has already purchased this plan.
// If so, they are not eligible for the new-user discount (but the order is still allowed).
var dis []types.SubscribeDiscount
_ = json.Unmarshal([]byte(sub.Discount), &dis)
if isNewUserOnlyForQuantity(dis, req.Quantity) {
var historyCount int64
if e := l.svcCtx.DB.Model(&order.Order{}).
Where("user_id = ? AND subscribe_id = ? AND type = 1 AND status IN ?",
u.Id, targetSubscribeID, []int64{2, 5}).
Count(&historyCount).Error; e != nil {
l.Errorw("[PreCreateOrder] Database query error checking new user discount eligibility",
logger.Field("error", e.Error()), logger.Field("user_id", u.Id))
return nil, errors.Wrapf(xerr.NewErrCode(xerr.DatabaseQueryError), "check new user discount history error: %v", e.Error())
}
if historyCount >= 1 {
isNewUserForDiscount = false
}
}
}
if sub.Discount != "" {
var dis []types.SubscribeDiscount
_ = json.Unmarshal([]byte(sub.Discount), &dis)
+22 -10
View File
@@ -155,6 +155,26 @@ func (l *PurchaseLogic) Purchase(req *types.PurchaseOrderRequest) (resp *types.P
var discount float64 = 1
isNewUserForDiscount := time.Since(u.CreatedAt) <= 24*time.Hour
if isNewUserForDiscount && sub.Discount != "" {
// If the matched tier is new_user_only, check whether the user has already purchased this plan.
// If so, they are not eligible for the new-user discount (but the order is still allowed).
var dis []types.SubscribeDiscount
_ = json.Unmarshal([]byte(sub.Discount), &dis)
if isNewUserOnlyForQuantity(dis, req.Quantity) {
var historyCount int64
if e := l.svcCtx.DB.Model(&order.Order{}).
Where("user_id = ? AND subscribe_id = ? AND type = 1 AND status IN ?",
u.Id, targetSubscribeID, []int{2, 5}).
Count(&historyCount).Error; e != nil {
l.Errorw("[Purchase] Database query error checking new user discount eligibility",
logger.Field("error", e.Error()), logger.Field("user_id", u.Id))
return nil, errors.Wrapf(xerr.NewErrCode(xerr.DatabaseQueryError), "check new user discount history error: %v", e.Error())
}
if historyCount >= 1 {
isNewUserForDiscount = false
}
}
}
if sub.Discount != "" {
var dis []types.SubscribeDiscount
_ = json.Unmarshal([]byte(sub.Discount), &dis)
@@ -301,6 +321,8 @@ func (l *PurchaseLogic) Purchase(req *types.PurchaseOrderRequest) (resp *types.P
}
// check new user only restriction inside transaction to prevent race condition (tier-level only)
// Only block users who registered more than 24h ago; users within 24h who already purchased
// are allowed to place another order (they just won't receive the new-user discount).
if orderInfo.Type == 1 {
var txNewUserOnly bool
if sub.Discount != "" {
@@ -312,16 +334,6 @@ func (l *PurchaseLogic) Purchase(req *types.PurchaseOrderRequest) (resp *types.P
if time.Since(u.CreatedAt) > 24*time.Hour {
return errors.Wrapf(xerr.NewErrCode(xerr.SubscribeNewUserOnly), "not a new user")
}
var historyCount int64
if e := db.Model(&order.Order{}).
Where("user_id = ? AND subscribe_id = ? AND type = 1 AND status IN ?",
u.Id, targetSubscribeID, []int{2, 5}).
Count(&historyCount).Error; e != nil {
return errors.Wrapf(xerr.NewErrCode(xerr.DatabaseQueryError), "check new user purchase history error: %v", e.Error())
}
if historyCount >= 1 {
return errors.Wrapf(xerr.NewErrCode(xerr.SubscribeNewUserOnly), "already purchased new user plan")
}
}
}