This commit is contained in:
@@ -270,6 +270,23 @@ func (l *PurchaseLogic) Purchase(req *types.PurchaseOrderRequest) (resp *types.P
|
||||
}
|
||||
}
|
||||
|
||||
// check new user only restriction inside transaction to prevent race condition
|
||||
if orderInfo.Type == 1 && sub.NewUserOnly != nil && *sub.NewUserOnly {
|
||||
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")
|
||||
}
|
||||
}
|
||||
|
||||
// update user gift amount and create deduction record
|
||||
if orderInfo.GiftAmount > 0 {
|
||||
// deduct gift amount from user
|
||||
@@ -319,7 +336,11 @@ func (l *PurchaseLogic) Purchase(req *types.PurchaseOrderRequest) (resp *types.P
|
||||
})
|
||||
if err != nil {
|
||||
l.Errorw("[Purchase] Database insert error", logger.Field("error", err.Error()), logger.Field("orderInfo", orderInfo))
|
||||
|
||||
// Propagate business errors (e.g. SubscribeNewUserOnly, SubscribeQuotaLimit) directly.
|
||||
var codeErr *xerr.CodeError
|
||||
if errors.As(err, &codeErr) {
|
||||
return nil, err
|
||||
}
|
||||
return nil, errors.Wrapf(xerr.NewErrCode(xerr.DatabaseInsertError), "insert order error: %v", err.Error())
|
||||
}
|
||||
// Deferred task
|
||||
|
||||
Reference in New Issue
Block a user