Browse Source

feat: remove send group

feat: remove type in send payload
pull/36/head
Aldino Kemal 3 years ago
parent
commit
4f8bcdc36c
  1. 1
      src/domains/send/contact.go
  2. 1
      src/domains/send/file.go
  3. 1
      src/domains/send/image.go
  4. 1
      src/domains/send/link.go
  5. 2
      src/domains/send/message.go
  6. 5
      src/domains/send/send.go
  7. 1
      src/domains/send/text.go
  8. 1
      src/domains/send/video.go
  9. 2
      src/internal/rest/app_rest.go
  10. 39
      src/internal/rest/send_rest.go
  11. 4
      src/internal/rest/user_rest.go
  12. 2
      src/utils/errors.go
  13. 6
      src/utils/response.go
  14. 2
      src/utils/whatsapp.go
  15. 17
      src/validations/send_validation.go
  16. 4
      src/validations/send_validation_test.go
  17. 5
      src/validations/user_validation.go
  18. 317
      src/views/index.html

1
src/domains/send/contact.go

@ -4,7 +4,6 @@ type ContactRequest struct {
Phone string `json:"phone" form:"phone"` Phone string `json:"phone" form:"phone"`
ContactName string `json:"contact_name" form:"contact_name"` ContactName string `json:"contact_name" form:"contact_name"`
ContactPhone string `json:"contact_phone" form:"contact_phone"` ContactPhone string `json:"contact_phone" form:"contact_phone"`
Type Type `json:"type" form:"type"`
} }
type ContactResponse struct { type ContactResponse struct {

1
src/domains/send/file.go

@ -5,7 +5,6 @@ import "mime/multipart"
type FileRequest struct { type FileRequest struct {
Phone string `json:"phone" form:"phone"` Phone string `json:"phone" form:"phone"`
File *multipart.FileHeader `json:"file" form:"file"` File *multipart.FileHeader `json:"file" form:"file"`
Type Type `json:"type" form:"type"`
} }
type FileResponse struct { type FileResponse struct {

1
src/domains/send/image.go

@ -7,7 +7,6 @@ type ImageRequest struct {
Caption string `json:"caption" form:"caption"` Caption string `json:"caption" form:"caption"`
Image *multipart.FileHeader `json:"image" form:"image"` Image *multipart.FileHeader `json:"image" form:"image"`
ViewOnce bool `json:"view_once" form:"view_once"` ViewOnce bool `json:"view_once" form:"view_once"`
Type Type `json:"type" form:"type"`
Compress bool `json:"compress"` Compress bool `json:"compress"`
} }

1
src/domains/send/link.go

@ -4,7 +4,6 @@ type LinkRequest struct {
Phone string `json:"phone" form:"phone"` Phone string `json:"phone" form:"phone"`
Caption string `json:"caption"` Caption string `json:"caption"`
Link string `json:"link"` Link string `json:"link"`
Type Type `json:"type" form:"type"`
} }
type LinkResponse struct { type LinkResponse struct {

2
src/domains/send/message.go

@ -3,7 +3,6 @@ package send
type RevokeRequest struct { type RevokeRequest struct {
MessageID string `json:"message_id" uri:"message_id"` MessageID string `json:"message_id" uri:"message_id"`
Phone string `json:"phone" form:"phone"` Phone string `json:"phone" form:"phone"`
Type Type `json:"type" form:"type"`
} }
type RevokeResponse struct { type RevokeResponse struct {
@ -15,7 +14,6 @@ type UpdateMessageRequest struct {
MessageID string `json:"message_id" uri:"message_id"` MessageID string `json:"message_id" uri:"message_id"`
Message string `json:"message" form:"message"` Message string `json:"message" form:"message"`
Phone string `json:"phone" form:"phone"` Phone string `json:"phone" form:"phone"`
Type Type `json:"type" form:"type"`
} }
type UpdateMessageResponse struct { type UpdateMessageResponse struct {

5
src/domains/send/send.go

@ -4,11 +4,6 @@ import (
"context" "context"
) )
type Type string
const TypeUser Type = "user"
const TypeGroup Type = "group"
type ISendService interface { type ISendService interface {
SendText(ctx context.Context, request MessageRequest) (response MessageResponse, err error) SendText(ctx context.Context, request MessageRequest) (response MessageResponse, err error)
SendImage(ctx context.Context, request ImageRequest) (response ImageResponse, err error) SendImage(ctx context.Context, request ImageRequest) (response ImageResponse, err error)

1
src/domains/send/text.go

@ -3,7 +3,6 @@ package send
type MessageRequest struct { type MessageRequest struct {
Phone string `json:"phone" form:"phone"` Phone string `json:"phone" form:"phone"`
Message string `json:"message" form:"message"` Message string `json:"message" form:"message"`
Type Type `json:"type" form:"type"`
} }
type MessageResponse struct { type MessageResponse struct {

1
src/domains/send/video.go

@ -6,7 +6,6 @@ type VideoRequest struct {
Phone string `json:"phone" form:"phone"` Phone string `json:"phone" form:"phone"`
Caption string `json:"caption" form:"caption"` Caption string `json:"caption" form:"caption"`
Video *multipart.FileHeader `json:"video" form:"video"` Video *multipart.FileHeader `json:"video" form:"video"`
Type Type `json:"type" form:"type"`
ViewOnce bool `json:"view_once" form:"view_once"` ViewOnce bool `json:"view_once" form:"view_once"`
Compress bool `json:"compress"` Compress bool `json:"compress"`
} }

2
src/internal/rest/app_rest.go

@ -28,7 +28,7 @@ func (controller *App) Login(c *fiber.Ctx) error {
return c.JSON(utils.ResponseData{ return c.JSON(utils.ResponseData{
Code: 200, Code: 200,
Message: "Success", Message: "Success",
Results: map[string]interface{}{
Results: map[string]any{
"qr_link": fmt.Sprintf("%s://%s/%s", c.Protocol(), c.Hostname(), response.ImagePath), "qr_link": fmt.Sprintf("%s://%s/%s", c.Protocol(), c.Hostname(), response.ImagePath),
"qr_duration": response.Duration, "qr_duration": response.Duration,
}, },

39
src/internal/rest/send_rest.go

@ -1,7 +1,6 @@
package rest package rest
import ( import (
"fmt"
domainSend "github.com/aldinokemal/go-whatsapp-web-multidevice/domains/send" domainSend "github.com/aldinokemal/go-whatsapp-web-multidevice/domains/send"
"github.com/aldinokemal/go-whatsapp-web-multidevice/utils" "github.com/aldinokemal/go-whatsapp-web-multidevice/utils"
"github.com/aldinokemal/go-whatsapp-web-multidevice/validations" "github.com/aldinokemal/go-whatsapp-web-multidevice/validations"
@ -33,12 +32,6 @@ func (controller *Send) SendText(c *fiber.Ctx) error {
// add validation send message // add validation send message
validations.ValidateSendMessage(request) validations.ValidateSendMessage(request)
if request.Type == domainSend.TypeGroup {
request.Phone = request.Phone + "@g.us"
} else {
request.Phone = request.Phone + "@s.whatsapp.net"
}
response, err := controller.Service.SendText(c.UserContext(), request) response, err := controller.Service.SendText(c.UserContext(), request)
utils.PanicIfNeeded(err) utils.PanicIfNeeded(err)
@ -64,12 +57,6 @@ func (controller *Send) SendImage(c *fiber.Ctx) error {
//add validation send image //add validation send image
validations.ValidateSendImage(request) validations.ValidateSendImage(request)
if request.Type == domainSend.TypeGroup {
request.Phone = request.Phone + "@g.us"
} else {
request.Phone = request.Phone + "@s.whatsapp.net"
}
response, err := controller.Service.SendImage(c.UserContext(), request) response, err := controller.Service.SendImage(c.UserContext(), request)
utils.PanicIfNeeded(err) utils.PanicIfNeeded(err)
@ -93,12 +80,6 @@ func (controller *Send) SendFile(c *fiber.Ctx) error {
//add validation send image //add validation send image
validations.ValidateSendFile(request) validations.ValidateSendFile(request)
if request.Type == domainSend.TypeGroup {
request.Phone = request.Phone + "@g.us"
} else {
request.Phone = request.Phone + "@s.whatsapp.net"
}
response, err := controller.Service.SendFile(c.UserContext(), request) response, err := controller.Service.SendFile(c.UserContext(), request)
utils.PanicIfNeeded(err) utils.PanicIfNeeded(err)
@ -122,12 +103,6 @@ func (controller *Send) SendVideo(c *fiber.Ctx) error {
//add validation send image //add validation send image
validations.ValidateSendVideo(request) validations.ValidateSendVideo(request)
if request.Type == domainSend.TypeGroup {
request.Phone = request.Phone + "@g.us"
} else {
request.Phone = request.Phone + "@s.whatsapp.net"
}
response, err := controller.Service.SendVideo(c.UserContext(), request) response, err := controller.Service.SendVideo(c.UserContext(), request)
utils.PanicIfNeeded(err) utils.PanicIfNeeded(err)
@ -146,12 +121,6 @@ func (controller *Send) SendContact(c *fiber.Ctx) error {
// add validation send contect // add validation send contect
validations.ValidateSendContact(request) validations.ValidateSendContact(request)
if request.Type == domainSend.TypeGroup {
request.Phone = request.Phone + "@g.us"
} else {
request.Phone = request.Phone + "@s.whatsapp.net"
}
response, err := controller.Service.SendContact(c.UserContext(), request) response, err := controller.Service.SendContact(c.UserContext(), request)
utils.PanicIfNeeded(err) utils.PanicIfNeeded(err)
@ -170,12 +139,6 @@ func (controller *Send) SendLink(c *fiber.Ctx) error {
err = validations.ValidateSendLink(request) err = validations.ValidateSendLink(request)
utils.PanicIfNeeded(err) utils.PanicIfNeeded(err)
if request.Type == domainSend.TypeGroup {
request.Phone = request.Phone + "@g.us"
} else {
request.Phone = request.Phone + "@s.whatsapp.net"
}
response, err := controller.Service.SendLink(c.UserContext(), request) response, err := controller.Service.SendLink(c.UserContext(), request)
utils.PanicIfNeeded(err) utils.PanicIfNeeded(err)
@ -194,7 +157,6 @@ func (controller *Send) RevokeMessage(c *fiber.Ctx) error {
err = validations.ValidateRevokeMessage(request) err = validations.ValidateRevokeMessage(request)
utils.PanicIfNeeded(err) utils.PanicIfNeeded(err)
fmt.Println(request)
response, err := controller.Service.Revoke(c.UserContext(), request) response, err := controller.Service.Revoke(c.UserContext(), request)
utils.PanicIfNeeded(err) utils.PanicIfNeeded(err)
@ -214,7 +176,6 @@ func (controller *Send) UpdateMessage(c *fiber.Ctx) error {
err = validations.ValidateUpdateMessage(request) err = validations.ValidateUpdateMessage(request)
utils.PanicIfNeeded(err) utils.PanicIfNeeded(err)
fmt.Println(request)
response, err := controller.Service.UpdateMessage(c.UserContext(), request) response, err := controller.Service.UpdateMessage(c.UserContext(), request)
utils.PanicIfNeeded(err) utils.PanicIfNeeded(err)

4
src/internal/rest/user_rest.go

@ -35,8 +35,7 @@ func (controller *User) UserInfo(c *fiber.Ctx) error {
// add validation send message // add validation send message
validations.ValidateUserInfo(request) validations.ValidateUserInfo(request)
request.Phone = request.Phone + "@s.whatsapp.net"
response, err := controller.Service.Info(c.Context(), request) response, err := controller.Service.Info(c.Context(), request)
utils.PanicIfNeeded(err) utils.PanicIfNeeded(err)
@ -55,7 +54,6 @@ func (controller *User) UserAvatar(c *fiber.Ctx) error {
// add validation send message // add validation send message
validations.ValidateUserAvatar(request) validations.ValidateUserAvatar(request)
request.Phone = request.Phone + "@s.whatsapp.net"
response, err := controller.Service.Avatar(c.Context(), request) response, err := controller.Service.Avatar(c.Context(), request)
utils.PanicIfNeeded(err) utils.PanicIfNeeded(err)

2
src/utils/errors.go

@ -2,7 +2,7 @@ package utils
import "fmt" import "fmt"
func PanicIfNeeded(err interface{}, message ...string) {
func PanicIfNeeded(err any, message ...string) {
if err != nil { if err != nil {
if fmt.Sprintf("%s", err) == "record not found" && len(message) > 0 { if fmt.Sprintf("%s", err) == "record not found" && len(message) > 0 {
panic(message[0]) panic(message[0])

6
src/utils/response.go

@ -1,7 +1,7 @@
package utils package utils
type ResponseData struct { type ResponseData struct {
Code int `json:"code"`
Message string `json:"message"`
Results interface{} `json:"results"`
Code int `json:"code"`
Message string `json:"message"`
Results any `json:"results"`
} }

2
src/utils/whatsapp.go

@ -238,7 +238,7 @@ func handler(rawEvt interface{}) {
func sendAutoReplyWebhook(evt *events.Message) error { func sendAutoReplyWebhook(evt *events.Message) error {
client := &http.Client{Timeout: 10 * time.Second} client := &http.Client{Timeout: 10 * time.Second}
body := map[string]interface{}{
body := map[string]any{
"from": evt.Info.SourceString(), "from": evt.Info.SourceString(),
"message": evt.Message.GetConversation(), "message": evt.Message.GetConversation(),
"image": evt.Message.GetImageMessage(), "image": evt.Message.GetImageMessage(),

17
src/validations/send_validation.go

@ -11,8 +11,7 @@ import (
func ValidateSendMessage(request domainSend.MessageRequest) { func ValidateSendMessage(request domainSend.MessageRequest) {
err := validation.ValidateStruct(&request, err := validation.ValidateStruct(&request,
validation.Field(&request.Phone, validation.Required, validation.Length(10, 25)),
validation.Field(&request.Message, validation.Required, validation.Length(1, 1000)),
validation.Field(&request.Message, validation.Required),
) )
if err != nil { if err != nil {
@ -24,8 +23,6 @@ func ValidateSendMessage(request domainSend.MessageRequest) {
func ValidateSendImage(request domainSend.ImageRequest) { func ValidateSendImage(request domainSend.ImageRequest) {
err := validation.ValidateStruct(&request, err := validation.ValidateStruct(&request,
validation.Field(&request.Phone, validation.Required, validation.Length(10, 25)),
validation.Field(&request.Caption, validation.When(true, validation.Length(1, 1000))),
validation.Field(&request.Image, validation.Required), validation.Field(&request.Image, validation.Required),
) )
@ -50,7 +47,6 @@ func ValidateSendImage(request domainSend.ImageRequest) {
func ValidateSendFile(request domainSend.FileRequest) { func ValidateSendFile(request domainSend.FileRequest) {
err := validation.ValidateStruct(&request, err := validation.ValidateStruct(&request,
validation.Field(&request.Phone, validation.Required, validation.Length(10, 25)),
validation.Field(&request.File, validation.Required), validation.Field(&request.File, validation.Required),
) )
@ -70,7 +66,6 @@ func ValidateSendFile(request domainSend.FileRequest) {
func ValidateSendVideo(request domainSend.VideoRequest) { func ValidateSendVideo(request domainSend.VideoRequest) {
err := validation.ValidateStruct(&request, err := validation.ValidateStruct(&request,
validation.Field(&request.Phone, validation.Required, validation.Length(10, 25)),
validation.Field(&request.Video, validation.Required), validation.Field(&request.Video, validation.Required),
) )
@ -102,7 +97,6 @@ func ValidateSendVideo(request domainSend.VideoRequest) {
func ValidateSendContact(request domainSend.ContactRequest) { func ValidateSendContact(request domainSend.ContactRequest) {
err := validation.ValidateStruct(&request, err := validation.ValidateStruct(&request,
validation.Field(&request.Phone, validation.Required, validation.Length(10, 25)),
validation.Field(&request.ContactName, validation.Required), validation.Field(&request.ContactName, validation.Required),
validation.Field(&request.ContactPhone, validation.Required), validation.Field(&request.ContactPhone, validation.Required),
) )
@ -116,7 +110,6 @@ func ValidateSendContact(request domainSend.ContactRequest) {
func ValidateSendLink(request domainSend.LinkRequest) error { func ValidateSendLink(request domainSend.LinkRequest) error {
err := validation.ValidateStruct(&request, err := validation.ValidateStruct(&request,
validation.Field(&request.Phone, validation.Required, validation.Length(10, 25)),
validation.Field(&request.Link, validation.Required), validation.Field(&request.Link, validation.Required),
validation.Field(&request.Caption, validation.Required), validation.Field(&request.Caption, validation.Required),
) )
@ -132,8 +125,7 @@ func ValidateSendLink(request domainSend.LinkRequest) error {
func ValidateRevokeMessage(request domainSend.RevokeRequest) error { func ValidateRevokeMessage(request domainSend.RevokeRequest) error {
err := validation.ValidateStruct(&request, err := validation.ValidateStruct(&request,
validation.Field(&request.Phone, validation.Required, validation.Length(10, 25)),
validation.Field(&request.MessageID, validation.Required, validation.Length(20, 25)),
validation.Field(&request.MessageID, validation.Required),
) )
if err != nil { if err != nil {
@ -147,9 +139,8 @@ func ValidateRevokeMessage(request domainSend.RevokeRequest) error {
func ValidateUpdateMessage(request domainSend.UpdateMessageRequest) error { func ValidateUpdateMessage(request domainSend.UpdateMessageRequest) error {
err := validation.ValidateStruct(&request, err := validation.ValidateStruct(&request,
validation.Field(&request.Phone, validation.Required, validation.Length(10, 25)),
validation.Field(&request.MessageID, validation.Required, validation.Length(20, 25)),
validation.Field(&request.Message, validation.Required, validation.Length(1, 1000)),
validation.Field(&request.MessageID, validation.Required),
validation.Field(&request.Message, validation.Required),
) )
if err != nil { if err != nil {

4
src/validations/send_validation_test.go

@ -13,12 +13,12 @@ func TestValidateSendMessage(t *testing.T) {
tests := []struct { tests := []struct {
name string name string
args args args args
err interface{}
err any
}{ }{
{ {
name: "success phone & message normal", name: "success phone & message normal",
args: args{request: domainSend.MessageRequest{ args: args{request: domainSend.MessageRequest{
Phone: "6289685024091",
Phone: "1728937129312@s.whatsapp.net",
Message: "Hello this is testing", Message: "Hello this is testing",
}}, }},
err: nil, err: nil,

5
src/validations/user_validation.go

@ -4,12 +4,11 @@ import (
domainUser "github.com/aldinokemal/go-whatsapp-web-multidevice/domains/user" domainUser "github.com/aldinokemal/go-whatsapp-web-multidevice/domains/user"
"github.com/aldinokemal/go-whatsapp-web-multidevice/utils" "github.com/aldinokemal/go-whatsapp-web-multidevice/utils"
validation "github.com/go-ozzo/ozzo-validation/v4" validation "github.com/go-ozzo/ozzo-validation/v4"
"github.com/go-ozzo/ozzo-validation/v4/is"
) )
func ValidateUserInfo(request domainUser.InfoRequest) { func ValidateUserInfo(request domainUser.InfoRequest) {
err := validation.ValidateStruct(&request, err := validation.ValidateStruct(&request,
validation.Field(&request.Phone, validation.Required, is.E164, validation.Length(10, 15)),
validation.Field(&request.Phone, validation.Required),
) )
if err != nil { if err != nil {
@ -20,7 +19,7 @@ func ValidateUserInfo(request domainUser.InfoRequest) {
} }
func ValidateUserAvatar(request domainUser.AvatarRequest) { func ValidateUserAvatar(request domainUser.AvatarRequest) {
err := validation.ValidateStruct(&request, err := validation.ValidateStruct(&request,
validation.Field(&request.Phone, validation.Required, is.E164, validation.Length(10, 15)),
validation.Field(&request.Phone, validation.Required),
) )
if err != nil { if err != nil {

317
src/views/index.html

@ -60,22 +60,22 @@
</div> </div>
<div class="ui horizontal divider"> <div class="ui horizontal divider">
Send Private Message
Message
</div> </div>
<div class="ui three column doubling grid cards"> <div class="ui three column doubling grid cards">
<div class="green card" @click="sendMessageModal('user')" style="cursor: pointer">
<div class="blue card" @click="sendMessageModal()" style="cursor: pointer">
<div class="content"> <div class="content">
<a class="ui blue right ribbon label">Private</a>
<a class="ui blue right ribbon label">Send</a>
<div class="header">Send Message</div> <div class="header">Send Message</div>
<div class="description"> <div class="description">
Send any message to any whatsapp number Send any message to any whatsapp number
</div> </div>
</div> </div>
</div> </div>
<div class="green card" @click="sendImageModal('user')" style="cursor:pointer;">
<div class="blue card" @click="sendImageModal()" style="cursor:pointer;">
<div class="content"> <div class="content">
<a class="ui blue right ribbon label">Private</a>
<a class="ui blue right ribbon label">Send</a>
<div class="header">Send Image</div> <div class="header">Send Image</div>
<div class="description"> <div class="description">
Send image with Send image with
@ -84,9 +84,9 @@
</div> </div>
</div> </div>
</div> </div>
<div class="green card" @click="sendFileModal('user')" style="cursor: pointer">
<div class="blue card" @click="sendFileModal()" style="cursor: pointer">
<div class="content"> <div class="content">
<a class="ui blue right ribbon label">Private</a>
<a class="ui blue right ribbon label">Send</a>
<div class="header">Send File</div> <div class="header">Send File</div>
<div class="description"> <div class="description">
Send any file up to Send any file up to
@ -94,9 +94,9 @@
</div> </div>
</div> </div>
</div> </div>
<div class="green card" @click="sendVideoModal('user')" style="cursor: pointer">
<div class="blue card" @click="sendVideoModal()" style="cursor: pointer">
<div class="content"> <div class="content">
<a class="ui blue right ribbon label">Private</a>
<a class="ui blue right ribbon label">Send</a>
<div class="header">Send Video</div> <div class="header">Send Video</div>
<div class="description"> <div class="description">
Send video Send video
@ -106,99 +106,50 @@
</div> </div>
</div> </div>
</div> </div>
<div class="green card" @click="sendContactModal('user')" style="cursor: pointer">
<div class="blue card" @click="sendContactModal()" style="cursor: pointer">
<div class="content"> <div class="content">
<a class="ui blue right ribbon label">Private</a>
<a class="ui blue right ribbon label">Send</a>
<div class="header">Send Contact</div> <div class="header">Send Contact</div>
<div class="description"> <div class="description">
Send contact to any whatsapp number Send contact to any whatsapp number
</div> </div>
</div> </div>
</div> </div>
</div>
<div class="ui horizontal divider">
Send Group Message
</div>
<div class="ui three column doubling grid cards">
<div class="green card" @click="sendMessageModal('group')" style="cursor: pointer">
<div class="content">
<a class="ui teal right ribbon label">Group</a>
<div class="header">Send Message</div>
<div class="description">
Send any message to any whatsapp number
</div>
</div>
</div>
<div class="green card" @click="sendImageModal('group')" style="cursor:pointer;">
<div class="content">
<a class="ui teal right ribbon label">Group</a>
<div class="header">Send Image</div>
<div class="description">
Send image with
<div class="ui teal horizontal label">jpg/jpeg/png</div>
type
</div>
</div>
</div>
<div class="green card" @click="sendFileModal('group')" style="cursor: pointer">
<div class="content">
<a class="ui teal right ribbon label">Group</a>
<div class="header">Send File</div>
<div class="description">
Send any file up to
<div class="ui teal horizontal label">{{ .MaxFileSize }}</div>
</div>
</div>
</div>
<div class="green card" @click="sendVideoModal('group')" style="cursor: pointer">
<div class="content">
<a class="ui teal right ribbon label">Group</a>
<div class="header">Send Video</div>
<div class="description">
Send video
<div class="ui teal horizontal label">mp4</div>
up to
<div class="ui teal horizontal label">{{ .MaxVideoSize }}</div>
</div>
</div>
</div>
<div class="green card" @click="sendContactModal('group')" style="cursor: pointer">
<div class="red card" @click="sendRevokeModal()" style="cursor: pointer">
<div class="content"> <div class="content">
<a class="ui teal right ribbon label">Group</a>
<div class="header">Send Contact</div>
<a class="ui red right ribbon label">Revoke</a>
<div class="header">Revoke Message</div>
<div class="description"> <div class="description">
Send contact to any whatsapp number
Revoke any message in private or group chat
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<div class="ui horizontal divider"> <div class="ui horizontal divider">
User
Account
</div> </div>
<div class="ui four column doubling grid cards"> <div class="ui four column doubling grid cards">
<div class="green card" @click="infoModal" style="cursor: pointer;">
<div class="green card" @click="avatarModal" style="cursor: pointer;">
<div class="content"> <div class="content">
<div class="header">User Info</div>
<div class="header">Avatar</div>
<div class="description"> <div class="description">
You can search someone user info by phone
You can search someone avatar by phone
</div> </div>
</div> </div>
</div> </div>
<div class="green card" @click="avatarModal" style="cursor: pointer;">
<div class="green card" @click="infoModal" style="cursor: pointer;">
<div class="content"> <div class="content">
<div class="header">User Avatar</div>
<div class="header">User Info</div>
<div class="description"> <div class="description">
You can search someone avatar by phone
You can search someone user info by phone
</div> </div>
</div> </div>
</div> </div>
<div class="green card" @click="groupModal" style="cursor: pointer"> <div class="green card" @click="groupModal" style="cursor: pointer">
<div class="content"> <div class="content">
<div class="header">User List Groups</div>
<div class="header">My List Groups</div>
<div class="description"> <div class="description">
Display all groups you joined Display all groups you joined
</div> </div>
@ -206,7 +157,7 @@
</div> </div>
<div class="green card" @click="privacyModal" style="cursor: pointer"> <div class="green card" @click="privacyModal" style="cursor: pointer">
<div class="content"> <div class="content">
<div class="header">User Privacy Setting</div>
<div class="header">My Privacy Setting</div>
<div class="description"> <div class="description">
Get your privacy settings Get your privacy settings
</div> </div>
@ -249,10 +200,18 @@
</div> </div>
<div class="content"> <div class="content">
<form class="ui form"> <form class="ui form">
<div class="field">
<label>Type</label>
<select name="message_type" v-model="message_type" aria-label="type">
<option value="group">Group Message</option>
<option value="user">Private Message</option>
</select>
</div>
<div class="field"> <div class="field">
<label>Phone / Group ID</label> <label>Phone / Group ID</label>
<input v-model="message_phone" type="text" placeholder="6289..." <input v-model="message_phone" type="text" placeholder="6289..."
aria-label="phone"> aria-label="phone">
<input :value="message_phone_id" disabled aria-label="whatsapp_id">
</div> </div>
<div class="field"> <div class="field">
<label>Message</label> <label>Message</label>
@ -277,10 +236,18 @@
</div> </div>
<div class="content"> <div class="content">
<form class="ui form"> <form class="ui form">
<div class="field">
<label>Type</label>
<select name="image_type" v-model="image_type" aria-label="type">
<option value="group">Group Message</option>
<option value="user">Private Message</option>
</select>
</div>
<div class="field"> <div class="field">
<label>Phone / Group ID</label> <label>Phone / Group ID</label>
<input v-model="image_phone" type="text" placeholder="6289..." <input v-model="image_phone" type="text" placeholder="6289..."
aria-label="phone"> aria-label="phone">
<input :value="image_phone_id" disabled aria-label="whatsapp_id">
</div> </div>
<div class="field"> <div class="field">
<label>Caption</label> <label>Caption</label>
@ -328,10 +295,18 @@
</div> </div>
<div class="content"> <div class="content">
<form class="ui form"> <form class="ui form">
<div class="field">
<label>Type</label>
<select name="file_type" v-model="file_type" aria-label="type">
<option value="group">Group Message</option>
<option value="user">Private Message</option>
</select>
</div>
<div class="field"> <div class="field">
<label>Phone / Group ID</label> <label>Phone / Group ID</label>
<input v-model="file_phone" type="text" placeholder="6289..." <input v-model="file_phone" type="text" placeholder="6289..."
aria-label="phone"> aria-label="phone">
<input :value="file_phone_id" disabled aria-label="whatsapp_id">
</div> </div>
<div class="field"> <div class="field">
<label>Caption</label> <label>Caption</label>
@ -364,6 +339,13 @@
</div> </div>
<div class="content"> <div class="content">
<form class="ui form"> <form class="ui form">
<div class="field">
<label>Type</label>
<select name="video_type" v-model="video_type" aria-label="type">
<option value="group">Group Message</option>
<option value="user">Private Message</option>
</select>
</div>
<div class="field"> <div class="field">
<label>Phone / Group ID</label> <label>Phone / Group ID</label>
<input v-model="video_phone" type="text" placeholder="6289..." <input v-model="video_phone" type="text" placeholder="6289..."
@ -373,6 +355,7 @@
<label>Caption</label> <label>Caption</label>
<input v-model="video_caption" type="text" placeholder="Type some caption (optional)..." <input v-model="video_caption" type="text" placeholder="Type some caption (optional)..."
aria-label="caption"> aria-label="caption">
<input :value="video_phone_id" disabled aria-label="whatsapp_id">
</div> </div>
<div class="field"> <div class="field">
<label>View Once</label> <label>View Once</label>
@ -414,10 +397,18 @@
</div> </div>
<div class="content"> <div class="content">
<form class="ui form"> <form class="ui form">
<div class="field">
<label>Type</label>
<select name="contact_type" v-model="contact_type" aria-label="type">
<option value="group">Group Message</option>
<option value="user">Private Message</option>
</select>
</div>
<div class="field"> <div class="field">
<label>Phone / Group ID</label> <label>Phone / Group ID</label>
<input v-model="contact_phone" type="text" placeholder="6289..." <input v-model="contact_phone" type="text" placeholder="6289..."
aria-label="phone"> aria-label="phone">
<input :value="contact_phone_id" disabled aria-label="whatsapp_id">
</div> </div>
<div class="field"> <div class="field">
<label>Contact Name</label> <label>Contact Name</label>
@ -439,6 +430,42 @@
</div> </div>
</div> </div>
<!-- Modal SendRevoke -->
<div class="ui small modal" id="modalSendRevoke">
<i class="close icon"></i>
<div class="header">
Send Revoke
</div>
<div class="content">
<form class="ui form">
<div class="field">
<label>Type</label>
<select name="revoke_type" v-model="revoke_type" aria-label="type">
<option value="group">Group Message</option>
<option value="user">Private Message</option>
</select>
</div>
<div class="field">
<label>Phone / Group ID</label>
<input v-model="revoke_phone" type="text" placeholder="6289..."
aria-label="phone">
<input :value="revoke_phone_id" disabled aria-label="whatsapp_id">
</div>
<div class="field">
<label>Revoke Message ID</label>
<input v-model="revoke_message_id" type="text" placeholder="Please enter your message id"
aria-label="card_phone">
</div>
</form>
</div>
<div class="actions">
<div class="ui positive right labeled icon button" @click="sendRevokeProcess">
Send
<i class="send icon"></i>
</div>
</div>
</div>
<!-- Modal UserGroup --> <!-- Modal UserGroup -->
<div class="ui small modal" id="modalUserGroup"> <div class="ui small modal" id="modalUserGroup">
<i class="close icon"></i> <i class="close icon"></i>
@ -492,10 +519,18 @@
</div> </div>
<div class="content"> <div class="content">
<form class="ui form"> <form class="ui form">
<div class="field">
<label>Type</label>
<select name="avatar_type" v-model="avatar_type" aria-label="type">
<option value="group">Group Message</option>
<option value="user">Private Message</option>
</select>
</div>
<div class="field"> <div class="field">
<label>Phone</label> <label>Phone</label>
<input v-model="avatar_phone" type="text" placeholder="6289..." <input v-model="avatar_phone" type="text" placeholder="6289..."
aria-label="phone"> aria-label="phone">
<input :value="avatar_phone_id" disabled aria-label="whatsapp_id">
</div> </div>
<button type="button" class="ui primary button" :class="{'loading': avatar_loading}" <button type="button" class="ui primary button" :class="{'loading': avatar_loading}"
@ -518,10 +553,17 @@
</div> </div>
<div class="content"> <div class="content">
<form class="ui form"> <form class="ui form">
<div class="field">
<label>Type</label>
<select name="info_type" v-model="info_type" aria-label="type">
<option value="user">Private Message</option>
</select>
</div>
<div class="field"> <div class="field">
<label>Phone</label> <label>Phone</label>
<input v-model="info_phone" type="text" placeholder="6289..." <input v-model="info_phone" type="text" placeholder="6289..."
aria-label="phone"> aria-label="phone">
<input :value="info_phone_id" disabled aria-label="whatsapp_id">
</div> </div>
<button type="button" class="ui primary button" :class="{'loading': info_loading}" <button type="button" class="ui primary button" :class="{'loading': info_loading}"
@ -678,9 +720,13 @@
message_text: '', message_text: '',
} }
}, },
computed: {
message_phone_id() {
return this.message_type === 'user' ? `${this.message_phone}@${this.type_user}` : `${this.message_phone}@${this.type_group}`
}
},
methods: { methods: {
sendMessageModal(type) {
this.message_type = type
sendMessageModal() {
$('#modalSendMessage').modal('show'); $('#modalSendMessage').modal('show');
}, },
async sendMessageProcess() { async sendMessageProcess() {
@ -695,9 +741,8 @@
return new Promise(async (resolve, reject) => { return new Promise(async (resolve, reject) => {
try { try {
let payload = new FormData(); let payload = new FormData();
payload.append("phone", this.message_phone)
payload.append("phone", this.message_phone_id)
payload.append("message", this.message_text) payload.append("message", this.message_text)
payload.append("type", this.message_type)
let response = await http.post(`/send/message`, payload) let response = await http.post(`/send/message`, payload)
this.sendMessageReset(); this.sendMessageReset();
resolve(response.data.message) resolve(response.data.message)
@ -728,9 +773,13 @@
image_type: 'user', image_type: 'user',
} }
}, },
computed: {
image_phone_id() {
return this.image_type === 'user' ? `${this.image_phone}@${this.type_user}` : `${this.image_phone}@${this.type_group}`
}
},
methods: { methods: {
sendImageModal(type) {
this.image_type = type
sendImageModal() {
$('#modalSendImage').modal('show'); $('#modalSendImage').modal('show');
}, },
async sendImageProcess() { async sendImageProcess() {
@ -745,12 +794,11 @@
return new Promise(async (resolve, reject) => { return new Promise(async (resolve, reject) => {
try { try {
let payload = new FormData(); let payload = new FormData();
payload.append("phone", this.image_phone)
payload.append("phone", this.image_phone_id)
payload.append("view_once", this.image_view_once) payload.append("view_once", this.image_view_once)
payload.append("compress", this.image_compress) payload.append("compress", this.image_compress)
payload.append("caption", this.image_caption) payload.append("caption", this.image_caption)
payload.append("image", $("#image_file")[0].files[0]) payload.append("image", $("#image_file")[0].files[0])
payload.append("type", this.image_type)
let response = await http.post(`/send/image`, payload) let response = await http.post(`/send/image`, payload)
this.sendImageReset(); this.sendImageReset();
resolve(response.data.message) resolve(response.data.message)
@ -782,9 +830,13 @@
file_phone: '', file_phone: '',
} }
}, },
computed: {
file_phone_id() {
return this.file_type === 'user' ? `${this.file_phone}@${this.type_user}` : `${this.file_phone}@${this.type_group}`
}
},
methods: { methods: {
sendFileModal(type) {
this.file_type = type
sendFileModal() {
$('#modalSendFile').modal('show'); $('#modalSendFile').modal('show');
}, },
async sendFileProcess() { async sendFileProcess() {
@ -800,9 +852,8 @@
try { try {
let payload = new FormData(); let payload = new FormData();
payload.append("caption", this.file_caption) payload.append("caption", this.file_caption)
payload.append("phone", this.file_phone)
payload.append("phone", this.file_phone_id)
payload.append("file", $("#file_file")[0].files[0]) payload.append("file", $("#file_file")[0].files[0])
payload.append("type", this.file_type)
let response = await http.post(`/send/file`, payload) let response = await http.post(`/send/file`, payload)
this.sendFileReset(); this.sendFileReset();
resolve(response.data.message) resolve(response.data.message)
@ -834,9 +885,13 @@
video_phone: '', video_phone: '',
} }
}, },
computed: {
video_phone_id() {
return this.video_type === 'user' ? `${this.video_phone}@${this.type_user}` : `${this.video_phone}@${this.type_group}`
}
},
methods: { methods: {
sendVideoModal(type) {
this.video_type = type
sendVideoModal() {
$('#modalSendVideo').modal('show'); $('#modalSendVideo').modal('show');
}, },
async sendVideoProcess() { async sendVideoProcess() {
@ -851,12 +906,11 @@
return new Promise(async (resolve, reject) => { return new Promise(async (resolve, reject) => {
try { try {
let payload = new FormData(); let payload = new FormData();
payload.append("phone", this.video_phone)
payload.append("phone", this.video_phone_id)
payload.append("caption", this.video_caption) payload.append("caption", this.video_caption)
payload.append("view_once", this.video_view_once) payload.append("view_once", this.video_view_once)
payload.append("compress", this.video_compress) payload.append("compress", this.video_compress)
payload.append("video", $("#video_file")[0].files[0]) payload.append("video", $("#video_file")[0].files[0])
payload.append("type", this.video_type)
let response = await http.post(`/send/video`, payload) let response = await http.post(`/send/video`, payload)
this.sendVideoReset(); this.sendVideoReset();
resolve(response.data.message) resolve(response.data.message)
@ -889,10 +943,15 @@
contact_card_phone: '', contact_card_phone: '',
} }
}, },
computed: {
contact_phone_id() {
return this.contact_type === 'user' ? `${this.contact_phone}@${this.type_user}` : `${this.contact_phone}@${this.type_group}`
}
},
methods: { methods: {
sendContactModal(type) {
this.contact_type = type
$('#modalSendContact').modal('show');
sendContactModal() {
this.contact_type =
$('#modalSendContact').modal('show');
}, },
async sendContactProcess() { async sendContactProcess() {
try { try {
@ -906,10 +965,9 @@
return new Promise(async (resolve, reject) => { return new Promise(async (resolve, reject) => {
try { try {
let payload = new FormData(); let payload = new FormData();
payload.append("phone", this.contact_phone)
payload.append("phone", this.contact_phone_id)
payload.append("contact_name", this.contact_card_name) payload.append("contact_name", this.contact_card_name)
payload.append("contact_phone", this.contact_card_phone) payload.append("contact_phone", this.contact_card_phone)
payload.append("type", this.contact_type)
let response = await http.post(`/send/contact`, payload) let response = await http.post(`/send/contact`, payload)
this.sendContactReset(); this.sendContactReset();
resolve(response.data.message) resolve(response.data.message)
@ -931,6 +989,56 @@
} }
} }
const sendRevoke = {
data() {
return {
revoke_type: 'user',
revoke_phone: '',
revoke_message_id: '',
}
},
computed: {
revoke_phone_id() {
return this.revoke_type === 'user' ? `${this.revoke_phone}@${this.type_user}` : `${this.revoke_phone}@${this.type_group}`
}
},
methods: {
sendRevokeModal() {
$('#modalSendRevoke').modal('show');
},
async sendRevokeProcess() {
try {
let response = await this.sendRevokeApi()
showSuccessInfo(response)
} catch (err) {
showErrorInfo(err)
}
},
sendRevokeApi() {
return new Promise(async (resolve, reject) => {
try {
let payload = new FormData();
payload.append("phone", this.revoke_phone_id)
let response = await http.post(`/message/${this.revoke_message_id}/revoke`, payload)
this.sendRevokeReset();
resolve(response.data.message)
} catch (error) {
if (error.response) {
reject(error.response.data.message)
} else {
reject(error.message)
}
}
})
},
sendRevokeReset() {
this.revoke_phone = '';
this.revoke_message_id = '';
this.revoke_type = 'user';
},
}
}
const userGroups = { const userGroups = {
data() { data() {
return { return {
@ -1006,11 +1114,17 @@
const userAvatar = { const userAvatar = {
data() { data() {
return { return {
avatar_type: 'user',
avatar_phone: '', avatar_phone: '',
avatar_image: null, avatar_image: null,
avatar_loading: false, avatar_loading: false,
} }
}, },
computed: {
avatar_phone_id() {
return this.avatar_type === 'user' ? `${this.avatar_phone}@${this.type_user}` : `${this.avatar_phone}@${this.type_group}`
}
},
methods: { methods: {
async avatarModal() { async avatarModal() {
this.avatarReset(); this.avatarReset();
@ -1030,7 +1144,7 @@
avatarApi() { avatarApi() {
return new Promise(async (resolve, reject) => { return new Promise(async (resolve, reject) => {
try { try {
let response = await http.get(`/user/avatar?phone=${this.avatar_phone}`)
let response = await http.get(`/user/avatar?phone=${this.avatar_phone_id}`)
this.avatar_image = response.data.results.url; this.avatar_image = response.data.results.url;
resolve() resolve()
} catch (error) { } catch (error) {
@ -1052,6 +1166,7 @@
const userInfo = { const userInfo = {
data() { data() {
return { return {
info_type: 'user',
info_phone: '', info_phone: '',
// //
info_name: null, info_name: null,
@ -1061,6 +1176,12 @@
info_loading: false, info_loading: false,
} }
}, },
computed: {
info_phone_id() {
return this.info_type === 'user' ? `${this.info_phone}@${this.type_user}` : `${this.info_phone}@${this.type_group}`
}
},
methods: { methods: {
async infoModal() { async infoModal() {
this.infoReset(); this.infoReset();
@ -1080,7 +1201,7 @@
infoApi() { infoApi() {
return new Promise(async (resolve, reject) => { return new Promise(async (resolve, reject) => {
try { try {
let response = await http.get(`/user/info?phone=${this.info_phone}`)
let response = await http.get(`/user/info?phone=${this.info_phone_id}`)
this.info_name = response.data.results.verified_name; this.info_name = response.data.results.verified_name;
this.info_status = response.data.results.status; this.info_status = response.data.results.status;
this.info_devices = response.data.results.devices; this.info_devices = response.data.results.devices;
@ -1110,6 +1231,8 @@
app_host: {{ .AppHost }}, app_host: {{ .AppHost }},
app_name: 'Whatsapp API Multi Device ({{ .AppVersion }})', app_name: 'Whatsapp API Multi Device ({{ .AppVersion }})',
is_logged_in: false, is_logged_in: false,
type_group: "g.us",
type_user: "s.whatsapp.net"
} }
}, },
mounted() { mounted() {
@ -1144,7 +1267,7 @@
return tanggal.format('LLL'); return tanggal.format('LLL');
} }
}, },
mixins: [login, logout, reconnect, sendMessage, sendImage, sendFile, sendVideo, sendContact, userGroups, userPrivacy, userAvatar, userInfo]
mixins: [login, logout, reconnect, sendMessage, sendImage, sendFile, sendVideo, sendContact, sendRevoke, userGroups, userPrivacy, userAvatar, userInfo]
}).mount('#app') }).mount('#app')
</script> </script>
</body> </body>
Loading…
Cancel
Save