Browse Source

fix: add omitempty tags to JSON fields to avoid empty values

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
pull/221/head
Aldino Kemal 1 year ago
parent
commit
7bf85f781f
  1. 12
      src/pkg/whatsapp/init.go
  2. 112
      src/pkg/whatsapp/webhook.go

12
src/pkg/whatsapp/init.go

@ -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 {

112
src/pkg/whatsapp/webhook.go

@ -34,33 +34,53 @@ 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)
@ -68,7 +88,24 @@ func createPayload(evt *events.Message) (map[string]interface{}, error) {
}
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)
@ -76,7 +113,8 @@ func createPayload(evt *events.Message) (map[string]interface{}, error) {
}
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)
@ -84,22 +122,6 @@ func createPayload(evt *events.Message) (map[string]interface{}, error) {
}
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
}

Loading…
Cancel
Save