flamingo.me/flamingo-commerce/v3@v3.11.0/w3cdatalayer/application/eventhandling.go (about)

     1  package application
     2  
     3  import (
     4  	"context"
     5  
     6  	"flamingo.me/flamingo-commerce/v3/cart/domain/decorator"
     7  	"flamingo.me/flamingo-commerce/v3/cart/domain/events"
     8  	"flamingo.me/flamingo/v3/core/auth"
     9  
    10  	"flamingo.me/flamingo/v3/framework/web"
    11  
    12  	"flamingo.me/flamingo-commerce/v3/w3cdatalayer/domain"
    13  	"flamingo.me/flamingo/v3/framework/flamingo"
    14  )
    15  
    16  type (
    17  	// EventReceiver struct with required dependencies
    18  	EventReceiver struct {
    19  		factory              *Factory
    20  		cartDecoratorFactory *decorator.DecoratedCartFactory
    21  		logger               flamingo.Logger
    22  	}
    23  )
    24  
    25  // Inject method
    26  func (e *EventReceiver) Inject(factory *Factory, cartFactory *decorator.DecoratedCartFactory, logger flamingo.Logger) {
    27  	e.factory = factory
    28  	e.cartDecoratorFactory = cartFactory
    29  	e.logger = logger.WithField("category", "w3cDatalayer").WithField(flamingo.LogKeyModule, "w3cdatalayer")
    30  }
    31  
    32  // Notify should get called by flamingo Eventlogic.
    33  // We use it to listen to Events that are relevant for the Datalayer
    34  // In case the events might be asycron (e.g. the origin action does a redirect to a success page) - we save the datalayer Event to a Session Flash - to make sure it is still available the first time the DatalayerService.Get is calles
    35  func (e *EventReceiver) Notify(ctx context.Context, event flamingo.Event) {
    36  	switch currentEvent := event.(type) {
    37  	// Handle OrderPlacedEvent and Set Transaction to current datalayer
    38  	case *events.AddToCartEvent:
    39  		e.logger.WithContext(ctx).Debug("Receive Event AddToCartEvent")
    40  		session := web.SessionFromContext(ctx)
    41  		if session != nil {
    42  			// In case of Configurable: the MarketplaceCode which is interesting for the datalayer is the Variant that is selected
    43  			saleableProductCode := currentEvent.MarketplaceCode
    44  			if currentEvent.VariantMarketplaceCode != "" {
    45  				saleableProductCode = currentEvent.VariantMarketplaceCode
    46  			}
    47  			dataLayerEvent := e.factory.BuildAddToBagEvent(saleableProductCode, currentEvent.ProductName, currentEvent.Qty)
    48  			session.AddFlash(
    49  				dataLayerEvent,
    50  				SessionEventsKey,
    51  			)
    52  		}
    53  	case *events.ChangedQtyInCartEvent:
    54  		e.logger.WithContext(ctx).WithField("category", "w3cDatalayer").Debug("Receive Event ChangedQtyInCartEvent")
    55  
    56  		session := web.SessionFromContext(ctx)
    57  		if session != nil {
    58  			saleableProductCode := currentEvent.MarketplaceCode
    59  			if currentEvent.VariantMarketplaceCode != "" {
    60  				saleableProductCode = currentEvent.VariantMarketplaceCode
    61  			}
    62  			dataLayerEvent := e.factory.BuildChangeQtyEvent(saleableProductCode, currentEvent.ProductName, currentEvent.QtyAfter, currentEvent.QtyBefore, currentEvent.Cart.ID)
    63  			session.AddFlash(
    64  				dataLayerEvent,
    65  				SessionEventsKey,
    66  			)
    67  
    68  		}
    69  	case *auth.WebLoginEvent:
    70  		e.logger.WithContext(ctx).WithField("category", "w3cDatalayer").Debug("Receive Event WebLoginEvent")
    71  		session := web.SessionFromContext(ctx)
    72  		if session != nil {
    73  
    74  			dataLayerEvent := domain.Event{EventInfo: make(map[string]interface{})}
    75  			dataLayerEvent.EventInfo["eventName"] = "login"
    76  			session.AddFlash(
    77  				dataLayerEvent,
    78  				SessionEventsKey,
    79  			)
    80  		}
    81  	}
    82  }