From 6bd60a543321246adf98fdefb3fdb7a74176738a Mon Sep 17 00:00:00 2001 From: Aldino Kemal Date: Mon, 21 Nov 2022 23:29:51 +0700 Subject: [PATCH] feat: add revoke --- src/domains/send/message.go | 12 ++++++++++++ src/domains/send/send.go | 1 + src/internal/rest/send_controller.go | 23 ++++++++++++++++++++++- src/services/send_service.go | 20 ++++++++++++++++++++ src/utils/whatsapp.go | 4 ++-- src/validations/send_validation.go | 15 +++++++++++++++ 6 files changed, 72 insertions(+), 3 deletions(-) create mode 100644 src/domains/send/message.go diff --git a/src/domains/send/message.go b/src/domains/send/message.go new file mode 100644 index 0000000..7844dc1 --- /dev/null +++ b/src/domains/send/message.go @@ -0,0 +1,12 @@ +package send + +type RevokeRequest struct { + MessageID string `json:"message_id" uri:"message_id"` + Phone string `json:"phone" form:"phone"` + Type Type `json:"type" form:"type"` +} + +type RevokeResponse struct { + MessageID string `json:"message_id"` + Status string `json:"status"` +} diff --git a/src/domains/send/send.go b/src/domains/send/send.go index 06fca62..eb47869 100644 --- a/src/domains/send/send.go +++ b/src/domains/send/send.go @@ -16,4 +16,5 @@ type ISendService interface { SendVideo(ctx context.Context, request VideoRequest) (response VideoResponse, err error) SendContact(ctx context.Context, request ContactRequest) (response ContactResponse, err error) SendLink(ctx context.Context, request LinkRequest) (response LinkResponse, err error) + Revoke(ctx context.Context, request RevokeRequest) (response RevokeResponse, err error) } diff --git a/src/internal/rest/send_controller.go b/src/internal/rest/send_controller.go index dee923a..42ce429 100644 --- a/src/internal/rest/send_controller.go +++ b/src/internal/rest/send_controller.go @@ -1,6 +1,7 @@ package rest import ( + "fmt" 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/validations" @@ -19,7 +20,7 @@ func InitRestSend(app *fiber.App, service domainSend.ISendService) Send { app.Post("/send/video", rest.SendVideo) app.Post("/send/contact", rest.SendContact) app.Post("/send/link", rest.SendLink) - + app.Post("/message/:message_id/revoke", rest.RevokeMessage) return rest } @@ -183,3 +184,23 @@ func (controller *Send) SendLink(c *fiber.Ctx) error { Results: response, }) } + +func (controller *Send) RevokeMessage(c *fiber.Ctx) error { + var request domainSend.RevokeRequest + err := c.BodyParser(&request) + utils.PanicIfNeeded(err) + request.MessageID = c.Params("message_id") + + err = validations.ValidateRevokeMessage(request) + utils.PanicIfNeeded(err) + fmt.Println(request) + + response, err := controller.Service.Revoke(c.UserContext(), request) + utils.PanicIfNeeded(err) + + return c.JSON(utils.ResponseData{ + Code: 200, + Message: response.Status, + Results: response, + }) +} diff --git a/src/services/send_service.go b/src/services/send_service.go index 652a5c1..08cdcd0 100644 --- a/src/services/send_service.go +++ b/src/services/send_service.go @@ -12,6 +12,7 @@ import ( "github.com/valyala/fasthttp" "go.mau.fi/whatsmeow" waProto "go.mau.fi/whatsmeow/binary/proto" + "go.mau.fi/whatsmeow/types" "google.golang.org/protobuf/proto" "net/http" "os" @@ -349,3 +350,22 @@ func (service serviceSend) SendLink(ctx context.Context, request domainSend.Link response.Status = fmt.Sprintf("Link sent to %s (server timestamp: %s)", request.Phone, ts) return response, nil } + +func (service serviceSend) Revoke(_ context.Context, request domainSend.RevokeRequest) (response domainSend.RevokeResponse, err error) { + utils.MustLogin(service.WaCli) + + recipient, ok := utils.ParseJID(request.Phone) + if !ok { + return response, errors.New("invalid JID " + request.Phone) + } + + msgId := whatsmeow.GenerateMessageID() + ts, err := service.WaCli.SendMessage(context.Background(), recipient, msgId, service.WaCli.BuildRevoke(recipient, types.EmptyJID, request.MessageID)) + if err != nil { + return response, err + } + + response.MessageID = msgId + response.Status = fmt.Sprintf("Revoke success %s (server timestamp: %s)", request.Phone, ts) + return response, nil +} diff --git a/src/utils/whatsapp.go b/src/utils/whatsapp.go index fe4b546..a64ab55 100644 --- a/src/utils/whatsapp.go +++ b/src/utils/whatsapp.go @@ -74,10 +74,10 @@ func ParseJID(arg string) (types.JID, bool) { } else { recipient, err := types.ParseJID(arg) if err != nil { - _ = fmt.Errorf("Invalid JID %s: %v", arg, err) + _ = fmt.Errorf("invalid JID %s: %v", arg, err) return recipient, false } else if recipient.User == "" { - _ = fmt.Errorf("Invalid JID %s: no server specified", arg) + _ = fmt.Errorf("invalid JID %s: no server specified", arg) return recipient, false } return recipient, true diff --git a/src/validations/send_validation.go b/src/validations/send_validation.go index b4e30ae..f3f92a6 100644 --- a/src/validations/send_validation.go +++ b/src/validations/send_validation.go @@ -129,3 +129,18 @@ func ValidateSendLink(request domainSend.LinkRequest) error { return nil } + +func ValidateRevokeMessage(request domainSend.RevokeRequest) error { + err := validation.ValidateStruct(&request, + validation.Field(&request.Phone, validation.Required, validation.Length(10, 25)), + validation.Field(&request.MessageID, validation.Required, validation.Length(20, 25)), + ) + + if err != nil { + return utils.ValidationError{ + Message: err.Error(), + } + } + + return nil +}