Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feat/order refactor #24

Merged
merged 70 commits into from
Sep 14, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
70 commits
Select commit Hold shift + click to select a range
f62764a
Refactor order
jakys Aug 16, 2023
6793bc4
Fix update commit id
jakys Aug 23, 2023
6a93115
Add update state migrator
jakys Aug 23, 2023
50d0d1b
Refactor order
jakys Aug 29, 2023
8cc54e9
Fix update cancel
jakys Sep 1, 2023
4b645d0
Fix create
jakys Sep 1, 2023
f8c210d
Fix create
jakys Sep 4, 2023
b625050
Fix update
jakys Sep 4, 2023
af0e698
Create order
kikakkz Sep 4, 2023
cf66566
Update order
kikakkz Sep 4, 2023
56a45df
Fix create and update
jakys Sep 4, 2023
232238b
Fix update
jakys Sep 4, 2023
0c1834c
Fix query
jakys Sep 4, 2023
c372f9c
Add create order
kikakkz Sep 4, 2023
4fefdd9
Refactor create
jakys Sep 5, 2023
d6a6692
Refactor update
jakys Sep 5, 2023
4381218
Fix query
jakys Sep 5, 2023
f6e14ea
Fix create
jakys Sep 5, 2023
3c892ad
Format code
kikakkz Sep 5, 2023
fa2c5da
Fix creates
jakys Sep 5, 2023
9355dd4
Fix balance amount
jakys Sep 6, 2023
a0cdce2
Fix create
jakys Sep 6, 2023
8b2eb54
Fix create
jakys Sep 6, 2023
8776689
Fix update
jakys Sep 6, 2023
687a195
Fix query
jakys Sep 6, 2023
0a99cff
Fix map
jakys Sep 6, 2023
ba192d0
Fix map
jakys Sep 7, 2023
4866c7d
Fix paymenttype
jakys Sep 7, 2023
c2cccbc
Fix verify
jakys Sep 8, 2023
785f9b5
Add migrator
jakys Sep 8, 2023
f7de435
Fix migrator
jakys Sep 8, 2023
0958f4a
Add test desc
jakys Sep 8, 2023
af40685
Fix create
jakys Sep 8, 2023
2f2229a
Add appgoodid
jakys Sep 8, 2023
791181b
Format code
kikakkz Sep 8, 2023
5da5b01
Fix panic
jakys Sep 8, 2023
f902bf0
update create order
kikakkz Sep 8, 2023
226f387
Add lock id
jakys Sep 8, 2023
d6f9328
Fix create
jakys Sep 8, 2023
8ca84ab
Update commit id
jakys Sep 8, 2023
e6aa27d
Add transferamount
jakys Sep 8, 2023
ef869f2
Add coupon limit check
jakys Sep 9, 2023
22ad633
Add goodrequired check
jakys Sep 9, 2023
ed5e53b
Fix goodrequest check
jakys Sep 9, 2023
d45adf4
fix update
Sep 9, 2023
e37b76f
Merge branch 'feat/order-refactor' of https://github.com/NpoolPlatfor…
Sep 9, 2023
f8771c0
fix update
Sep 9, 2023
906ade8
Do not allow cancel again
kikakkz Sep 9, 2023
493df64
Merge branch 'feat/order-refactor' of https://github.com/NpoolPlatfor…
kikakkz Sep 9, 2023
1b11a25
Update good middleware
kikakkz Sep 10, 2023
5e8ce7b
Avoid create order of deleted good
kikakkz Sep 10, 2023
4c5f324
Add user set canceled
kikakkz Sep 10, 2023
39ee18b
Correct invalid good
kikakkz Sep 10, 2023
37348af
add orderstate
kikakkz Sep 11, 2023
91678b0
update create order
kikakkz Sep 11, 2023
1069fbc
Update good commit
kikakkz Sep 11, 2023
139b813
Migration amount
kikakkz Sep 11, 2023
3d31087
Pass lint
kikakkz Sep 11, 2023
9853287
Pass lint
kikakkz Sep 11, 2023
2edbcf5
Pass lint
kikakkz Sep 11, 2023
fc4c36e
Correct required good check for orders
kikakkz Sep 12, 2023
5c51ce7
Correct lock id
kikakkz Sep 12, 2023
5ac1100
Correct unpaid limitation
kikakkz Sep 12, 2023
75905f8
Correct purchase limit
kikakkz Sep 12, 2023
f633c4b
Set pay with transfer and balance
kikakkz Sep 12, 2023
a04db77
Correct app good id
Sep 13, 2023
2bbb23e
fix log
Sep 13, 2023
0248d9e
Update commit
kikakkz Sep 14, 2023
cc2bd75
Update commit
kikakkz Sep 14, 2023
55aacca
Correct
kikakkz Sep 14, 2023
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
335 changes: 126 additions & 209 deletions api/order/create.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,258 +4,175 @@ package order
import (
"context"

appgoodmwcli "github.com/NpoolPlatform/good-middleware/pkg/client/appgood"
"github.com/NpoolPlatform/libent-cruder/pkg/cruder"
commonpb "github.com/NpoolPlatform/message/npool"
appgoodpb "github.com/NpoolPlatform/message/npool/good/mgr/v1/appgood"
ordermwpb "github.com/NpoolPlatform/message/npool/order/mw/v1/order"
ordermwcli "github.com/NpoolPlatform/order-middleware/pkg/client/order"
ordertypes "github.com/NpoolPlatform/message/npool/basetypes/order/v1"

commontracer "github.com/NpoolPlatform/order-gateway/pkg/tracer"

constant "github.com/NpoolPlatform/order-gateway/pkg/message/const"
npool "github.com/NpoolPlatform/message/npool/order/gw/v1/order"
order1 "github.com/NpoolPlatform/order-gateway/pkg/order"

"go.opentelemetry.io/otel"
scodes "go.opentelemetry.io/otel/codes"
"google.golang.org/grpc/codes"
"google.golang.org/grpc/status"

"github.com/NpoolPlatform/go-service-framework/pkg/logger"
npool "github.com/NpoolPlatform/message/npool/order/gw/v1/order"
ordermgrpb "github.com/NpoolPlatform/message/npool/order/mgr/v1/order"

"github.com/shopspring/decimal"

"github.com/google/uuid"
)

func createOrder(ctx context.Context, in *npool.CreateOrderRequest) (*npool.Order, error) { //nolint
var err error

_, span := otel.Tracer(constant.ServiceName).Start(ctx, "CreateOrder")
defer span.End()

defer func() {
if err != nil {
span.SetStatus(scodes.Error, err.Error())
span.RecordError(err)
}
}()

if _, err := uuid.Parse(in.GetAppID()); err != nil {
logger.Sugar().Errorw("CreateOrder", "AppID", in.GetAppID(), "error", err)
return nil, status.Error(codes.InvalidArgument, err.Error())
}
if _, err := uuid.Parse(in.GetUserID()); err != nil {
logger.Sugar().Errorw("CreateOrder", "UserID", in.GetUserID(), "error", err)
return nil, status.Error(codes.InvalidArgument, err.Error())
}
if _, err := uuid.Parse(in.GetGoodID()); err != nil {
logger.Sugar().Errorw("CreateOrder", "GoodID", in.GetGoodID(), "error", err)
return nil, status.Error(codes.InvalidArgument, err.Error())
}
units, err := decimal.NewFromString(in.GetUnits())
if err != nil {
logger.Sugar().Errorw("CreateOrder", "Units", in.GetUnits())
return nil, status.Error(codes.InvalidArgument, "Units is 0")
}
if units.Cmp(decimal.NewFromInt32(0)) <= 0 {
logger.Sugar().Errorw("CreateOrder", "Units", in.GetUnits())
return nil, status.Error(codes.InvalidArgument, "Units is 0")
}
if _, err := uuid.Parse(in.GetPaymentCoinID()); err != nil {
logger.Sugar().Errorw("CreateOrder", "PaymentCoinID", in.GetPaymentCoinID(), "error", err)
return nil, status.Error(codes.InvalidArgument, err.Error())
}
if in.ParentOrderID != nil {
if _, err := uuid.Parse(in.GetParentOrderID()); err != nil {
logger.Sugar().Errorw("CreateOrder", "ParentOrderID", in.GetParentOrderID(), "error", err)
return nil, status.Error(codes.InvalidArgument, err.Error())
}
}
if in.PayWithBalanceAmount != nil {
amount, err := decimal.NewFromString(in.GetPayWithBalanceAmount())
if err != nil {
logger.Sugar().Errorw("CreateOrder", "PayWithBalanceAmount", in.GetPayWithBalanceAmount(), "error", err)
return nil, status.Error(codes.InvalidArgument, err.Error())
}
if amount.Cmp(decimal.NewFromInt(0)) < 0 {
logger.Sugar().Errorw("CreateOrder", "PayWithBalanceAmount", in.GetPayWithBalanceAmount())
return nil, status.Error(codes.InvalidArgument, "PayWithBalanceAmount less than 0")
}
}
if in.FixAmountID != nil {
if _, err := uuid.Parse(in.GetFixAmountID()); err != nil {
logger.Sugar().Errorw("CreateOrder", "FixAmountID", in.GetFixAmountID(), "error", err)
return nil, status.Error(codes.InvalidArgument, err.Error())
}
}
if in.DiscountID != nil {
if _, err := uuid.Parse(in.GetDiscountID()); err != nil {
logger.Sugar().Errorw("CreateOrder", "DiscountID", in.GetDiscountID(), "error", err)
return nil, status.Error(codes.InvalidArgument, err.Error())
}
}
if in.SpecialOfferID != nil {
if _, err := uuid.Parse(in.GetSpecialOfferID()); err != nil {
logger.Sugar().Errorw("CreateOrder", "SpecialOfferID", in.GetSpecialOfferID(), "error", err)
return nil, status.Error(codes.InvalidArgument, err.Error())
}
}
for _, id := range in.GetCouponIDs() {
if _, err := uuid.Parse(id); err != nil {
logger.Sugar().Errorw("CreateOrder", "error", err)
return nil, status.Error(codes.InvalidArgument, err.Error())
}
}

span = commontracer.TraceInvoker(span, "order", "gateway", "CreateOrder")

// Here we may create sub order according to good info, but we only return main order
info, err := order1.CreateOrder(ctx, &order1.OrderCreate{
AppID: in.GetAppID(),
UserID: in.GetUserID(),
GoodID: in.GetGoodID(),
PaymentCoinID: in.GetPaymentCoinID(),
Units: in.GetUnits(),
ParentOrderID: in.ParentOrderID,
BalanceAmount: in.PayWithBalanceAmount,
FixAmountID: in.FixAmountID,
DiscountID: in.DiscountID,
SpecialOfferID: in.SpecialOfferID,
OrderType: in.GetOrderType(),
CouponIDs: in.CouponIDs,
})
if err != nil {
logger.Sugar().Errorw("CreateOrder", "error", err)
return nil, status.Error(codes.Internal, err.Error())
}

return info, nil
}

func (s *Server) CreateOrder(ctx context.Context, in *npool.CreateOrderRequest) (*npool.CreateOrderResponse, error) {
ag, err := appgoodmwcli.GetGoodOnly(ctx, &appgoodpb.Conds{
AppID: &commonpb.StringVal{
Op: cruder.EQ,
Value: in.AppID,
},
GoodID: &commonpb.StringVal{
Op: cruder.EQ,
Value: in.GoodID,
},
})
if err != nil {
return &npool.CreateOrderResponse{}, status.Error(codes.Internal, err.Error())
}
if ag == nil {
return &npool.CreateOrderResponse{}, status.Error(codes.Internal, "invalid app good")
}
units, err := decimal.NewFromString(in.Units)
if err != nil {
return &npool.CreateOrderResponse{}, status.Error(codes.Internal, err.Error())
}
if ag.PurchaseLimit > 0 && units.Cmp(decimal.NewFromInt32(ag.PurchaseLimit)) > 0 {
return &npool.CreateOrderResponse{}, status.Error(codes.Internal, "too many units")
}

if !ag.EnablePurchase {
return &npool.CreateOrderResponse{}, status.Error(codes.Internal, "app good is not enabled purchase")
}

purchaseCountStr, err := ordermwcli.SumOrderUnits(
orderType := ordertypes.OrderType_Normal
handler, err := order1.NewHandler(
ctx,
&ordermwpb.Conds{
AppID: &commonpb.StringVal{Op: cruder.EQ, Value: in.AppID},
UserID: &commonpb.StringVal{Op: cruder.EQ, Value: in.UserID},
GoodID: &commonpb.StringVal{Op: cruder.EQ, Value: in.GoodID},
States: &commonpb.Uint32SliceVal{
Op: cruder.IN,
Value: []uint32{
uint32(ordermgrpb.OrderState_Paid),
uint32(ordermgrpb.OrderState_InService),
uint32(ordermgrpb.OrderState_Expired),
uint32(ordermgrpb.OrderState_WaitPayment),
},
},
},
order1.WithAppID(&in.AppID, true),
order1.WithUserID(&in.UserID, true),
order1.WithAppGoodID(&in.AppGoodID, true),
order1.WithUnits(in.Units, true),
order1.WithPaymentCoinID(&in.PaymentCoinID, true),
order1.WithParentOrderID(in.ParentOrderID, false),
order1.WithOrderType(&orderType, true),
order1.WithBalanceAmount(in.PayWithBalanceAmount, false),
order1.WithCouponIDs(in.CouponIDs, false),
order1.WithInvestmentType(&in.InvestmentType, true),
)
if err != nil {
return nil, err
logger.Sugar().Errorw(
"CreateOrder",
"In", in,
"Error", err,
)
return &npool.CreateOrderResponse{}, status.Error(codes.InvalidArgument, err.Error())
}

purchaseCount, err := decimal.NewFromString(purchaseCountStr)
info, err := handler.CreateOrder(ctx)
if err != nil {
return nil, err
}

userPurchaseLimit, err := decimal.NewFromString(ag.UserPurchaseLimit)
if err != nil {
logger.Sugar().Errorw("ValidateInit", "error", err)
logger.Sugar().Errorw(
"CreateOrder",
"In", in,
"Error", err,
)
return &npool.CreateOrderResponse{}, status.Error(codes.Internal, err.Error())
}

if userPurchaseLimit.Cmp(decimal.NewFromInt(0)) > 0 && purchaseCount.Add(units).Cmp(userPurchaseLimit) > 0 {
return &npool.CreateOrderResponse{}, status.Error(codes.Internal, "too many units")
}

in.OrderType = ordermgrpb.OrderType_Normal
ord, err := createOrder(ctx, in)
if err != nil {
return &npool.CreateOrderResponse{}, err
}
return &npool.CreateOrderResponse{
Info: ord,
Info: info,
}, nil
}

func (s *Server) CreateUserOrder(ctx context.Context, in *npool.CreateUserOrderRequest) (*npool.CreateUserOrderResponse, error) {
switch in.OrderType {
case ordermgrpb.OrderType_Offline:
case ordermgrpb.OrderType_Airdrop:
case ordertypes.OrderType_Offline:
case ordertypes.OrderType_Airdrop:
default:
return &npool.CreateUserOrderResponse{}, status.Errorf(codes.InvalidArgument, "order type invalid")
}

ord, err := createOrder(ctx, &npool.CreateOrderRequest{
AppID: in.AppID,
UserID: in.TargetUserID,
GoodID: in.GoodID,
PaymentCoinID: in.PaymentCoinID,
Units: in.Units,
ParentOrderID: in.ParentOrderID,
OrderType: in.OrderType,
})
handler, err := order1.NewHandler(
ctx,
order1.WithAppID(&in.AppID, true),
order1.WithUserID(&in.TargetUserID, true),
order1.WithAppGoodID(&in.AppGoodID, true),
order1.WithUnits(in.Units, true),
order1.WithPaymentCoinID(&in.PaymentCoinID, true),
order1.WithParentOrderID(in.ParentOrderID, false),
order1.WithOrderType(&in.OrderType, true),
order1.WithInvestmentType(&in.InvestmentType, true),
)
if err != nil {
logger.Sugar().Errorw(
"CreateUserOrder",
"In", in,
"Error", err,
)
return &npool.CreateUserOrderResponse{}, status.Error(codes.InvalidArgument, err.Error())
}

info, err := handler.CreateOrder(ctx)
if err != nil {
return &npool.CreateUserOrderResponse{}, err
logger.Sugar().Errorw(
"CreateUserOrder",
"In", in,
"Error", err,
)
return &npool.CreateUserOrderResponse{}, status.Error(codes.Internal, err.Error())
}

return &npool.CreateUserOrderResponse{
Info: ord,
Info: info,
}, nil
}

func (s *Server) CreateAppUserOrder(ctx context.Context, in *npool.CreateAppUserOrderRequest) (*npool.CreateAppUserOrderResponse, error) {
switch in.OrderType {
case ordermgrpb.OrderType_Offline:
case ordermgrpb.OrderType_Airdrop:
case ordertypes.OrderType_Offline:
case ordertypes.OrderType_Airdrop:
default:
return &npool.CreateAppUserOrderResponse{}, status.Errorf(codes.InvalidArgument, "order type invalid")
}

ord, err := createOrder(ctx, &npool.CreateOrderRequest{
AppID: in.TargetAppID,
UserID: in.TargetUserID,
GoodID: in.GoodID,
PaymentCoinID: in.PaymentCoinID,
Units: in.Units,
ParentOrderID: in.ParentOrderID,
OrderType: in.OrderType,
})
handler, err := order1.NewHandler(
ctx,
order1.WithAppID(&in.TargetAppID, true),
order1.WithUserID(&in.TargetUserID, true),
order1.WithAppGoodID(&in.AppGoodID, true),
order1.WithUnits(in.Units, true),
order1.WithPaymentCoinID(&in.PaymentCoinID, true),
order1.WithParentOrderID(in.ParentOrderID, false),
order1.WithOrderType(&in.OrderType, true),
order1.WithInvestmentType(&in.InvestmentType, true),
)
if err != nil {
logger.Sugar().Errorw(
"CreateAppUserOrder",
"In", in,
"Error", err,
)
return &npool.CreateAppUserOrderResponse{}, status.Error(codes.InvalidArgument, err.Error())
}

info, err := handler.CreateOrder(ctx)
if err != nil {
return &npool.CreateAppUserOrderResponse{}, err
logger.Sugar().Errorw(
"CreateAppUserOrder",
"In", in,
"Error", err,
)
return &npool.CreateAppUserOrderResponse{}, status.Error(codes.Internal, err.Error())
}

return &npool.CreateAppUserOrderResponse{
Info: ord,
Info: info,
}, nil
}

func (s *Server) CreateOrders(ctx context.Context, in *npool.CreateOrdersRequest) (*npool.CreateOrdersResponse, error) {
orderType := ordertypes.OrderType_Normal
handler, err := order1.NewHandler(
ctx,
order1.WithAppID(&in.AppID, true),
order1.WithUserID(&in.UserID, true),
order1.WithPaymentCoinID(&in.PaymentCoinID, true),
order1.WithOrderType(&orderType, true),
order1.WithBalanceAmount(in.PayWithBalanceAmount, false),
order1.WithCouponIDs(in.CouponIDs, false),
order1.WithInvestmentType(&in.InvestmentType, true),
order1.WithOrders(in.Orders, true),
)
if err != nil {
logger.Sugar().Errorw(
"CreateOrders",
"In", in,
"Error", err,
)
return &npool.CreateOrdersResponse{}, status.Error(codes.InvalidArgument, err.Error())
}

infos, err := handler.CreateOrders(ctx)
if err != nil {
logger.Sugar().Errorw(
"CreateOrders",
"In", in,
"Error", err,
)
return &npool.CreateOrdersResponse{}, status.Error(codes.Internal, err.Error())
}

return &npool.CreateOrdersResponse{
Infos: infos,
}, nil
}
Loading
Loading