Skip to content

Commit

Permalink
Fix update
Browse files Browse the repository at this point in the history
  • Loading branch information
jakys committed Sep 4, 2023
1 parent f8c210d commit b625050
Showing 1 changed file with 53 additions and 174 deletions.
227 changes: 53 additions & 174 deletions pkg/order/update.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,21 +13,19 @@ import (
basetypes "github.com/NpoolPlatform/message/npool/basetypes/v1"

appgoodmwcli "github.com/NpoolPlatform/good-middleware/pkg/client/app/good"
appgoodstockmwcli "github.com/NpoolPlatform/good-middleware/pkg/client/app/good/stock"
goodmwcli "github.com/NpoolPlatform/good-middleware/pkg/client/good"
appgoodmwpb "github.com/NpoolPlatform/message/npool/good/mw/v1/app/good"
appgoodstockmwpb "github.com/NpoolPlatform/message/npool/good/mw/v1/app/good/stock"

npool "github.com/NpoolPlatform/message/npool/order/gw/v1/order"
ordermwpb "github.com/NpoolPlatform/message/npool/order/mw/v1/order"
ordermwcli "github.com/NpoolPlatform/order-middleware/pkg/client/order"

miningdetailcli "github.com/NpoolPlatform/ledger-middleware/pkg/client/good/ledger/statement"

ledgerstatementcli "github.com/NpoolPlatform/ledger-middleware/pkg/client/ledger/statement"
miningdetailpb "github.com/NpoolPlatform/message/npool/ledger/mw/v2/good/ledger/statement"
ledgerstatementpb "github.com/NpoolPlatform/message/npool/ledger/mw/v2/ledger/statement"

achievementmwcli "github.com/NpoolPlatform/inspire-middleware/pkg/client/achievement"
statementmwcli "github.com/NpoolPlatform/inspire-middleware/pkg/client/achievement/statement"
statementmwpb "github.com/NpoolPlatform/message/npool/inspire/mw/v1/achievement/statement"

Expand Down Expand Up @@ -66,7 +64,7 @@ func (h *updateHandler) validate(ctx context.Context) error {
return fmt.Errorf("invalid good")
}

_, total, err := miningdetailcli.GetGoodStatements(ctx, &miningdetailpb.Conds{
statements, _, err := miningdetailcli.GetGoodStatements(ctx, &miningdetailpb.Conds{
GoodID: &basetypes.StringVal{
Op: cruder.EQ,
Value: h.ord.GoodID,
Expand All @@ -75,9 +73,6 @@ func (h *updateHandler) validate(ctx context.Context) error {
if err != nil {
return err
}
if total > 0 {
return fmt.Errorf("app good have mining detail data uncancellable")
}

if good.RewardState != goodtypes.BenefitState_BenefitWait {
return fmt.Errorf("app good uncancellable benefit state not wait")
Expand All @@ -88,60 +83,41 @@ func (h *updateHandler) validate(ctx context.Context) error {
return fmt.Errorf("app good uncancellable")
case goodtypes.CancelMode_CancellableBeforeStart:
switch h.ord.OrderState {
case ordertypes.OrderState_OrderStateWaitPayment:
case ordertypes.OrderState_OrderStatePaid:
case ordertypes.OrderState_OrderStateInService:
return fmt.Errorf("order state is uncancellable")
default:
return fmt.Errorf("order state is uncancellable")
}

if uint32(time.Now().Unix()) >= h.ord.StartAt-appgood.CancellableBeforeStart {
return fmt.Errorf("cancellable time exceeded")
}
case goodtypes.CancelMode_CancellableBeforeBenefit:
switch h.ord.OrderState {
case ordertypes.OrderState_OrderStateWaitPayment:
case ordertypes.OrderState_OrderStatePaid:
case ordertypes.OrderState_OrderStateInService:
if len(statements) > 0 {
lastBenefitDate := statements[0].BenefitDate
const secondsPerDay = 24 * 60 * 60
checkBenefitStartAt := lastBenefitDate + secondsPerDay - appgood.CancellableBeforeStart
checkBenefitEndAt := lastBenefitDate + secondsPerDay + appgood.CancellableBeforeStart
now := uint32(time.Now().Unix())
if checkBenefitStartAt <= now && now <= checkBenefitEndAt {
return fmt.Errorf("invalid cancel in during time")
}
}
default:
return fmt.Errorf("order state is uncancellable")
}

if uint32(time.Now().Unix()) >= h.ord.StartAt-appgood.CancellableBeforeStart &&
uint32(time.Now().Unix()) <= h.ord.StartAt+appgood.CancellableBeforeStart {
return fmt.Errorf("app good uncancellable order start at > cancellable before start")
}
default:
return fmt.Errorf("unknown CancelMode type %v", appgood.CancelMode)
}
return nil
}

func (h *updateHandler) processStock(ctx context.Context) error {
stockReq := &appgoodstockmwpb.StockReq{
ID: &h.ord.GoodID,
}

switch h.ord.OrderState {
case ordertypes.OrderState_OrderStatePaid:
stockReq.WaitStart = &h.Units
case ordertypes.OrderState_OrderStateInService:
stockReq.InService = &h.Units
}

_, err := appgoodstockmwcli.SubStock(ctx, stockReq)
if err != nil {
return err
}
return nil
}

func (h *updateHandler) processOrderState(ctx context.Context) error {
state := ordertypes.OrderState_OrderStateCanceled
paymentState := ordertypes.PaymentState_PaymentStateCanceled
func (h *updateHandler) processCancel(ctx context.Context) error {
_, err := ordermwcli.UpdateOrder(ctx, &ordermwpb.OrderReq{
ID: &h.ord.ID,
OrderState: &state,
PaymentState: &paymentState,
AppID: h.AppID,
UserID: h.UserID,
UserSetCanceled: h.UserSetCanceled,
AdminSetCanceled: h.AdminSetCanceled,
})
Expand All @@ -152,15 +128,13 @@ func (h *updateHandler) processOrderState(ctx context.Context) error {
return nil
}

//nolint:funlen
func (h *updateHandler) processLedger(ctx context.Context) error {
offset := int32(0)
limit := int32(1000) //nolint
detailInfos := []*ledgerstatementpb.StatementReq{}
in := ledgertypes.IOType_Incoming
out := ledgertypes.IOType_Outcoming
ioTypeCR := ledgertypes.IOSubType_CommissionRevoke
ioTypeOrder := ledgertypes.IOSubType_OrderRevoke

for {
infos, _, err := statementmwcli.GetStatements(ctx, &statementmwpb.Conds{
Expand Down Expand Up @@ -234,40 +208,8 @@ func (h *updateHandler) processLedger(ctx context.Context) error {
}
}

paymentAmount, err := decimal.NewFromString(h.ord.PaymentAmount)
if err != nil {
return err
}

payWithBalanceAmount, err := decimal.NewFromString(h.ord.BalanceAmount)
if err != nil {
return err
}

if paymentAmount.Add(payWithBalanceAmount).Cmp(decimal.NewFromInt(0)) != 0 {
amount := paymentAmount.Add(payWithBalanceAmount).String()
inIoExtra := fmt.Sprintf(
`{"AppID":"%v","UserID":"%v","OrderID":"%v","Amount":"%v","Date":"%v"}`,
h.ord.AppID,
h.ord.UserID,
h.ord.ID,
amount,
time.Now(),
)

detailInfos = append(detailInfos, &ledgerstatementpb.StatementReq{
AppID: &h.ord.AppID,
UserID: &h.ord.UserID,
CoinTypeID: &h.ord.PaymentCoinTypeID,
IOType: &in,
IOSubType: &ioTypeOrder,
Amount: &amount,
IOExtra: &inIoExtra,
})
}

if len(detailInfos) > 0 {
_, err = ledgerstatementcli.CreateStatements(ctx, detailInfos)
_, err := ledgerstatementcli.CreateStatements(ctx, detailInfos)
if err != nil {
return err
}
Expand All @@ -276,78 +218,11 @@ func (h *updateHandler) processLedger(ctx context.Context) error {
return nil
}

func (h *updateHandler) processArchivement(ctx context.Context) error {
err := achievementmwcli.ExpropriateAchievement(ctx, h.ord.ID)
if err != nil {
return err
}
return nil
}

func (h *updateHandler) cancelAirdropOrder(ctx context.Context) error {
err := h.validate(ctx)
if err != nil {
return err
}
err = h.processStock(ctx)
if err != nil {
return err
}
// TODO Distributed transactions should be used
return h.processOrderState(ctx)
}

func (h *updateHandler) cancelOfflineOrder(ctx context.Context) error {
err := h.validate(ctx)
if err != nil {
return err
}
// TODO Distributed transactions should be used

err = h.processStock(ctx)
if err != nil {
return err
}
err = h.processOrderState(ctx)
if err != nil {
return err
}

return h.processArchivement(ctx)
}

func (h *updateHandler) cancelNormalOrder(ctx context.Context) error {
err := h.validate(ctx)
if err != nil {
return err
}

err = h.processStock(ctx)
if err != nil {
return err
}

err = h.processOrderState(ctx)
if err != nil {
return err
}

err = h.processLedger(ctx)
if err != nil {
return err
}

return h.processArchivement(ctx)
}

//nolint:gocyclo
//nolint:funlen,gocyclo
func (h *Handler) UpdateOrder(ctx context.Context) (*npool.Order, error) {
if h.UserSetCanceled == nil && h.AdminSetCanceled == nil {
return nil, fmt.Errorf("nothing todo")
}
if h.ID == nil || *h.ID == "" {
return nil, fmt.Errorf("id invalid")
}

ord, err := ordermwcli.GetOrder(ctx, *h.ID)
if err != nil {
Expand All @@ -360,6 +235,12 @@ func (h *Handler) UpdateOrder(ctx context.Context) (*npool.Order, error) {
if *h.AppID != ord.AppID || *h.UserID != ord.UserID {
return nil, fmt.Errorf("permission denied")
}
if h.FromAdmin && h.UserSetCanceled != nil {
return nil, fmt.Errorf("permission denied")
}
if !h.FromAdmin && h.AdminSetCanceled != nil {
return nil, fmt.Errorf("permission denied")
}
if h.UserSetCanceled != nil && !*h.UserSetCanceled {
return h.GetOrder(ctx)
}
Expand All @@ -372,45 +253,43 @@ func (h *Handler) UpdateOrder(ctx context.Context) (*npool.Order, error) {
ord: ord,
}

switch ord.OrderState {
case ordertypes.OrderState_OrderStateWaitPayment:
if h.FromAdmin && ord.OrderType == ordertypes.OrderType_Normal {
return nil, fmt.Errorf("permission denied")
}
_, err = ordermwcli.UpdateOrder(ctx, &ordermwpb.OrderReq{
ID: h.ID,
AppID: h.AppID,
UserID: h.UserID,
UserSetCanceled: h.UserSetCanceled,
AdminSetCanceled: h.AdminSetCanceled,
})
if err != nil {
return nil, err
}
return handler.GetOrder(ctx)
case ordertypes.OrderState_OrderStatePaid:
case ordertypes.OrderState_OrderStateInService:
default:
return nil, fmt.Errorf("order state uncancellable")
}

switch ord.OrderType {
case ordertypes.OrderType_Normal:
if err := handler.cancelNormalOrder(ctx); err != nil {
return nil, err
switch ord.OrderState {
case ordertypes.OrderState_OrderStateWaitPayment:
fallthrough //nolint
case ordertypes.OrderState_OrderStateCheckPayment:
fallthrough //nolint
case ordertypes.OrderState_OrderStatePaymentTimeout:
if h.FromAdmin {
return nil, fmt.Errorf("permission denied")
}
if err := handler.processCancel(ctx); err != nil {
return nil, err
}
case ordertypes.OrderState_OrderStatePaid:
fallthrough //nolint
case ordertypes.OrderState_OrderStateInService:
if err := handler.validate(ctx); err != nil {
return nil, err
}
if err := handler.processLedger(ctx); err != nil {
return nil, err
}
if err := handler.processCancel(ctx); err != nil {
return nil, err
}
}
case ordertypes.OrderType_Offline:
fallthrough //nolint
case ordertypes.OrderType_Airdrop:
if !h.FromAdmin {
return nil, fmt.Errorf("permission denied")
}
if err := handler.cancelOfflineOrder(ctx); err != nil {
if err := handler.validate(ctx); err != nil {
return nil, err
}
case ordertypes.OrderType_Airdrop:
if !h.FromAdmin {
return nil, fmt.Errorf("permission denied")
}
if err := handler.cancelAirdropOrder(ctx); err != nil {
if err := handler.processCancel(ctx); err != nil {
return nil, err
}
default:
Expand Down

0 comments on commit b625050

Please sign in to comment.