diff --git a/docs/openapi.yaml b/docs/openapi.yaml index 672fecb..69f745d 100644 --- a/docs/openapi.yaml +++ b/docs/openapi.yaml @@ -516,6 +516,9 @@ paths: type: string example: 'user' description: 'user/group | default: user' + compress: + type: boolean + example: false responses: '200': description: OK diff --git a/src/controllers/send_controller.go b/src/controllers/send_controller.go index 3820c59..a7c28a1 100644 --- a/src/controllers/send_controller.go +++ b/src/controllers/send_controller.go @@ -49,6 +49,8 @@ func (controller *SendController) SendText(c *fiber.Ctx) error { func (controller *SendController) SendImage(c *fiber.Ctx) error { var request structs.SendImageRequest + request.Compress = true + err := c.BodyParser(&request) utils.PanicIfNeeded(err) @@ -133,4 +135,3 @@ func (controller *SendController) SendVideo(c *fiber.Ctx) error { Results: response, }) } - diff --git a/src/services/send_service_impl.go b/src/services/send_service_impl.go index 58f50dd..ef390f7 100644 --- a/src/services/send_service_impl.go +++ b/src/services/send_service_impl.go @@ -48,24 +48,51 @@ func (service SendServiceImpl) SendText(_ *fiber.Ctx, request structs.SendMessag func (service SendServiceImpl) SendImage(c *fiber.Ctx, request structs.SendImageRequest) (response structs.SendImageResponse, err error) { utils.MustLogin(service.WaCli) + var ( + imagePath string + imageThumbnail string + deletedItems []string + ) + // Save image to server oriImagePath := fmt.Sprintf("%s/%s", config.PathSendItems, request.Image.Filename) err = c.SaveFile(request.Image, oriImagePath) if err != nil { return response, err } - // Resize image - openImageBuffer, err := bimg.Read(oriImagePath) - newImage, err := bimg.NewImage(openImageBuffer).Process(bimg.Options{Quality: 90, Width: 600, Embed: true}) + deletedItems = append(deletedItems, oriImagePath) + + // Generate thumbnail with smalled image + openThumbnailBuffer, err := bimg.Read(oriImagePath) + imageThumbnail = fmt.Sprintf("%s/thumbnails-%s", config.PathSendItems, request.Image.Filename) + thumbnailImage, err := bimg.NewImage(openThumbnailBuffer).Process(bimg.Options{Quality: 90, Width: 100, Embed: true}) if err != nil { return response, err } - - newImagePath := fmt.Sprintf("%s/new-%s", config.PathSendItems, request.Image.Filename) - err = bimg.Write(newImagePath, newImage) + err = bimg.Write(imageThumbnail, thumbnailImage) if err != nil { return response, err } + deletedItems = append(deletedItems, imageThumbnail) + + if request.Compress { + // Resize image + openImageBuffer, err := bimg.Read(oriImagePath) + newImage, err := bimg.NewImage(openImageBuffer).Process(bimg.Options{Quality: 90, Width: 600, Embed: true}) + if err != nil { + return response, err + } + + newImagePath := fmt.Sprintf("%s/new-%s", config.PathSendItems, request.Image.Filename) + err = bimg.Write(newImagePath, newImage) + if err != nil { + return response, err + } + deletedItems = append(deletedItems, newImagePath) + imagePath = newImagePath + } else { + imagePath = oriImagePath + } // Send to WA server dataWaCaption := request.Caption @@ -73,7 +100,7 @@ func (service SendServiceImpl) SendImage(c *fiber.Ctx, request structs.SendImage if !ok { return response, errors.New("invalid JID " + request.Phone) } - dataWaImage, err := os.ReadFile(newImagePath) + dataWaImage, err := os.ReadFile(imagePath) if err != nil { return response, err } @@ -82,9 +109,10 @@ func (service SendServiceImpl) SendImage(c *fiber.Ctx, request structs.SendImage fmt.Printf("Failed to upload file: %v", err) return response, err } + dataWaThumbnail, err := os.ReadFile(imageThumbnail) msg := &waProto.Message{ImageMessage: &waProto.ImageMessage{ - JpegThumbnail: newImage, + JpegThumbnail: dataWaThumbnail, Caption: proto.String(dataWaCaption), Url: proto.String(uploadedImage.URL), DirectPath: proto.String(uploadedImage.DirectPath), @@ -97,7 +125,7 @@ func (service SendServiceImpl) SendImage(c *fiber.Ctx, request structs.SendImage }} ts, err := service.WaCli.SendMessage(dataWaRecipient, "", msg) go func() { - errDelete := utils.RemoveFile(0, oriImagePath, newImagePath) + errDelete := utils.RemoveFile(0, deletedItems...) if errDelete != nil { fmt.Println("error when deleting picture: ", errDelete) } diff --git a/src/structs/send_struct.go b/src/structs/send_struct.go index 3ddd2a1..980ee49 100644 --- a/src/structs/send_struct.go +++ b/src/structs/send_struct.go @@ -25,6 +25,7 @@ type SendImageRequest struct { Image *multipart.FileHeader `json:"image" form:"image"` ViewOnce bool `json:"view_once" form:"view_once"` Type SendType `json:"type" form:"type"` + Compress bool `json:"compress"` } type SendImageResponse struct { diff --git a/src/views/index.html b/src/views/index.html index 080add7..aecec57 100644 --- a/src/views/index.html +++ b/src/views/index.html @@ -940,7 +940,7 @@ data() { return { app_host: {{ .AppHost }}, - app_name: 'Whatsapp API Multi Device App ({{ .AppVersion }})' + app_name: 'Whatsapp API Multi Device (v{{ .AppVersion }})' } }, mixins: [login, logout, reconnect, sendMessage, sendImage, sendFile, sendVideo, userGroups, userPrivacy, userAvatar, userInfo]