Skip to content

Commit

Permalink
fix: add omitempty tags to JSON fields to avoid empty values
Browse files Browse the repository at this point in the history
refactor(webhook.go): restructure createPayload to check and add fields conditionally, improving clarity and preventing unnecessary fields
refactor(webhook.go): handle media extraction only when media is present, improving readability and maintainability
  • Loading branch information
aldinokemal committed Dec 19, 2024
1 parent c3bd17f commit 7bf85f7
Show file tree
Hide file tree
Showing 2 changed files with 73 additions and 51 deletions.
12 changes: 6 additions & 6 deletions src/pkg/whatsapp/init.go
Original file line number Diff line number Diff line change
Expand Up @@ -38,15 +38,15 @@ type ExtractedMedia struct {
}

type evtReaction struct {
ID string `json:"id"`
Message string `json:"message"`
ID string `json:"id,omitempty"`
Message string `json:"message,omitempty"`
}

type evtMessage struct {
ID string `json:"id"`
Text string `json:"text"`
RepliedId string `json:"replied_id"`
QuotedMessage string `json:"quoted_message"`
ID string `json:"id,omitempty"`
Text string `json:"text,omitempty"`
RepliedId string `json:"replied_id,omitempty"`
QuotedMessage string `json:"quoted_message,omitempty"`
}

func InitWaDB() *sqlstore.Container {
Expand Down
112 changes: 67 additions & 45 deletions src/pkg/whatsapp/webhook.go
Original file line number Diff line number Diff line change
Expand Up @@ -34,72 +34,94 @@ func createPayload(evt *events.Message) (map[string]interface{}, error) {
waReaction := buildEventReaction(evt)
forwarded := buildForwarded(evt)

imageMedia := evt.Message.GetImageMessage()
stickerMedia := evt.Message.GetStickerMessage()
videoMedia := evt.Message.GetVideoMessage()
audioMedia := evt.Message.GetAudioMessage()
documentMedia := evt.Message.GetDocumentMessage()

body := map[string]interface{}{
"audio": audioMedia,
"contact": evt.Message.GetContactMessage(),
"document": documentMedia,
"from": evt.Info.SourceString(),
"image": imageMedia,
"list": evt.Message.GetListMessage(),
"live_location": evt.Message.GetLiveLocationMessage(),
"location": evt.Message.GetLocationMessage(),
"message": message,
"order": evt.Message.GetOrderMessage(),
"pushname": evt.Info.PushName,
"reaction": waReaction,
"sticker": stickerMedia,
"video": videoMedia,
"view_once": evt.IsViewOnce,
"forwarded": forwarded,
"timestamp": evt.Info.Timestamp.Format(time.RFC3339),
}

if imageMedia != nil {
body := make(map[string]interface{})

if from := evt.Info.SourceString(); from != "" {
body["from"] = from
}
if message.Text != "" {
body["message"] = message
}
if pushname := evt.Info.PushName; pushname != "" {
body["pushname"] = pushname
}
if waReaction.Message != "" {
body["reaction"] = waReaction
}
if evt.IsViewOnce {
body["view_once"] = evt.IsViewOnce
}
if forwarded {
body["forwarded"] = forwarded
}
if timestamp := evt.Info.Timestamp.Format(time.RFC3339); timestamp != "" {
body["timestamp"] = timestamp
}

if audioMedia := evt.Message.GetAudioMessage(); audioMedia != nil {
path, err := ExtractMedia(config.PathMedia, audioMedia)
if err != nil {
logrus.Errorf("Failed to download audio from %s: %v", evt.Info.SourceString(), err)
return nil, pkgError.WebhookError(fmt.Sprintf("Failed to download audio: %v", err))
}
body["audio"] = path
}

if contactMessage := evt.Message.GetContactMessage(); contactMessage != nil {
body["contact"] = contactMessage
}

if documentMedia := evt.Message.GetDocumentMessage(); documentMedia != nil {
path, err := ExtractMedia(config.PathMedia, documentMedia)
if err != nil {
logrus.Errorf("Failed to download document from %s: %v", evt.Info.SourceString(), err)
return nil, pkgError.WebhookError(fmt.Sprintf("Failed to download document: %v", err))
}
body["document"] = path
}

if imageMedia := evt.Message.GetImageMessage(); imageMedia != nil {
path, err := ExtractMedia(config.PathMedia, imageMedia)
if err != nil {
logrus.Errorf("Failed to download image from %s: %v", evt.Info.SourceString(), err)
return nil, pkgError.WebhookError(fmt.Sprintf("Failed to download image: %v", err))
}
body["image"] = path
}
if stickerMedia != nil {

if listMessage := evt.Message.GetListMessage(); listMessage != nil {
body["list"] = listMessage
}

if liveLocationMessage := evt.Message.GetLiveLocationMessage(); liveLocationMessage != nil {
body["live_location"] = liveLocationMessage
}

if locationMessage := evt.Message.GetLocationMessage(); locationMessage != nil {
body["location"] = locationMessage
}

if orderMessage := evt.Message.GetOrderMessage(); orderMessage != nil {
body["order"] = orderMessage
}

if stickerMedia := evt.Message.GetStickerMessage(); stickerMedia != nil {
path, err := ExtractMedia(config.PathMedia, stickerMedia)
if err != nil {
logrus.Errorf("Failed to download sticker from %s: %v", evt.Info.SourceString(), err)
return nil, pkgError.WebhookError(fmt.Sprintf("Failed to download sticker: %v", err))
}
body["sticker"] = path
}
if videoMedia != nil {

if videoMedia := evt.Message.GetVideoMessage(); videoMedia != nil {
path, err := ExtractMedia(config.PathMedia, videoMedia)
if err != nil {
logrus.Errorf("Failed to download video from %s: %v", evt.Info.SourceString(), err)
return nil, pkgError.WebhookError(fmt.Sprintf("Failed to download video: %v", err))
}
body["video"] = path
}
if audioMedia != nil {
path, err := ExtractMedia(config.PathMedia, audioMedia)
if err != nil {
logrus.Errorf("Failed to download audio from %s: %v", evt.Info.SourceString(), err)
return nil, pkgError.WebhookError(fmt.Sprintf("Failed to download audio: %v", err))
}
body["audio"] = path
}
if documentMedia != nil {
path, err := ExtractMedia(config.PathMedia, documentMedia)
if err != nil {
logrus.Errorf("Failed to download document from %s: %v", evt.Info.SourceString(), err)
return nil, pkgError.WebhookError(fmt.Sprintf("Failed to download document: %v", err))
}
body["document"] = path
}

return body, nil
}
Expand Down

0 comments on commit 7bf85f7

Please sign in to comment.