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 }