flamingo.me/flamingo-commerce/v3@v3.11.0/checkout/interfaces/graphql/mutationresolver.go (about) 1 package graphql 2 3 import ( 4 "context" 5 "net/url" 6 7 "flamingo.me/flamingo/v3/framework/flamingo" 8 "flamingo.me/flamingo/v3/framework/web" 9 10 cartApplication "flamingo.me/flamingo-commerce/v3/cart/application" 11 "flamingo.me/flamingo-commerce/v3/cart/domain/decorator" 12 graphqlDto "flamingo.me/flamingo-commerce/v3/cart/interfaces/graphql/dto" 13 "flamingo.me/flamingo-commerce/v3/checkout/application/placeorder" 14 "flamingo.me/flamingo-commerce/v3/checkout/domain/placeorder/process" 15 "flamingo.me/flamingo-commerce/v3/checkout/interfaces/graphql/dto" 16 ) 17 18 // CommerceCheckoutMutationResolver resolves graphql checkout mutations 19 type CommerceCheckoutMutationResolver struct { 20 placeorderHandler *placeorder.Handler 21 cartService *cartApplication.CartService 22 stateMapper *dto.StateMapper 23 logger flamingo.Logger 24 decoratedCartFactory *decorator.DecoratedCartFactory 25 } 26 27 // Inject dependencies 28 func (r *CommerceCheckoutMutationResolver) Inject( 29 placeorderHandler *placeorder.Handler, 30 cartService *cartApplication.CartService, 31 decoratedCartFactory *decorator.DecoratedCartFactory, 32 stateMapper *dto.StateMapper, 33 logger flamingo.Logger, 34 ) { 35 r.placeorderHandler = placeorderHandler 36 r.decoratedCartFactory = decoratedCartFactory 37 r.cartService = cartService 38 r.stateMapper = stateMapper 39 r.logger = logger.WithField(flamingo.LogKeyModule, "checkout").WithField(flamingo.LogKeyCategory, "graphql") 40 } 41 42 // CommerceCheckoutRefreshPlaceOrder refreshes the current place order and proceeds the process 43 func (r *CommerceCheckoutMutationResolver) CommerceCheckoutRefreshPlaceOrder(ctx context.Context) (*dto.PlaceOrderContext, error) { 44 return r.refresh(ctx, r.placeorderHandler.RefreshPlaceOrder) 45 } 46 47 func (r *CommerceCheckoutMutationResolver) refresh( 48 ctx context.Context, 49 refreshFnc func(context.Context, placeorder.RefreshPlaceOrderCommand) (*process.Context, error), 50 ) (*dto.PlaceOrderContext, error) { 51 52 poctx, err := refreshFnc(ctx, placeorder.RefreshPlaceOrderCommand{}) 53 if err != nil { 54 return nil, err 55 } 56 57 dc := graphqlDto.NewDecoratedCart(r.decoratedCartFactory.Create(ctx, poctx.Cart)) 58 59 graphQLState, err := r.stateMapper.Map(*poctx) 60 if err != nil { 61 return nil, err 62 } 63 64 var orderInfos *dto.PlacedOrderInfos 65 if poctx.PlaceOrderInfo != nil { 66 orderInfos = &dto.PlacedOrderInfos{ 67 PaymentInfos: poctx.PlaceOrderInfo.PaymentInfos, 68 PlacedOrderInfos: poctx.PlaceOrderInfo.PlacedOrders, 69 Email: poctx.PlaceOrderInfo.ContactEmail, 70 PlacedDecoratedCart: dc, 71 } 72 } 73 74 return &dto.PlaceOrderContext{ 75 Cart: dc, 76 OrderInfos: orderInfos, 77 State: graphQLState, 78 UUID: poctx.UUID, 79 }, nil 80 } 81 82 // CommerceCheckoutRefreshPlaceOrderBlocking refreshes the current place order blocking 83 func (r *CommerceCheckoutMutationResolver) CommerceCheckoutRefreshPlaceOrderBlocking(ctx context.Context) (*dto.PlaceOrderContext, error) { 84 return r.refresh(ctx, r.placeorderHandler.RefreshPlaceOrderBlocking) 85 } 86 87 // CommerceCheckoutStartPlaceOrder starts a new process (if not running) 88 func (r *CommerceCheckoutMutationResolver) CommerceCheckoutStartPlaceOrder(ctx context.Context, returnURLRaw string) (*dto.StartPlaceOrderResult, error) { 89 session := web.SessionFromContext(ctx) 90 cart, err := r.cartService.GetCartReceiverService().ViewCart(ctx, session) 91 if err != nil { 92 return nil, err 93 } 94 var returnURL *url.URL 95 if returnURLRaw != "" { 96 returnURL, err = url.Parse(returnURLRaw) 97 if err != nil { 98 return nil, err 99 } 100 } 101 startPlaceOrderCommand := placeorder.StartPlaceOrderCommand{Cart: *cart, ReturnURL: returnURL} 102 pctx, err := r.placeorderHandler.StartPlaceOrder(ctx, startPlaceOrderCommand) 103 if err != nil { 104 return nil, err 105 } 106 return &dto.StartPlaceOrderResult{ 107 UUID: pctx.UUID, 108 }, nil 109 } 110 111 // CommerceCheckoutCancelPlaceOrder cancels a running place order 112 func (r *CommerceCheckoutMutationResolver) CommerceCheckoutCancelPlaceOrder(ctx context.Context) (bool, error) { 113 err := r.placeorderHandler.CancelPlaceOrder(ctx, placeorder.CancelPlaceOrderCommand{}) 114 115 return err == nil, err 116 } 117 118 // CommerceCheckoutClearPlaceOrder clears the last place order if in final state 119 func (r *CommerceCheckoutMutationResolver) CommerceCheckoutClearPlaceOrder(ctx context.Context) (bool, error) { 120 err := r.placeorderHandler.ClearPlaceOrder(ctx) 121 122 return err == nil, err 123 }