fix(purchase): streamline error handling and improve JSON marshaling for temporary orders

This commit is contained in:
Chang lue Tsen 2025-09-06 11:03:14 -04:00
parent d477ba4772
commit d5ed82955e
5 changed files with 33 additions and 25 deletions

View File

@ -337,7 +337,7 @@ func (l *PurchaseCheckoutLogic) balancePayment(u *user.User, o *order.Order) err
logger.Field("orderNo", o.OrderNo), logger.Field("orderNo", o.OrderNo),
logger.Field("userId", u.Id), logger.Field("userId", u.Id),
) )
err := l.svcCtx.OrderModel.UpdateOrderStatus(l.ctx, o.OrderNo, 2) err = l.svcCtx.OrderModel.UpdateOrderStatus(l.ctx, o.OrderNo, 2)
if err != nil { if err != nil {
l.Errorw("[PurchaseCheckout] Update order status error", l.Errorw("[PurchaseCheckout] Update order status error",
logger.Field("error", err.Error()), logger.Field("error", err.Error()),

View File

@ -6,18 +6,17 @@ import (
"fmt" "fmt"
"time" "time"
"github.com/perfect-panel/server/pkg/payment"
"github.com/perfect-panel/server/pkg/constant"
"github.com/hibiken/asynq"
"github.com/perfect-panel/server/internal/model/order" "github.com/perfect-panel/server/internal/model/order"
"github.com/perfect-panel/server/internal/svc" "github.com/perfect-panel/server/internal/svc"
"github.com/perfect-panel/server/internal/types" "github.com/perfect-panel/server/internal/types"
"github.com/perfect-panel/server/pkg/constant"
"github.com/perfect-panel/server/pkg/logger" "github.com/perfect-panel/server/pkg/logger"
"github.com/perfect-panel/server/pkg/payment"
"github.com/perfect-panel/server/pkg/tool" "github.com/perfect-panel/server/pkg/tool"
"github.com/perfect-panel/server/pkg/xerr" "github.com/perfect-panel/server/pkg/xerr"
queue "github.com/perfect-panel/server/queue/types" queue "github.com/perfect-panel/server/queue/types"
"github.com/hibiken/asynq"
"github.com/pkg/errors" "github.com/pkg/errors"
"gorm.io/gorm" "gorm.io/gorm"
) )
@ -137,13 +136,15 @@ func (l *PurchaseLogic) Purchase(req *types.PortalPurchaseRequest) (resp *types.
Password: req.Password, Password: req.Password,
InviteCode: req.InviteCode, InviteCode: req.InviteCode,
} }
if _, err = l.svcCtx.Redis.Set(l.ctx, fmt.Sprintf(constant.TempOrderCacheKey, orderInfo.OrderNo), tempOrder.Marshal(), CloseOrderTimeMinutes*time.Minute).Result(); err != nil { content, _ := tempOrder.Marshal()
if _, err = l.svcCtx.Redis.Set(l.ctx, fmt.Sprintf(constant.TempOrderCacheKey, orderInfo.OrderNo), string(content), CloseOrderTimeMinutes*time.Minute).Result(); err != nil {
l.Errorw("[Purchase] Redis set error", logger.Field("error", err.Error()), logger.Field("order_no", orderInfo.OrderNo)) l.Errorw("[Purchase] Redis set error", logger.Field("error", err.Error()), logger.Field("order_no", orderInfo.OrderNo))
return err return err
} }
l.Infow("[Purchase] Guest order", logger.Field("order_no", orderInfo.OrderNo), logger.Field("identifier", req.Identifier)) l.Infow("[Purchase] Guest order", logger.Field("order_no", orderInfo.OrderNo), logger.Field("identifier", req.Identifier))
// save guest order // save guest order
if err := l.svcCtx.OrderModel.Insert(l.ctx, orderInfo, tx); err != nil { if err = l.svcCtx.OrderModel.Insert(l.ctx, orderInfo, tx); err != nil {
return err return err
} }
return nil return nil

View File

@ -95,7 +95,7 @@ func (l *QueryPurchaseOrderLogic) handleTemporaryOrder(orderInfo *order.Order, r
} }
// Validate user and email // Validate user and email
if err := l.validateUserAndEmail(orderInfo, req.Identifier, req.Identifier); err != nil { if err = l.validateUserAndEmail(orderInfo, req.AuthType, req.Identifier); err != nil {
return "", err return "", err
} }

View File

@ -1,8 +1,6 @@
package constant package constant
import ( import "encoding/json"
"encoding/json"
)
// Used for type cloning conversion // Used for type cloning conversion
const ( const (
@ -46,7 +44,17 @@ type TemporaryOrderInfo struct {
InviteCode string `json:"invite_code,omitempty"` InviteCode string `json:"invite_code,omitempty"`
} }
func (t TemporaryOrderInfo) Marshal() string { func (t *TemporaryOrderInfo) Unmarshal(data []byte) error {
value, _ := json.Marshal(t) type Alias TemporaryOrderInfo
return string(value) aux := (*Alias)(t)
return json.Unmarshal(data, aux)
}
func (t *TemporaryOrderInfo) Marshal() ([]byte, error) {
type Alias TemporaryOrderInfo
return json.Marshal(&struct {
*Alias
}{
Alias: (*Alias)(t),
})
} }

View File

@ -46,11 +46,6 @@ const (
OrderStatusFinished = 5 // Order successfully completed OrderStatusFinished = 5 // Order successfully completed
) )
// Commission type constants define the types of commission transactions
const (
CommissionTypeRecharge = 1 // Commission from balance recharge
)
// Predefined error variables for common error conditions // Predefined error variables for common error conditions
var ( var (
ErrInvalidOrderStatus = fmt.Errorf("invalid order status") ErrInvalidOrderStatus = fmt.Errorf("invalid order status")
@ -83,7 +78,7 @@ func (l *ActivateOrderLogic) ProcessTask(ctx context.Context, task *asynq.Task)
return nil // Log and continue return nil // Log and continue
} }
if err := l.processOrderByType(ctx, orderInfo); err != nil { if err = l.processOrderByType(ctx, orderInfo); err != nil {
logger.WithContext(ctx).Error("[ActivateOrderLogic] Process task failed", logger.Field("error", err.Error())) logger.WithContext(ctx).Error("[ActivateOrderLogic] Process task failed", logger.Field("error", err.Error()))
return nil return nil
} }
@ -282,8 +277,12 @@ func (l *ActivateOrderLogic) getTempOrderInfo(ctx context.Context, orderNo strin
} }
var tempOrder constant.TemporaryOrderInfo var tempOrder constant.TemporaryOrderInfo
if err = json.Unmarshal([]byte(data), &tempOrder); err != nil { if err = tempOrder.Unmarshal([]byte(data)); err != nil {
logger.WithContext(ctx).Error("Unmarshal temp order failed", logger.Field("error", err.Error())) logger.WithContext(ctx).Error("Unmarshal temp order cache failed",
logger.Field("error", err.Error()),
logger.Field("cache_key", cacheKey),
logger.Field("data", data),
)
return nil, err return nil, err
} }
@ -469,7 +468,7 @@ func (l *ActivateOrderLogic) Renewal(ctx context.Context, orderInfo *order.Order
return err return err
} }
if err := l.updateSubscriptionForRenewal(ctx, userSub, sub, orderInfo); err != nil { if err = l.updateSubscriptionForRenewal(ctx, userSub, sub, orderInfo); err != nil {
return err return err
} }
@ -623,7 +622,7 @@ func (l *ActivateOrderLogic) Recharge(ctx context.Context, orderInfo *order.Orde
balanceLog := &log.Balance{ balanceLog := &log.Balance{
Amount: orderInfo.Price, Amount: orderInfo.Price,
Type: CommissionTypeRecharge, Type: log.BalanceTypeRecharge,
OrderNo: orderInfo.OrderNo, OrderNo: orderInfo.OrderNo,
Balance: userInfo.Balance, Balance: userInfo.Balance,
Timestamp: time.Now().UnixMilli(), Timestamp: time.Now().UnixMilli(),