flamingo.me/flamingo-commerce/v3@v3.11.0/checkout/domain/placeorder/states/complete_cart.go (about) 1 package states 2 3 import ( 4 "context" 5 "encoding/gob" 6 "fmt" 7 8 "go.opencensus.io/trace" 9 10 "flamingo.me/flamingo-commerce/v3/cart/application" 11 "flamingo.me/flamingo-commerce/v3/cart/domain/cart" 12 "flamingo.me/flamingo-commerce/v3/checkout/domain/placeorder/process" 13 ) 14 15 type ( 16 // CompleteCart state 17 CompleteCart struct { 18 cartService *application.CartService 19 cartReceiverService *application.CartReceiverService 20 } 21 // CompleteCartRollbackData for later rollbacks 22 CompleteCartRollbackData struct { 23 CompletedCart *cart.Cart 24 } 25 ) 26 27 func init() { 28 gob.Register(CompleteCartRollbackData{}) 29 } 30 31 var _ process.State = CompleteCart{} 32 33 // Inject dependencies 34 func (c *CompleteCart) Inject( 35 cartService *application.CartService, 36 cartReceiverService *application.CartReceiverService, 37 ) *CompleteCart { 38 c.cartService = cartService 39 c.cartReceiverService = cartReceiverService 40 41 return c 42 } 43 44 // Name get state name 45 func (CompleteCart) Name() string { 46 return "CompleteCart" 47 } 48 49 // Run the state operations 50 func (c CompleteCart) Run(ctx context.Context, p *process.Process) process.RunResult { 51 ctx, span := trace.StartSpan(ctx, "placeorder/state/CompleteCart/Run") 52 defer span.End() 53 54 behaviour, err := c.cartReceiverService.ModifyBehaviour(ctx) 55 if err != nil { 56 return process.RunResult{ 57 Failed: process.ErrorOccurredReason{Error: err.Error()}, 58 } 59 } 60 61 _, ok := behaviour.(cart.CompleteBehaviour) 62 if !ok { 63 // cart does not support completing, proceed to place order 64 p.UpdateState(PlaceOrder{}.Name(), nil) 65 return process.RunResult{} 66 } 67 68 completedCart, err := c.cartService.CompleteCurrentCart(ctx) 69 if err != nil { 70 return process.RunResult{ 71 Failed: process.ErrorOccurredReason{Error: err.Error()}, 72 } 73 } 74 75 p.UpdateState(PlaceOrder{}.Name(), nil) 76 return process.RunResult{ 77 RollbackData: CompleteCartRollbackData{ 78 CompletedCart: completedCart, 79 }, 80 } 81 } 82 83 // Rollback the state operations 84 func (c CompleteCart) Rollback(ctx context.Context, data process.RollbackData) error { 85 ctx, span := trace.StartSpan(ctx, "placeorder/state/CompleteCart/Rollback") 86 defer span.End() 87 88 rollbackData, ok := data.(CompleteCartRollbackData) 89 if !ok { 90 return fmt.Errorf("rollback data not of expected type 'CompleteCartRollbackData', but %T", data) 91 } 92 93 _, err := c.cartService.RestoreCart(ctx, rollbackData.CompletedCart) 94 if err != nil { 95 return err 96 } 97 98 return nil 99 } 100 101 // IsFinal if state is a final state 102 func (c CompleteCart) IsFinal() bool { 103 return false 104 }