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 }