diff --git a/apis/types.api b/apis/types.api index a4bd3cd..d80da2a 100644 --- a/apis/types.api +++ b/apis/types.api @@ -758,7 +758,7 @@ type ( Type uint16 `json:"type"` UserId int64 `json:"user_id"` Amount int64 `json:"amount"` - OrderId int64 `json:"order_id,omitempty"` + OrderNo string `json:"order_no,omitempty"` Balance int64 `json:"balance"` Timestamp int64 `json:"timestamp"` } diff --git a/internal/logic/admin/log/filterBalanceLogLogic.go b/internal/logic/admin/log/filterBalanceLogLogic.go index aac09fa..6393d66 100644 --- a/internal/logic/admin/log/filterBalanceLogLogic.go +++ b/internal/logic/admin/log/filterBalanceLogLogic.go @@ -51,7 +51,7 @@ func (l *FilterBalanceLogLogic) FilterBalanceLog(req *types.FilterBalanceLogRequ UserId: datum.ObjectID, Amount: content.Amount, Type: content.Type, - OrderId: content.OrderId, + OrderNo: content.OrderNo, Balance: content.Balance, Timestamp: content.Timestamp, }) diff --git a/internal/logic/public/portal/purchaseCheckoutLogic.go b/internal/logic/public/portal/purchaseCheckoutLogic.go index 4e9b3f6..c56d407 100644 --- a/internal/logic/public/portal/purchaseCheckoutLogic.go +++ b/internal/logic/public/portal/purchaseCheckoutLogic.go @@ -413,7 +413,7 @@ func (l *PurchaseCheckoutLogic) balancePayment(u *user.User, o *order.Order) err balanceLog := &log.Balance{ Amount: balanceUsed, Type: log.BalanceTypePayment, // Type 3 represents payment deduction - OrderId: o.Id, + OrderNo: o.OrderNo, Balance: userInfo.Balance, Timestamp: time.Now().UnixMilli(), } diff --git a/internal/logic/public/user/queryUserBalanceLogLogic.go b/internal/logic/public/user/queryUserBalanceLogLogic.go index c9175cc..acee852 100644 --- a/internal/logic/public/user/queryUserBalanceLogLogic.go +++ b/internal/logic/public/user/queryUserBalanceLogLogic.go @@ -62,7 +62,7 @@ func (l *QueryUserBalanceLogLogic) QueryUserBalanceLog() (resp *types.QueryUserB UserId: datum.ObjectID, Amount: content.Amount, Type: content.Type, - OrderId: content.OrderId, + OrderNo: content.OrderNo, Balance: content.Balance, Timestamp: content.Timestamp, }) diff --git a/internal/logic/public/user/unsubscribeLogic.go b/internal/logic/public/user/unsubscribeLogic.go index 0cc983c..d3390fe 100644 --- a/internal/logic/public/user/unsubscribeLogic.go +++ b/internal/logic/public/user/unsubscribeLogic.go @@ -6,6 +6,7 @@ import ( "github.com/perfect-panel/server/internal/model/log" "github.com/perfect-panel/server/pkg/constant" + "github.com/perfect-panel/server/pkg/tool" "github.com/perfect-panel/server/pkg/xerr" "github.com/pkg/errors" @@ -48,6 +49,14 @@ func (l *UnsubscribeLogic) Unsubscribe(req *types.UnsubscribeRequest) error { return errors.Wrapf(xerr.NewErrCode(xerr.DatabaseQueryError), "FindOneSubscribe failed: %v", err.Error()) } + activate := []uint8{0, 1, 2} + + if !tool.Contains(activate, userSub.Status) { + // Only active (2) or paused (5) subscriptions can be cancelled + l.Errorw("Subscription status invalid for cancellation", logger.Field("userSubscribeId", userSub.Id), logger.Field("status", userSub.Status)) + return errors.Wrapf(xerr.NewErrCode(xerr.ERROR), "Subscription status invalid for cancellation") + } + // Calculate the remaining amount to refund based on unused subscription time/traffic remainingAmount, err := CalculateRemainingAmount(l.ctx, l.svcCtx, req.Id) if err != nil { @@ -57,12 +66,8 @@ func (l *UnsubscribeLogic) Unsubscribe(req *types.UnsubscribeRequest) error { // Process unsubscription in a database transaction to ensure data consistency err = l.svcCtx.UserModel.Transaction(l.ctx, func(db *gorm.DB) error { // Find and update subscription status to cancelled (status = 4) - var userSub user.Subscribe - if err = db.Model(&user.Subscribe{}).Where("id = ?", req.Id).First(&userSub).Error; err != nil { - return err - } userSub.Status = 4 // Set status to cancelled - if err = l.svcCtx.UserModel.UpdateSubscribe(l.ctx, &userSub); err != nil { + if err = l.svcCtx.UserModel.UpdateSubscribe(l.ctx, userSub); err != nil { return err } @@ -94,7 +99,7 @@ func (l *UnsubscribeLogic) Unsubscribe(req *types.UnsubscribeRequest) error { balanceRefundAmount := balance - u.Balance if balanceRefundAmount > 0 { balanceLog := log.Balance{ - OrderId: userSub.OrderId, + OrderNo: orderInfo.OrderNo, Amount: balanceRefundAmount, Type: log.BalanceTypeRefund, // Type 4 represents refund transaction Balance: balance, diff --git a/internal/model/log/log.go b/internal/model/log/log.go index c5da9ab..f53d5d1 100644 --- a/internal/model/log/log.go +++ b/internal/model/log/log.go @@ -225,7 +225,7 @@ func (r *ResetSubscribe) Unmarshal(data []byte) error { type Balance struct { Type uint16 `json:"type"` Amount int64 `json:"amount"` - OrderId int64 `json:"order_id,omitempty"` + OrderNo string `json:"order_no,omitempty"` Balance int64 `json:"balance"` Timestamp int64 `json:"timestamp"` } diff --git a/internal/model/user/subscribe.go b/internal/model/user/subscribe.go index cdf17af..1113f30 100644 --- a/internal/model/user/subscribe.go +++ b/internal/model/user/subscribe.go @@ -60,7 +60,13 @@ func (m *defaultUserModel) FindOneSubscribe(ctx context.Context, id int64) (*Sub func (m *defaultUserModel) FindUsersSubscribeBySubscribeId(ctx context.Context, subscribeId int64) ([]*Subscribe, error) { var data []*Subscribe err := m.QueryNoCacheCtx(ctx, &data, func(conn *gorm.DB, v interface{}) error { - return conn.Model(&Subscribe{}).Where("subscribe_id = ? AND `status` IN ?", subscribeId, []int64{1, 0}).Find(&data).Error + err := conn.Model(&Subscribe{}).Where("subscribe_id = ? AND `status` IN ?", subscribeId, []int64{1, 0}).Find(v).Error + + if err != nil { + return err + } + // update user subscribe status + return conn.Model(&Subscribe{}).Where("subscribe_id = ? AND `status` = ?", subscribeId, 0).Update("status", 1).Error }) return data, err } diff --git a/internal/types/types.go b/internal/types/types.go index 242024b..33c611a 100644 --- a/internal/types/types.go +++ b/internal/types/types.go @@ -132,7 +132,7 @@ type BalanceLog struct { Type uint16 `json:"type"` UserId int64 `json:"user_id"` Amount int64 `json:"amount"` - OrderId int64 `json:"order_id,omitempty"` + OrderNo string `json:"order_no,omitempty"` Balance int64 `json:"balance"` Timestamp int64 `json:"timestamp"` } diff --git a/queue/logic/order/activateOrderLogic.go b/queue/logic/order/activateOrderLogic.go index a0064e3..cb977e5 100644 --- a/queue/logic/order/activateOrderLogic.go +++ b/queue/logic/order/activateOrderLogic.go @@ -624,7 +624,7 @@ func (l *ActivateOrderLogic) Recharge(ctx context.Context, orderInfo *order.Orde balanceLog := &log.Balance{ Amount: orderInfo.Price, Type: CommissionTypeRecharge, - OrderId: orderInfo.Id, + OrderNo: orderInfo.OrderNo, Balance: userInfo.Balance, Timestamp: time.Now().UnixMilli(), }