package main import ( "context" "encoding/json" "fmt" "os" "strings" "github.com/ThreeDotsLabs/watermill" "github.com/ThreeDotsLabs/watermill-redisstream/pkg/redisstream" "github.com/ThreeDotsLabs/watermill-routing-example/server/common" "github.com/ThreeDotsLabs/watermill/components/cqrs" "github.com/ThreeDotsLabs/watermill/message" "github.com/ThreeDotsLabs/watermill/message/router/middleware" "github.com/redis/go-redis/v9" ) var ( replica = os.Getenv("REPLICA") serviceName = "crm-service" serviceNameWithReplica = serviceName + "-" + replica ) func main() { logger := watermill.NewStdLogger(false, false) router, err := message.NewRouter(message.RouterConfig{}, logger) if err != nil { panic(err) } pubClient := redis.NewClient(&redis.Options{ Addr: "redis:6379", }) publisher, err := redisstream.NewPublisher( redisstream.PublisherConfig{ Client: pubClient, }, logger, ) if err != nil { panic(err) } router.AddMiddleware(middleware.Recoverer) router.AddMiddleware(common.NotifyMiddleware(publisher, serviceNameWithReplica)) subClient := redis.NewClient(&redis.Options{ Addr: "redis:6379", }) subscriber, err := redisstream.NewSubscriber( redisstream.SubscriberConfig{ Client: subClient, ConsumerGroup: "", }, logger, ) if err != nil { panic(err) } if replica == "1" { router.AddConsumerHandler( "OnUserSignedUp-2", "UserSignedUp-2", subscriber, func(msg *message.Message) error { var event common.UserSignedUp err := json.Unmarshal(msg.Payload, &event) if err != nil { return err } fmt.Println("Adding user", event.UserID, "to the CRM") return nil }, ) } if replica == "1" { eventProc8, err := cqrs.NewEventProcessorWithConfig(router, cqrs.EventProcessorConfig{ GenerateSubscribeTopic: func(params cqrs.EventProcessorGenerateSubscribeTopicParams) (string, error) { return fmt.Sprintf("%s-8", params.EventName), nil }, SubscriberConstructor: func(params cqrs.EventProcessorSubscriberConstructorParams) (message.Subscriber, error) { handlerName := strings.Split(params.HandlerName, "-")[0] return redisstream.NewSubscriber( redisstream.SubscriberConfig{ Client: subClient, ConsumerGroup: fmt.Sprintf("%s_%s", serviceName, handlerName), }, logger, ) }, Marshaler: cqrs.JSONMarshaler{ GenerateName: cqrs.StructName, }, Logger: logger, }) if err != nil { panic(err) } err = eventProc8.AddHandlers( cqrs.NewEventHandler("AddToCRM-8", HandleCRM), cqrs.NewEventHandler("AddToSupport-8", HandleSupport), ) if err != nil { panic(err) } } eventProc9, err := cqrs.NewEventProcessorWithConfig(router, cqrs.EventProcessorConfig{ GenerateSubscribeTopic: func(params cqrs.EventProcessorGenerateSubscribeTopicParams) (string, error) { return fmt.Sprintf("%s-9", params.EventName), nil }, SubscriberConstructor: func(params cqrs.EventProcessorSubscriberConstructorParams) (message.Subscriber, error) { handlerName := strings.Split(params.HandlerName, "-")[0] return redisstream.NewSubscriber( redisstream.SubscriberConfig{ Client: subClient, ConsumerGroup: fmt.Sprintf("%s_%s", serviceName, handlerName), }, logger, ) }, Marshaler: cqrs.JSONMarshaler{ GenerateName: cqrs.StructName, }, Logger: logger, }) if err != nil { panic(err) } err = eventProc9.AddHandlers( cqrs.NewEventHandler("AddToCRM-9", HandleCRM), cqrs.NewEventHandler("AddToSupport-9", HandleSupport), ) if err != nil { panic(err) } err = router.Run(context.Background()) if err != nil { panic(err) } } func HandleCRM(ctx context.Context, e *common.UserSignedUp) error { fmt.Println("Adding user", e.UserID, "to the CRM") return nil } func HandleSupport(ctx context.Context, e *common.UserSignedUp) error { fmt.Println("Adding user", e.UserID, "to the support channel") return nil }