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  }