Skip to content

Commit d3ea6aa

Browse files
committed
implement slack notifier for demo organization creation event
1 parent a4dde4a commit d3ea6aa

16 files changed

Lines changed: 285 additions & 279 deletions

File tree

api-description/apidocs.swagger.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3008,6 +3008,7 @@ paths:
30083008
- DOMAIN_EVENT_TAG
30093009
- DOMAIN_EVENT_CODEREF
30103010
- DOMAIN_EVENT_TEAM
3011+
- DOMAIN_EVENT_DEMO_ORGANIZATION
30113012
- FEATURE_STALE
30123013
- EXPERIMENT_RUNNING
30133014
- MAU_COUNT
@@ -3519,6 +3520,7 @@ definitions:
35193520
- DOMAIN_EVENT_TAG
35203521
- DOMAIN_EVENT_CODEREF
35213522
- DOMAIN_EVENT_TEAM
3523+
- DOMAIN_EVENT_DEMO_ORGANIZATION
35223524
- FEATURE_STALE
35233525
- EXPERIMENT_RUNNING
35243526
- MAU_COUNT

api-description/web-api.swagger.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7971,6 +7971,7 @@ paths:
79717971
- DOMAIN_EVENT_TAG
79727972
- DOMAIN_EVENT_CODEREF
79737973
- DOMAIN_EVENT_TEAM
7974+
- DOMAIN_EVENT_DEMO_ORGANIZATION
79747975
- FEATURE_STALE
79757976
- EXPERIMENT_RUNNING
79767977
- MAU_COUNT
@@ -8699,6 +8700,7 @@ definitions:
86998700
- DOMAIN_EVENT_TAG
87008701
- DOMAIN_EVENT_CODEREF
87018702
- DOMAIN_EVENT_TEAM
8703+
- DOMAIN_EVENT_DEMO_ORGANIZATION
87028704
- FEATURE_STALE
87038705
- EXPERIMENT_RUNNING
87048706
- MAU_COUNT

manifests/bucketeer/charts/subscriber/values.yaml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -251,6 +251,9 @@ processors:
251251
userEventPersister:
252252
flushSize: 200
253253
flushInterval: 5
254+
demoOrganizationCreationNotifier:
255+
webURL: ""
256+
slackWebhookURL: ""
254257

255258
onDemandProcessors:
256259
evaluationCountEventDWHPersister:

manifests/bucketeer/values.dev.yaml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -511,6 +511,9 @@ subscriber:
511511
userEventPersister:
512512
flushSize: 10
513513
flushInterval: 5
514+
demoOrganizationCreationNotifier:
515+
webURL: "https://localhost:9003"
516+
slackWebhookURL: ""
514517

515518
onDemandProcessors:
516519
evaluationCountEventDWHPersister:

pkg/notification/sender/notifier/slack.go

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -180,10 +180,42 @@ func (n *slackNotifier) createAttachment(
180180
return n.createExperimentRunningAttachment(notification.ExperimentRunningNotification)
181181
case sender.Notification_MauCount:
182182
return n.createMAUCountAttachment(notification.MauCountNotification)
183+
case sender.Notification_DemoOrganizationCreation:
184+
return n.createDemoOrganizationCreationAttachment(notification.DemoOrganizationCreationNotification)
183185
}
184186
return nil, ErrUnknownNotification
185187
}
186188

189+
func (n *slackNotifier) createDemoOrganizationCreationAttachment(
190+
notification *senderproto.DemoOrganizationCreationNotification,
191+
) (*slack.Attachment, error) {
192+
url, err := domainevent.URL(
193+
domainproto.Event_ORGANIZATION,
194+
n.webURL,
195+
"",
196+
notification.OrganizationId,
197+
)
198+
if err != nil {
199+
n.logger.Error("Failed to create URL for demo organization",
200+
zap.Error(err),
201+
zap.String("organizationId", notification.OrganizationId),
202+
)
203+
return nil, err
204+
}
205+
206+
attachment := &slack.Attachment{
207+
Color: "#36a64f",
208+
AuthorName: notification.OwnerEmail,
209+
Text: "A new demo organization has been created.\n\n" +
210+
"Organization ID: " + notification.OrganizationId + "\n" +
211+
"Organization Name: " + notification.OrganizationName + "\n" +
212+
"Owner Email: " + notification.OwnerEmail + "\n" +
213+
"URL: " + fmt.Sprintf(linkTemplate, url, notification.OrganizationName),
214+
}
215+
216+
return attachment, nil
217+
}
218+
187219
func (n *slackNotifier) createDomainEventAttachment(
188220
notification *senderproto.DomainEventNotification,
189221
localizer locale.Localizer,

pkg/subscriber/cmd/server/server.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -534,7 +534,7 @@ func (s *server) registerPubSubProcessorMap(
534534
)
535535

536536
demoOrganizationCreationNotifier := processor.NewDemoOrganizationCreationNotifier(
537-
sender,
537+
processorsConfigMap[processor.DemoOrganizationCreationNotifierName],
538538
logger,
539539
)
540540
processors.RegisterProcessor(

pkg/subscriber/processor/demo_organization_creation_notifier.go

Lines changed: 78 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2,31 +2,59 @@ package processor
22

33
import (
44
"context"
5+
"encoding/json"
6+
"fmt"
57
"time"
68

79
"go.uber.org/zap"
810
"google.golang.org/protobuf/proto"
911

10-
"github.com/bucketeer-io/bucketeer/pkg/notification/sender"
12+
"github.com/bucketeer-io/bucketeer/pkg/notification/sender/notifier"
1113
"github.com/bucketeer-io/bucketeer/pkg/pubsub/puller"
1214
"github.com/bucketeer-io/bucketeer/pkg/pubsub/puller/codes"
1315
"github.com/bucketeer-io/bucketeer/pkg/subscriber"
1416
domainevent "github.com/bucketeer-io/bucketeer/proto/event/domain"
1517
domaineventproto "github.com/bucketeer-io/bucketeer/proto/event/domain"
18+
notificationproto "github.com/bucketeer-io/bucketeer/proto/notification"
19+
senderproto "github.com/bucketeer-io/bucketeer/proto/notification/sender"
1620
)
1721

22+
type DemoOrganizationCreationNotifierConfig struct {
23+
WebURL string `json:"webURL"`
24+
SlackWebhookURL string `json:"slackWebhookURL"`
25+
}
26+
1827
type demoOrganizationCreationNotifier struct {
19-
sender sender.Sender
20-
logger *zap.Logger
28+
slackNotifier notifier.Notifier
29+
demoOrganizationCreationNotifierConfig DemoOrganizationCreationNotifierConfig
30+
logger *zap.Logger
2131
}
2232

2333
func NewDemoOrganizationCreationNotifier(
24-
sender sender.Sender,
34+
config interface{},
2535
logger *zap.Logger,
2636
) subscriber.PubSubProcessor {
37+
jsonConfigMap, ok := config.(map[string]interface{})
38+
if !ok {
39+
logger.Error("demoOrganizationCreationNotifier: invalid config type, expected map[string]interface{}")
40+
return nil
41+
}
42+
configBytes, err := json.Marshal(jsonConfigMap)
43+
if err != nil {
44+
logger.Error("demoOrganizationCreationNotifier: failed to marshal config", zap.Error(err))
45+
return nil
46+
}
47+
var notifierConfig DemoOrganizationCreationNotifierConfig
48+
if err := json.Unmarshal(configBytes, &notifierConfig); err != nil {
49+
logger.Error("demoOrganizationCreationNotifier: failed to unmarshal config", zap.Error(err))
50+
return nil
51+
}
52+
slackNotifier := notifier.NewSlackNotifier(notifierConfig.WebURL)
53+
2754
return &demoOrganizationCreationNotifier{
28-
sender: sender,
29-
logger: logger,
55+
slackNotifier: slackNotifier,
56+
demoOrganizationCreationNotifierConfig: notifierConfig,
57+
logger: logger,
3058
}
3159
}
3260

@@ -55,6 +83,11 @@ func (d demoOrganizationCreationNotifier) handleMessage(msg *puller.Message) {
5583
}
5684
domainEvent, err := d.unmarshalMessage(msg)
5785
if err != nil {
86+
d.logger.Error("Failed to unmarshal message",
87+
zap.Error(err),
88+
zap.String("msgID", msg.ID),
89+
zap.String("attributes", fmt.Sprintf("%+v", msg.Attributes)),
90+
)
5891
subscriberHandledCounter.WithLabelValues(subscriberDemoOrganizationEvent, codes.BadMessage.String()).Inc()
5992
msg.Ack()
6093
return
@@ -67,11 +100,42 @@ func (d demoOrganizationCreationNotifier) handleMessage(msg *puller.Message) {
67100
return
68101
}
69102

70-
err = d.SendSlackNotifier(ctx, domainEvent)
103+
var organizationCreatedEvent domaineventproto.OrganizationCreatedEvent
104+
if err := domainEvent.Data.UnmarshalTo(&organizationCreatedEvent); err != nil {
105+
d.logger.Error("Failed to unmarshal OrganizationCreatedEvent",
106+
zap.String("event id", domainEvent.Id),
107+
zap.Error(err),
108+
)
109+
subscriberHandledCounter.WithLabelValues(
110+
subscriberDemoOrganizationEvent,
111+
codes.NonRepeatableError.String(),
112+
).Inc()
113+
msg.Ack()
114+
return
115+
}
116+
117+
recipient := &notificationproto.Recipient{
118+
Type: notificationproto.Recipient_SlackChannel,
119+
Language: notificationproto.Recipient_ENGLISH,
120+
SlackChannelRecipient: &notificationproto.SlackChannelRecipient{
121+
WebhookUrl: d.demoOrganizationCreationNotifierConfig.SlackWebhookURL,
122+
},
123+
}
124+
fmt.Printf("?%+v\n", recipient)
125+
err = d.slackNotifier.Notify(ctx, &senderproto.Notification{
126+
Type: senderproto.Notification_DemoOrganizationCreation,
127+
DemoOrganizationCreationNotification: &senderproto.DemoOrganizationCreationNotification{
128+
OwnerEmail: organizationCreatedEvent.OwnerEmail,
129+
OrganizationId: organizationCreatedEvent.Id,
130+
OrganizationName: organizationCreatedEvent.Name,
131+
},
132+
}, recipient, recipient.Language)
71133
if err != nil {
72-
d.logger.Error("Failed to send Slack notification",
134+
d.logger.Error("Failed to send notification",
73135
zap.Error(err),
74-
zap.String("eventID", domainEvent.Id),
136+
zap.String("event id", domainEvent.Id),
137+
zap.String("webhookURL", d.demoOrganizationCreationNotifierConfig.SlackWebhookURL),
138+
zap.String("organizationId", organizationCreatedEvent.Id),
75139
)
76140
subscriberHandledCounter.WithLabelValues(
77141
subscriberDemoOrganizationEvent,
@@ -80,16 +144,14 @@ func (d demoOrganizationCreationNotifier) handleMessage(msg *puller.Message) {
80144
msg.Ack()
81145
return
82146
}
147+
fmt.Printf("?2")
148+
subscriberHandledCounter.WithLabelValues(
149+
subscriberDemoOrganizationEvent,
150+
codes.OK.String(),
151+
).Inc()
83152
msg.Ack()
84153
}
85154

86-
func (d demoOrganizationCreationNotifier) SendSlackNotifier(
87-
ctx context.Context,
88-
event *domainevent.Event,
89-
) error {
90-
91-
}
92-
93155
func (d demoOrganizationCreationNotifier) unmarshalMessage(msg *puller.Message) (*domainevent.Event, error) {
94156
event := &domaineventproto.Event{}
95157
err := proto.Unmarshal(msg.Data, event)

0 commit comments

Comments
 (0)