From b534a45e5c35d43b6607165b73288167812e8443 Mon Sep 17 00:00:00 2001 From: 0oAstro <79555780+0oAstro@users.noreply.github.com> Date: Tue, 21 Jan 2025 17:57:05 +0530 Subject: [PATCH] fix: json --- src/domains/send/audio.go | 2 +- src/domains/send/file.go | 2 +- src/domains/send/image.go | 2 +- src/domains/send/video.go | 2 +- src/internal/rest/send.go | 193 ++++++++++++++++++++++++++++++-------- src/main.go | 4 + 6 files changed, 160 insertions(+), 45 deletions(-) diff --git a/src/domains/send/audio.go b/src/domains/send/audio.go index f2e5063..48fb554 100644 --- a/src/domains/send/audio.go +++ b/src/domains/send/audio.go @@ -4,5 +4,5 @@ import "mime/multipart" type AudioRequest struct { Phone string `json:"phone" form:"phone"` - Audio *multipart.FileHeader `json:"Audio" form:"Audio"` + Audio *multipart.FileHeader `json:"-" form:"audio"` // Ignore in JSON } diff --git a/src/domains/send/file.go b/src/domains/send/file.go index e0bcab6..0274726 100644 --- a/src/domains/send/file.go +++ b/src/domains/send/file.go @@ -4,7 +4,7 @@ import "mime/multipart" type FileRequest struct { Phone string `json:"phone" form:"phone"` - File *multipart.FileHeader `json:"file" form:"file"` + File *multipart.FileHeader `json:"-" form:"file"` // Ignore in JSON Caption string `json:"caption" form:"caption"` FileUrl string `json:"file_url" form:"file_url"` } diff --git a/src/domains/send/image.go b/src/domains/send/image.go index 19c7c70..79f0993 100644 --- a/src/domains/send/image.go +++ b/src/domains/send/image.go @@ -4,8 +4,8 @@ import "mime/multipart" type ImageRequest struct { Phone string `json:"phone" form:"phone"` + Image *multipart.FileHeader `json:"-" form:"image"` // Ignore in JSON Caption string `json:"caption" form:"caption"` - Image *multipart.FileHeader `json:"image" form:"image"` ImageUrl string `json:"image_url" form:"image_url"` ViewOnce bool `json:"view_once" form:"view_once"` Compress bool `json:"compress"` diff --git a/src/domains/send/video.go b/src/domains/send/video.go index 9a83c0b..94eabea 100644 --- a/src/domains/send/video.go +++ b/src/domains/send/video.go @@ -5,7 +5,7 @@ import "mime/multipart" type VideoRequest struct { Phone string `json:"phone" form:"phone"` Caption string `json:"caption" form:"caption"` - Video *multipart.FileHeader `json:"video" form:"video"` + Video *multipart.FileHeader `json:"-" form:"video"` // Ignore in JSON ViewOnce bool `json:"view_once" form:"view_once"` Compress bool `json:"compress"` VideoUrl string `json:"video_url" form:"video_url"` diff --git a/src/internal/rest/send.go b/src/internal/rest/send.go index de576ee..852ab8f 100644 --- a/src/internal/rest/send.go +++ b/src/internal/rest/send.go @@ -45,28 +45,45 @@ func (controller *Send) SendText(c *fiber.Ctx) error { } func (controller *Send) SendImage(c *fiber.Ctx) error { + logrus.Debug("Starting SendImage handler") + var request domainSend.ImageRequest request.Compress = true - - err := c.BodyParser(&request) - utils.PanicIfNeeded(err) - - // Add debug logging - logrus.WithFields(logrus.Fields{ - "body": c.Body(), - "form": c.FormValue("image_url"), - }).Debug("Image request received") - - request.ImageUrl = c.FormValue("image_url") - if request.ImageUrl == "" { - if file, err := c.FormFile("image"); err == nil { - request.Image = file - logrus.WithField("filename", file.Filename).Debug("Image file received") - } else { - logrus.WithError(err).Debug("No image file found") + + if isJsonRequest(c) { + logrus.Debug("Processing JSON request") + if err := c.BodyParser(&request); err != nil { + logrus.WithError(err).Error("Failed to parse JSON body") + return fiber.NewError(fiber.StatusBadRequest, "Invalid JSON body") } } else { - logrus.WithField("url", request.ImageUrl).Debug("Image URL received") + logrus.Debug("Processing multipart form request") + if err := c.BodyParser(&request); err != nil { + logrus.WithError(err).Error("Failed to parse form body") + return fiber.NewError(fiber.StatusBadRequest, "Invalid form body") + } + + request.ImageUrl = c.FormValue("image_url") + if request.ImageUrl == "" { + if file, err := c.FormFile("image"); err == nil { + request.Image = file + logrus.WithField("filename", file.Filename).Debug("Image file received") + } + } + } + + logrus.WithFields(logrus.Fields{ + "content_type": c.Get("Content-Type"), + "phone": request.Phone, + "image_url": request.ImageUrl, + "has_image": request.Image != nil, + "caption": request.Caption, + "view_once": request.ViewOnce, + "compress": request.Compress, + }).Debug("Request details") + + if request.ImageUrl == "" && request.Image == nil { + return fiber.NewError(fiber.StatusBadRequest, "Either image or image_url must be provided") } whatsapp.SanitizePhone(&request.Phone) @@ -74,7 +91,7 @@ func (controller *Send) SendImage(c *fiber.Ctx) error { response, err := controller.Service.SendImage(c.UserContext(), request) if err != nil { logrus.WithError(err).Error("Failed to send image") - return err + return fiber.NewError(fiber.StatusInternalServerError, "Failed to send image: " + err.Error()) } return c.JSON(utils.ResponseData{ @@ -85,22 +102,62 @@ func (controller *Send) SendImage(c *fiber.Ctx) error { }) } +func isJsonRequest(c *fiber.Ctx) bool { + return c.Get("Content-Type") == "application/json" +} + func (controller *Send) SendFile(c *fiber.Ctx) error { + logrus.Debug("Starting SendFile handler") + var request domainSend.FileRequest - err := c.BodyParser(&request) - utils.PanicIfNeeded(err) - - request.FileUrl = c.FormValue("file_url") - if request.FileUrl == "" { - if file, err := c.FormFile("file"); err == nil { - request.File = file + + // Handle based on content type + if isJsonRequest(c) { + logrus.Debug("Processing JSON request") + if err := c.BodyParser(&request); err != nil { + logrus.WithError(err).Error("Failed to parse JSON body") + return fiber.NewError(fiber.StatusBadRequest, "Invalid JSON body") + } + } else { + logrus.Debug("Processing multipart form request") + if err := c.BodyParser(&request); err != nil { + logrus.WithError(err).Error("Failed to parse form body") + return fiber.NewError(fiber.StatusBadRequest, "Invalid form body") } + + // Handle form-specific fields + request.FileUrl = c.FormValue("file_url") + if request.FileUrl == "" { + file, err := c.FormFile("file") + if err == nil { + request.File = file + } + } + } + + logrus.WithFields(logrus.Fields{ + "content_type": c.Get("Content-Type"), + "phone": request.Phone, + "file_url": request.FileUrl, + "has_file": request.File != nil, + }).Debug("Request details") + + // Validate request + if request.FileUrl == "" && request.File == nil { + return fiber.NewError(fiber.StatusBadRequest, "Either file or file_url must be provided") } + + logrus.Debug("Sanitizing phone number") whatsapp.SanitizePhone(&request.Phone) + logrus.WithField("phone", request.Phone).Debug("Sending file") response, err := controller.Service.SendFile(c.UserContext(), request) - utils.PanicIfNeeded(err) + if err != nil { + logrus.WithError(err).Error("Service.SendFile failed") + return fiber.NewError(fiber.StatusInternalServerError, "Failed to send file: " + err.Error()) + } + logrus.WithField("message_id", response.MessageID).Debug("File sent successfully") return c.JSON(utils.ResponseData{ Status: 200, Code: "SUCCESS", @@ -111,19 +168,47 @@ func (controller *Send) SendFile(c *fiber.Ctx) error { func (controller *Send) SendVideo(c *fiber.Ctx) error { var request domainSend.VideoRequest - err := c.BodyParser(&request) - utils.PanicIfNeeded(err) - - request.VideoUrl = c.FormValue("video_url") - if request.VideoUrl == "" { - if video, err := c.FormFile("video"); err == nil { - request.Video = video + + if isJsonRequest(c) { + logrus.Debug("Processing JSON request") + if err := c.BodyParser(&request); err != nil { + logrus.WithError(err).Error("Failed to parse JSON body") + return fiber.NewError(fiber.StatusBadRequest, "Invalid JSON body") + } + } else { + logrus.Debug("Processing multipart form request") + if err := c.BodyParser(&request); err != nil { + logrus.WithError(err).Error("Failed to parse form body") + return fiber.NewError(fiber.StatusBadRequest, "Invalid form body") + } + + request.VideoUrl = c.FormValue("video_url") + if request.VideoUrl == "" { + video, err := c.FormFile("video") + if err == nil { + request.Video = video + } } } + + logrus.WithFields(logrus.Fields{ + "content_type": c.Get("Content-Type"), + "phone": request.Phone, + "video_url": request.VideoUrl, + "has_video": request.Video != nil, + }).Debug("Request details") + + if request.VideoUrl == "" && request.Video == nil { + return fiber.NewError(fiber.StatusBadRequest, "Either video or video_url must be provided") + } + whatsapp.SanitizePhone(&request.Phone) response, err := controller.Service.SendVideo(c.UserContext(), request) - utils.PanicIfNeeded(err) + if err != nil { + logrus.WithError(err).Error("Failed to send video") + return err + } return c.JSON(utils.ResponseData{ Status: 200, @@ -189,17 +274,43 @@ func (controller *Send) SendLocation(c *fiber.Ctx) error { func (controller *Send) SendAudio(c *fiber.Ctx) error { var request domainSend.AudioRequest - err := c.BodyParser(&request) - utils.PanicIfNeeded(err) + + if isJsonRequest(c) { + logrus.Debug("Processing JSON request") + if err := c.BodyParser(&request); err != nil { + logrus.WithError(err).Error("Failed to parse JSON body") + return fiber.NewError(fiber.StatusBadRequest, "Invalid JSON body") + } + } else { + logrus.Debug("Processing multipart form request") + if err := c.BodyParser(&request); err != nil { + logrus.WithError(err).Error("Failed to parse form body") + return fiber.NewError(fiber.StatusBadRequest, "Invalid form body") + } + + audio, err := c.FormFile("audio") + if err == nil { + request.Audio = audio + } + } - audio, err := c.FormFile("audio") - utils.PanicIfNeeded(err) + logrus.WithFields(logrus.Fields{ + "content_type": c.Get("Content-Type"), + "phone": request.Phone, + "has_audio": request.Audio != nil, + }).Debug("Request details") + + if request.Audio == nil { + return fiber.NewError(fiber.StatusBadRequest, "Audio file must be provided") + } - request.Audio = audio whatsapp.SanitizePhone(&request.Phone) response, err := controller.Service.SendAudio(c.UserContext(), request) - utils.PanicIfNeeded(err) + if err != nil { + logrus.WithError(err).Error("Failed to send audio") + return err + } return c.JSON(utils.ResponseData{ Status: 200, diff --git a/src/main.go b/src/main.go index 2441d04..bc7db08 100644 --- a/src/main.go +++ b/src/main.go @@ -2,7 +2,9 @@ package main import ( "embed" + "github.com/aldinokemal/go-whatsapp-web-multidevice/cmd" + "github.com/sirupsen/logrus" ) //go:embed views/index.html @@ -12,5 +14,7 @@ var embedIndex embed.FS var embedViews embed.FS func main() { + // Set debug logging by default + logrus.SetLevel(logrus.DebugLevel) cmd.Execute(embedIndex, embedViews) }