Skip to content

Commit

Permalink
fix: add more information in the event notifications
Browse files Browse the repository at this point in the history
Signed-off-by: sarthakjdev <jsarthak448@gmail.com>
  • Loading branch information
sarthakjdev committed Jan 10, 2025
1 parent c3374a1 commit d66fc9e
Show file tree
Hide file tree
Showing 2 changed files with 75 additions and 120 deletions.
161 changes: 52 additions & 109 deletions internal/manager/webhook_manager.go
Original file line number Diff line number Diff line change
Expand Up @@ -102,7 +102,14 @@ func (wh *WebhookManager) PostRequestHandler(c echo.Context) error {
if err := json.Unmarshal(valueBytes, &messageValue); err != nil {
return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid MessagesValue JSON: %v", err))
}
err = wh.handleMessagesSubscriptionEvents(messageValue.Messages, messageValue.Statuses, messageValue.Metadata.PhoneNumberId, entry.Id)

err = wh.handleMessagesSubscriptionEvents(HandleMessageSubscriptionEventPayload{
Messages: messageValue.Messages,
Statuses: messageValue.Statuses,
PhoneNumber: messageValue.Metadata.DisplayPhoneNumber,
BusinessAccountId: entry.Id,
})

if err != nil {
fmt.Println("Error handling messages subscription events:", err)
c.String(500, "Internal server error")
Expand Down Expand Up @@ -294,10 +301,17 @@ func (wh *WebhookManager) ListenToEvents() {
}
}

func (wh *WebhookManager) handleMessagesSubscriptionEvents(messages []Message, statuses []Status, phoneNumberId, businessAccountId string) error {
type HandleMessageSubscriptionEventPayload struct {
Messages []Message `json:"messages"`
Statuses []Status `json:"statuses"`
PhoneNumber string `json:"phone_number_id"` // * this is the phone number to which this event has bee sent to
BusinessAccountId string `json:"business_account_id"` // * business account id to which this event has been sent to
}

func (wh *WebhookManager) handleMessagesSubscriptionEvents(payload HandleMessageSubscriptionEventPayload) error {
// consider the field here too, because we will be supporting more events
if len(statuses) > 0 {
for _, status := range statuses {
if len(payload.Statuses) > 0 {
for _, status := range payload.Statuses {
switch status.Status {
case string(MessageStatusDelivered):
{
Expand Down Expand Up @@ -327,19 +341,32 @@ func (wh *WebhookManager) handleMessagesSubscriptionEvents(messages []Message, s
}
}

for _, message := range messages {
for _, message := range payload.Messages {

var repliedTo string

if message.Context.Id != "" {
repliedTo = message.Context.Id
}

baseMessageEvent := events.NewBaseMessageEvent(events.BaseMessageEventParams{
BusinessAccountId: payload.BusinessAccountId,
MessageId: message.Id,
PhoneNumber: payload.PhoneNumber,
Timestamp: message.Timestamp,
From: message.From,
IsForwarded: message.Context.Forwarded,
Context: events.MessageContext{
RepliedToMessageId: repliedTo,
},
Requester: wh.Requester,
})

switch message.Type {
case NotificationMessageTypeText:
{
wh.EventManager.Publish(events.TextMessageEventType, events.NewTextMessageEvent(
events.NewBaseMessageEvent(
businessAccountId,
phoneNumberId,
message.Id,
message.Timestamp,
message.From,
message.Context.Forwarded,
wh.Requester),
baseMessageEvent,
message.Text.Body),
)
}
Expand All @@ -357,14 +384,7 @@ func (wh *WebhookManager) handleMessagesSubscriptionEvents(messages []Message, s
}

wh.EventManager.Publish(events.ImageMessageEventType, events.NewImageMessageEvent(
events.NewBaseMessageEvent(
businessAccountId,
phoneNumberId,
message.Id,
message.Timestamp,
message.From,
message.Context.Forwarded,
wh.Requester),
baseMessageEvent,
*imageMessageComponent,
message.Image.MIMEType, message.Image.SHA256, message.Image.Id),
)
Expand All @@ -383,14 +403,7 @@ func (wh *WebhookManager) handleMessagesSubscriptionEvents(messages []Message, s
}

wh.EventManager.Publish(events.AudioMessageEventType, events.NewAudioMessageEvent(
events.NewBaseMessageEvent(
businessAccountId,
phoneNumberId,
message.Id,
message.Timestamp,
message.From,
message.Context.Forwarded,
wh.Requester),
baseMessageEvent,
*audioMessageComponent,
message.Audio.MIMEType, message.Audio.SHA256, message.Audio.Id),
)
Expand All @@ -411,14 +424,7 @@ func (wh *WebhookManager) handleMessagesSubscriptionEvents(messages []Message, s
}

wh.EventManager.Publish(events.VideoMessageEventType, events.NewVideoMessageEvent(
events.NewBaseMessageEvent(
businessAccountId,
phoneNumberId,
message.Id,
message.Timestamp,
message.From,
message.Context.Forwarded,
wh.Requester),
baseMessageEvent,
*videoMessageComponent,
message.Video.MIMEType, message.Video.SHA256, message.Video.Id),
)
Expand All @@ -438,14 +444,7 @@ func (wh *WebhookManager) handleMessagesSubscriptionEvents(messages []Message, s
}

wh.EventManager.Publish(events.DocumentMessageEventType, events.NewVideoMessageEvent(
events.NewBaseMessageEvent(
businessAccountId,
phoneNumberId,
message.Id,
message.Timestamp,
message.From,
message.Context.Forwarded,
wh.Requester),
baseMessageEvent,
*documentMessageComponent,
message.Document.MIMEType, message.Document.SHA256, message.Document.Id),
)
Expand All @@ -461,28 +460,14 @@ func (wh *WebhookManager) handleMessagesSubscriptionEvents(messages []Message, s
}

wh.EventManager.Publish(events.LocationMessageEventType, events.NewLocationMessageEvent(
events.NewBaseMessageEvent(
businessAccountId,
phoneNumberId,
message.Id,
message.Timestamp,
message.From,
message.Context.Forwarded,
wh.Requester),
baseMessageEvent,
*locationMessageComponent),
)
}
case NotificationMessageTypeContacts:
{
wh.EventManager.Publish(events.ContactMessageEventType, events.NewTextMessageEvent(
events.NewBaseMessageEvent(
businessAccountId,
phoneNumberId,
message.Id,
message.Timestamp,
message.From,
message.Context.Forwarded,
wh.Requester),
baseMessageEvent,
message.Text.Body),
)
}
Expand All @@ -500,14 +485,7 @@ func (wh *WebhookManager) handleMessagesSubscriptionEvents(messages []Message, s
}

wh.EventManager.Publish(events.StickerMessageEventType, events.NewStickerMessageEvent(
events.NewBaseMessageEvent(
businessAccountId,
phoneNumberId,
message.Id,
message.Timestamp,
message.From,
message.Context.Forwarded,
wh.Requester),
baseMessageEvent,
*stickerMessageComponent,
message.Sticker.MIMEType, message.Sticker.SHA256, message.Sticker.Id),
)
Expand All @@ -516,14 +494,7 @@ func (wh *WebhookManager) handleMessagesSubscriptionEvents(messages []Message, s
case NotificationMessageTypeButton:
{
wh.EventManager.Publish(events.QuickReplyMessageEventType, events.NewQuickReplyButtonInteractionEvent(
events.NewBaseMessageEvent(
businessAccountId,
phoneNumberId,
message.Id,
message.Timestamp,
message.From,
message.Context.Forwarded,
wh.Requester),
baseMessageEvent,
message.Button.Text,
message.Button.Payload,
))
Expand All @@ -532,28 +503,14 @@ func (wh *WebhookManager) handleMessagesSubscriptionEvents(messages []Message, s
{
if message.Interactive.Type == "list" {
wh.EventManager.Publish(events.ListInteractionMessageEventType, events.NewListInteractionEvent(
events.NewBaseMessageEvent(
businessAccountId,
phoneNumberId,
message.Id,
message.Timestamp,
message.From,
message.Context.Forwarded,
wh.Requester),
baseMessageEvent,
message.Interactive.ListReply.Title,
message.Interactive.ListReply.Id,
message.Interactive.ListReply.Description,
))
} else {
wh.EventManager.Publish(events.ReplyButtonInteractionEventType, events.NewReplyButtonInteractionEvent(
events.NewBaseMessageEvent(
businessAccountId,
phoneNumberId,
message.Id,
message.Timestamp,
message.From,
message.Context.Forwarded,
wh.Requester),
baseMessageEvent,
message.Interactive.ButtonReply.Title,
message.Interactive.ButtonReply.ReplyId,
))
Expand All @@ -573,28 +530,14 @@ func (wh *WebhookManager) handleMessagesSubscriptionEvents(messages []Message, s
}

wh.EventManager.Publish(events.ReactionMessageEventType, events.NewReactionMessageEvent(
events.NewBaseMessageEvent(
businessAccountId,
phoneNumberId,
message.Id,
message.Timestamp,
message.From,
message.Context.Forwarded,
wh.Requester),
baseMessageEvent,
*reactionMessageComponent,
))
}
case NotificationMessageTypeOrder:
{
wh.EventManager.Publish(events.OrderReceivedEventType, events.NewTextMessageEvent(
events.NewBaseMessageEvent(
businessAccountId,
phoneNumberId,
message.Id,
message.Timestamp,
message.From,
message.Context.Forwarded,
wh.Requester),
baseMessageEvent,
message.Text.Body),
)
}
Expand Down
34 changes: 23 additions & 11 deletions pkg/events/base_event.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import (
)

type MessageContext struct {
From string `json:"from"`
RepliedToMessageId string `json:"replied_to_message_id"`
}

type BaseEvent interface {
Expand All @@ -34,22 +34,34 @@ type BaseMessageEvent struct {
BusinessAccountId string `json:"business_account_id"`
requester request_client.RequestClient
MessageId string `json:"message_id"`
From string `json:"from"`
Context MessageContext `json:"context"`
Timestamp string `json:"timestamp"`
IsForwarded bool `json:"is_forwarded"`
PhoneNumber string `json:"phone_number"`
}

func NewBaseMessageEvent(businessAccountId, messageId, phoneNumber, timestamp, from string, isForwarded bool, requester request_client.RequestClient) BaseMessageEvent {
type BaseMessageEventParams struct {
BusinessAccountId string
MessageId string
PhoneNumber string
Timestamp string
From string // * whatsapp account id of the user who sent the message
IsForwarded bool
Context MessageContext // * this context will not be present if in case a message is a reply to another message
Requester request_client.RequestClient
}

func NewBaseMessageEvent(params BaseMessageEventParams) BaseMessageEvent {
return BaseMessageEvent{
MessageId: messageId,
Context: MessageContext{
From: from,
},
requester: requester,
Timestamp: timestamp,
IsForwarded: isForwarded,
PhoneNumber: phoneNumber,
MessageId: params.MessageId,
Context: params.Context,
requester: params.Requester,
Timestamp: params.Timestamp,
IsForwarded: params.IsForwarded,
PhoneNumber: params.PhoneNumber,
BusinessAccountId: params.BusinessAccountId,
From: params.From,
}
}

Expand All @@ -60,7 +72,7 @@ func (bme BaseMessageEvent) GetEventType() string {
// Reply to the message
func (baseMessageEvent *BaseMessageEvent) Reply(Message components.BaseMessage) (string, error) {
body, err := Message.ToJson(components.ApiCompatibleJsonConverterConfigs{
SendToPhoneNumber: baseMessageEvent.Context.From,
SendToPhoneNumber: baseMessageEvent.From,
ReplyToMessageId: baseMessageEvent.MessageId,
})

Expand Down

0 comments on commit d66fc9e

Please sign in to comment.