Skip to content

Commit fb6adc9

Browse files
author
Tension
committed
feat(subscribe): add inventory check and update logic for subscription plans
1 parent 7a2000f commit fb6adc9

5 files changed

Lines changed: 59 additions & 0 deletions

File tree

internal/logic/public/order/closeOrderLogic.go

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,16 @@ func (l *CloseOrderLogic) CloseOrder(req *types.CloseOrderRequest) error {
5151
)
5252
return nil
5353
}
54+
55+
sub, err := l.svcCtx.SubscribeModel.FindOne(l.ctx, orderInfo.SubscribeId)
56+
if err != nil {
57+
l.Errorw("[CloseOrder] Find subscribe info failed",
58+
logger.Field("error", err.Error()),
59+
logger.Field("subscribeId", orderInfo.SubscribeId),
60+
)
61+
return nil
62+
}
63+
5464
err = l.svcCtx.DB.Transaction(func(tx *gorm.DB) error {
5565
// update order status
5666
err := tx.Model(&order.Order{}).Where("order_no = ?", req.OrderNo).Update("status", 3).Error
@@ -124,9 +134,21 @@ func (l *CloseOrderLogic) CloseOrder(req *types.CloseOrderRequest) error {
124134
// update user cache
125135
return l.svcCtx.UserModel.UpdateUserCache(l.ctx, userInfo)
126136
}
137+
if sub.Inventory != -1 {
138+
sub.Inventory++
139+
if e := l.svcCtx.SubscribeModel.Update(l.ctx, sub, tx); e != nil {
140+
l.Errorw("[CloseOrder] Restore subscribe inventory failed",
141+
logger.Field("error", e.Error()),
142+
logger.Field("subscribeId", sub.Id),
143+
)
144+
return e
145+
}
146+
}
147+
127148
return nil
128149
})
129150
if err != nil {
151+
logger.Errorf("[CloseOrder] Transaction failed: %v", err.Error())
130152
return err
131153
}
132154
return nil

internal/logic/public/order/purchaseLogic.go

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,12 @@ func (l *PurchaseLogic) Purchase(req *types.PurchaseOrderRequest) (resp *types.P
8181
if !*sub.Sell {
8282
return nil, errors.Wrapf(xerr.NewErrCode(xerr.ERROR), "subscribe not sell")
8383
}
84+
85+
// check subscribe plan inventory
86+
if sub.Inventory == 0 {
87+
return nil, errors.Wrapf(xerr.NewErrCode(xerr.SubscribeOutOfStock), "subscribe out of stock")
88+
}
89+
8490
// check subscribe plan limit
8591
if sub.Quota > 0 {
8692
var count int64
@@ -221,10 +227,23 @@ func (l *PurchaseLogic) Purchase(req *types.PurchaseOrderRequest) (resp *types.P
221227
return e
222228
}
223229
}
230+
231+
if sub.Inventory != -1 {
232+
// decrease subscribe plan stock
233+
sub.Inventory -= 1
234+
// update subscribe plan stock
235+
if err = l.svcCtx.SubscribeModel.Update(l.ctx, sub, db); err != nil {
236+
l.Errorw("[Purchase] Database update error", logger.Field("error", err.Error()), logger.Field("subscribe", sub))
237+
return err
238+
}
239+
}
240+
224241
// insert order
225242
return db.WithContext(l.ctx).Model(&order.Order{}).Create(&orderInfo).Error
226243
})
227244
if err != nil {
245+
l.Errorw("[Purchase] Database insert error", logger.Field("error", err.Error()), logger.Field("orderInfo", orderInfo))
246+
228247
return nil, errors.Wrapf(xerr.NewErrCode(xerr.DatabaseInsertError), "insert order error: %v", err.Error())
229248
}
230249
// Deferred task

internal/logic/public/portal/purchaseLogic.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,12 @@ func (l *PurchaseLogic) Purchase(req *types.PortalPurchaseRequest) (resp *types.
5555
l.Errorw("[Purchase] Database query error", logger.Field("error", err.Error()), logger.Field("subscribe_id", req.SubscribeId))
5656
return nil, errors.Wrapf(xerr.NewErrCode(xerr.DatabaseQueryError), "find subscribe error: %v", err.Error())
5757
}
58+
59+
// check subscribe plan stock
60+
if sub.Inventory == 0 {
61+
return nil, errors.Wrapf(xerr.NewErrCode(xerr.SubscribeOutOfStock), "subscribe out of stock")
62+
}
63+
5864
// check subscribe plan status
5965
if !*sub.Sell {
6066
return nil, errors.Wrapf(xerr.NewErrCode(xerr.ERROR), "subscribe not sell")
@@ -149,6 +155,16 @@ func (l *PurchaseLogic) Purchase(req *types.PortalPurchaseRequest) (resp *types.
149155
return err
150156
}
151157
l.Infow("[Purchase] Guest order", logger.Field("order_no", orderInfo.OrderNo), logger.Field("identifier", req.Identifier))
158+
159+
// Decrease subscribe plan stock
160+
if sub.Inventory != -1 {
161+
sub.Inventory--
162+
if e := l.svcCtx.SubscribeModel.Update(l.ctx, sub, tx); e != nil {
163+
l.Errorw("[Purchase] Database update error", logger.Field("error", e.Error()), logger.Field("subscribe_id", sub.Id))
164+
return e
165+
}
166+
}
167+
152168
// save guest order
153169
if err = l.svcCtx.OrderModel.Insert(l.ctx, orderInfo, tx); err != nil {
154170
return err

pkg/xerr/errCode.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ const (
7070
SubscribeIsUsedError uint32 = 60004
7171
SingleSubscribeModeExceedsLimit uint32 = 60005
7272
SubscribeQuotaLimit uint32 = 60006
73+
SubscribeOutOfStock uint32 = 60007
7374
)
7475

7576
// Auth error

pkg/xerr/errMsg.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ func init() {
5555
SubscribeIsUsedError: "Subscribe is used",
5656
SingleSubscribeModeExceedsLimit: "Single subscribe mode exceeds limit",
5757
SubscribeQuotaLimit: "Subscribe quota limit",
58+
SubscribeOutOfStock: "Subscribe out of stock",
5859

5960
// auth error
6061
VerifyCodeError: "Verify code error",

0 commit comments

Comments
 (0)