flamingo.me/flamingo-commerce/v3@v3.11.0/checkout/domain/placeorder/states/prepare_cart.go (about)

     1  package states
     2  
     3  import (
     4  	"context"
     5  
     6  	"flamingo.me/flamingo/v3/framework/web"
     7  	"go.opencensus.io/trace"
     8  
     9  	"flamingo.me/flamingo-commerce/v3/cart/application"
    10  	"flamingo.me/flamingo-commerce/v3/cart/domain/cart"
    11  	"flamingo.me/flamingo-commerce/v3/checkout/domain/placeorder/process"
    12  )
    13  
    14  type (
    15  	// PrepareCart state
    16  	PrepareCart struct {
    17  		cartService *application.CartService
    18  	}
    19  )
    20  
    21  var _ process.State = PrepareCart{}
    22  
    23  // Inject dependencies
    24  func (v *PrepareCart) Inject(
    25  	cartService *application.CartService,
    26  ) *PrepareCart {
    27  	v.cartService = cartService
    28  
    29  	return v
    30  }
    31  
    32  // Name get state name
    33  func (PrepareCart) Name() string {
    34  	return "PrepareCart"
    35  }
    36  
    37  // Run the state operations
    38  func (v PrepareCart) Run(ctx context.Context, p *process.Process) process.RunResult {
    39  	ctx, span := trace.StartSpan(ctx, "placeorder/state/PrepareCart/Run")
    40  	defer span.End()
    41  
    42  	c, err := v.cartService.ForceReserveOrderIDAndSave(ctx, web.SessionFromContext(ctx))
    43  	if err != nil {
    44  		return process.RunResult{
    45  			Failed: process.ErrorOccurredReason{Error: err.Error()},
    46  		}
    47  	}
    48  
    49  	if c.GrandTotal.IsZero() {
    50  		p.UpdateState(ValidateCart{}.Name(), nil)
    51  		p.UpdateCart(*c)
    52  		return process.RunResult{}
    53  	}
    54  
    55  	if c.PaymentSelection == nil {
    56  		return process.RunResult{
    57  			Failed: process.PaymentErrorOccurredReason{Error: cart.ErrPaymentSelectionNotSet.Error()},
    58  		}
    59  	}
    60  
    61  	paymentSelection, err := c.PaymentSelection.GenerateNewIdempotencyKey()
    62  	if err != nil {
    63  		return process.RunResult{
    64  			Failed: process.ErrorOccurredReason{Error: err.Error()},
    65  		}
    66  	}
    67  
    68  	err = v.cartService.UpdatePaymentSelection(ctx, web.SessionFromContext(ctx), paymentSelection)
    69  	if err != nil {
    70  		return process.RunResult{
    71  			Failed: process.ErrorOccurredReason{Error: err.Error()},
    72  		}
    73  	}
    74  
    75  	p.UpdateState(ValidateCart{}.Name(), nil)
    76  	p.UpdateCart(*c)
    77  	return process.RunResult{}
    78  }
    79  
    80  // Rollback the state operations
    81  func (v PrepareCart) Rollback(context.Context, process.RollbackData) error {
    82  	return nil
    83  }
    84  
    85  // IsFinal if state is a final state
    86  func (v PrepareCart) IsFinal() bool {
    87  	return false
    88  }