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  }