Browse Source

feat: set optional compress image

pull/16/head
Aldino Kemal 4 years ago
parent
commit
6e543c46c4
  1. 3
      docs/openapi.yaml
  2. 3
      src/controllers/send_controller.go
  3. 46
      src/services/send_service_impl.go
  4. 1
      src/structs/send_struct.go
  5. 2
      src/views/index.html

3
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

3
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,
})
}

46
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)
}

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

2
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]

Loading…
Cancel
Save