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 }