flamingo.me/flamingo-commerce/v3@v3.11.0/cart/domain/events/eventPublishing.go (about)

     1  package events
     2  
     3  import (
     4  	"context"
     5  
     6  	"go.opencensus.io/trace"
     7  
     8  	"flamingo.me/flamingo/v3/framework/flamingo"
     9  
    10  	cartDomain "flamingo.me/flamingo-commerce/v3/cart/domain/cart"
    11  	"flamingo.me/flamingo-commerce/v3/cart/domain/placeorder"
    12  	productDomain "flamingo.me/flamingo-commerce/v3/product/domain"
    13  )
    14  
    15  type (
    16  
    17  	// EventPublisher technology free interface to publish events that might be interesting for outside (Publish)
    18  	EventPublisher interface {
    19  		PublishAddToCartEvent(ctx context.Context, cart *cartDomain.Cart, marketPlaceCode string, variantMarketPlaceCode string, qty int)
    20  		PublishChangedQtyInCartEvent(ctx context.Context, cart *cartDomain.Cart, item *cartDomain.Item, qtyBefore int, qtyAfter int)
    21  		PublishOrderPlacedEvent(ctx context.Context, cart *cartDomain.Cart, placedOrderInfos placeorder.PlacedOrderInfos)
    22  	}
    23  
    24  	// DefaultEventPublisher implements the event publisher of the domain and uses the framework event router
    25  	DefaultEventPublisher struct {
    26  		logger         flamingo.Logger
    27  		productService productDomain.ProductService
    28  		eventRouter    flamingo.EventRouter
    29  	}
    30  )
    31  
    32  var (
    33  	_ EventPublisher = (*DefaultEventPublisher)(nil)
    34  	_ flamingo.Event = (*OrderPlacedEvent)(nil)
    35  	_ flamingo.Event = (*AddToCartEvent)(nil)
    36  	_ flamingo.Event = (*PaymentSelectionHasBeenResetEvent)(nil)
    37  	_ flamingo.Event = (*ChangedQtyInCartEvent)(nil)
    38  )
    39  
    40  // Inject dependencies
    41  func (d *DefaultEventPublisher) Inject(
    42  	logger flamingo.Logger,
    43  	productService productDomain.ProductService,
    44  	eventRouter flamingo.EventRouter,
    45  ) {
    46  	d.logger = logger
    47  	d.productService = productService
    48  	d.eventRouter = eventRouter
    49  }
    50  
    51  // PublishAddToCartEvent publishes an event for add to cart actions
    52  func (d *DefaultEventPublisher) PublishAddToCartEvent(ctx context.Context, cart *cartDomain.Cart, marketPlaceCode string, variantMarketPlaceCode string, qty int) {
    53  	ctx, span := trace.StartSpan(ctx, "cart/DefaultEventPublisher/PublishAddToCartEvent")
    54  	defer span.End()
    55  
    56  	product, err := d.productService.Get(ctx, marketPlaceCode)
    57  	if err != nil {
    58  		return
    59  	}
    60  
    61  	eventObject := AddToCartEvent{
    62  		MarketplaceCode:        marketPlaceCode,
    63  		VariantMarketplaceCode: variantMarketPlaceCode,
    64  		ProductName:            product.TeaserData().ShortTitle,
    65  		Qty:                    qty,
    66  		Cart:                   cart,
    67  	}
    68  
    69  	d.logger.WithContext(ctx).Info("Publish Event PublishAddToCartEvent: ", eventObject)
    70  	d.eventRouter.Dispatch(ctx, &eventObject)
    71  }
    72  
    73  // PublishChangedQtyInCartEvent publishes an event for cart item quantity change actions
    74  func (d *DefaultEventPublisher) PublishChangedQtyInCartEvent(ctx context.Context, cart *cartDomain.Cart, item *cartDomain.Item, qtyBefore int, qtyAfter int) {
    75  	ctx, span := trace.StartSpan(ctx, "cart/DefaultEventPublisher/PublishChangedQtyInCartEvent")
    76  	defer span.End()
    77  
    78  	eventObject := ChangedQtyInCartEvent{
    79  		CartID:                 cart.ID,
    80  		MarketplaceCode:        item.MarketplaceCode,
    81  		VariantMarketplaceCode: item.VariantMarketPlaceCode,
    82  		ProductName:            item.ProductName,
    83  		QtyBefore:              qtyBefore,
    84  		QtyAfter:               qtyAfter,
    85  		Cart:                   cart,
    86  	}
    87  
    88  	d.logger.WithContext(ctx).Info("Publish Event PublishCartChangedQtyEvent: ", eventObject)
    89  	d.eventRouter.Dispatch(ctx, &eventObject)
    90  }
    91  
    92  // PublishOrderPlacedEvent publishes an event for placed orders
    93  func (d *DefaultEventPublisher) PublishOrderPlacedEvent(ctx context.Context, cart *cartDomain.Cart, placedOrderInfos placeorder.PlacedOrderInfos) {
    94  	ctx, span := trace.StartSpan(ctx, "cart/DefaultEventPublisher/PublishOrderPlacedEvent")
    95  	defer span.End()
    96  
    97  	eventObject := OrderPlacedEvent{
    98  		Cart:             cart,
    99  		PlacedOrderInfos: placedOrderInfos,
   100  	}
   101  
   102  	d.logger.WithContext(ctx).Info("Publish Event OrderPlacedEvent for Order: ", placedOrderInfos)
   103  
   104  	// For now we publish only to Flamingo default Event Router
   105  	d.eventRouter.Dispatch(ctx, &eventObject)
   106  }