From 409e3d6a223cbd81ee60adca34e529b6fe903bd0 Mon Sep 17 00:00:00 2001 From: Aldino Kemal Date: Sat, 3 Dec 2022 21:54:25 +0700 Subject: [PATCH] feat: move validation to service (#41) * feat: move validation to service layer * feat: change Whatsapp return error --- src/internal/rest/send.go | 29 ++--------------------------- src/internal/rest/user.go | 7 ------- src/pkg/error/whatsapp_error.go | 17 +++++++++++++++++ src/pkg/whatsapp/whatsapp.go | 9 ++++++--- src/services/send.go | 33 +++++++++++++++++++++++++++++++++ src/services/user.go | 9 +++++++++ 6 files changed, 67 insertions(+), 37 deletions(-) diff --git a/src/internal/rest/send.go b/src/internal/rest/send.go index df2c459..5de40e7 100644 --- a/src/internal/rest/send.go +++ b/src/internal/rest/send.go @@ -4,7 +4,6 @@ import ( domainSend "github.com/aldinokemal/go-whatsapp-web-multidevice/domains/send" "github.com/aldinokemal/go-whatsapp-web-multidevice/pkg/utils" "github.com/aldinokemal/go-whatsapp-web-multidevice/pkg/whatsapp" - "github.com/aldinokemal/go-whatsapp-web-multidevice/validations" "github.com/gofiber/fiber/v2" ) @@ -30,10 +29,7 @@ func (controller *Send) SendText(c *fiber.Ctx) error { err := c.BodyParser(&request) utils.PanicIfNeeded(err) - // add validation send message whatsapp.SanitizePhone(&request.Phone) - err = validations.ValidateSendMessage(request) - utils.PanicIfNeeded(err) response, err := controller.Service.SendText(c.UserContext(), request) utils.PanicIfNeeded(err) @@ -56,11 +52,7 @@ func (controller *Send) SendImage(c *fiber.Ctx) error { utils.PanicIfNeeded(err) request.Image = file - - //add validation send image whatsapp.SanitizePhone(&request.Phone) - err = validations.ValidateSendImage(request) - utils.PanicIfNeeded(err) response, err := controller.Service.SendImage(c.UserContext(), request) utils.PanicIfNeeded(err) @@ -81,11 +73,7 @@ func (controller *Send) SendFile(c *fiber.Ctx) error { utils.PanicIfNeeded(err) request.File = file - - //add validation send image whatsapp.SanitizePhone(&request.Phone) - err = validations.ValidateSendFile(request) - utils.PanicIfNeeded(err) response, err := controller.Service.SendFile(c.UserContext(), request) utils.PanicIfNeeded(err) @@ -106,11 +94,7 @@ func (controller *Send) SendVideo(c *fiber.Ctx) error { utils.PanicIfNeeded(err) request.Video = video - - //add validation send image whatsapp.SanitizePhone(&request.Phone) - err = validations.ValidateSendVideo(request) - utils.PanicIfNeeded(err) response, err := controller.Service.SendVideo(c.UserContext(), request) utils.PanicIfNeeded(err) @@ -127,10 +111,7 @@ func (controller *Send) SendContact(c *fiber.Ctx) error { err := c.BodyParser(&request) utils.PanicIfNeeded(err) - // add validation send contect whatsapp.SanitizePhone(&request.Phone) - err = validations.ValidateSendContact(request) - utils.PanicIfNeeded(err) response, err := controller.Service.SendContact(c.UserContext(), request) utils.PanicIfNeeded(err) @@ -148,8 +129,6 @@ func (controller *Send) SendLink(c *fiber.Ctx) error { utils.PanicIfNeeded(err) whatsapp.SanitizePhone(&request.Phone) - err = validations.ValidateSendLink(request) - utils.PanicIfNeeded(err) response, err := controller.Service.SendLink(c.UserContext(), request) utils.PanicIfNeeded(err) @@ -165,10 +144,8 @@ 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) + request.MessageID = c.Params("message_id") whatsapp.SanitizePhone(&request.Phone) response, err := controller.Service.Revoke(c.UserContext(), request) @@ -185,10 +162,8 @@ func (controller *Send) UpdateMessage(c *fiber.Ctx) error { var request domainSend.UpdateMessageRequest err := c.BodyParser(&request) utils.PanicIfNeeded(err) - request.MessageID = c.Params("message_id") - err = validations.ValidateUpdateMessage(request) - utils.PanicIfNeeded(err) + request.MessageID = c.Params("message_id") whatsapp.SanitizePhone(&request.Phone) response, err := controller.Service.UpdateMessage(c.UserContext(), request) diff --git a/src/internal/rest/user.go b/src/internal/rest/user.go index fb121bf..fa3cd25 100644 --- a/src/internal/rest/user.go +++ b/src/internal/rest/user.go @@ -4,7 +4,6 @@ import ( domainUser "github.com/aldinokemal/go-whatsapp-web-multidevice/domains/user" "github.com/aldinokemal/go-whatsapp-web-multidevice/pkg/utils" "github.com/aldinokemal/go-whatsapp-web-multidevice/pkg/whatsapp" - "github.com/aldinokemal/go-whatsapp-web-multidevice/validations" "github.com/gofiber/fiber/v2" ) @@ -34,10 +33,7 @@ func (controller *User) UserInfo(c *fiber.Ctx) error { err := c.QueryParser(&request) utils.PanicIfNeeded(err) - // add validation send message whatsapp.SanitizePhone(&request.Phone) - err = validations.ValidateUserInfo(request) - utils.PanicIfNeeded(err) response, err := controller.Service.Info(c.Context(), request) utils.PanicIfNeeded(err) @@ -54,10 +50,7 @@ func (controller *User) UserAvatar(c *fiber.Ctx) error { err := c.QueryParser(&request) utils.PanicIfNeeded(err) - // add validation send message whatsapp.SanitizePhone(&request.Phone) - err = validations.ValidateUserAvatar(request) - utils.PanicIfNeeded(err) response, err := controller.Service.Avatar(c.Context(), request) utils.PanicIfNeeded(err) diff --git a/src/pkg/error/whatsapp_error.go b/src/pkg/error/whatsapp_error.go index 3d9ff78..bc8fca3 100644 --- a/src/pkg/error/whatsapp_error.go +++ b/src/pkg/error/whatsapp_error.go @@ -19,6 +19,23 @@ func (e InvalidJID) StatusCode() int { return http.StatusBadRequest } +type WebhookError string + +// Error for complying the error interface +func (e WebhookError) Error() string { + return string(e) +} + +// ErrCode will return the error code based on the error data type +func (e WebhookError) ErrCode() string { + return "WEBHOOK_ERROR" +} + +// StatusCode will return the HTTP status code based on the error data type +func (e WebhookError) StatusCode() int { + return http.StatusInternalServerError +} + const ( ErrInvalidJID = InvalidJID("your JID is invalid") ) diff --git a/src/pkg/whatsapp/whatsapp.go b/src/pkg/whatsapp/whatsapp.go index f271995..b4bc9be 100644 --- a/src/pkg/whatsapp/whatsapp.go +++ b/src/pkg/whatsapp/whatsapp.go @@ -108,7 +108,7 @@ func InitWaDB() *sqlstore.Container { storeContainer, err := sqlstore.New("sqlite3", fmt.Sprintf("file:%s/%s?_foreign_keys=off", config.PathStorages, config.DBName), dbLog) if err != nil { log.Errorf("Failed to connect to database: %v", err) - panic(err) + panic(pkgError.InternalServerError(fmt.Sprintf("Failed to connect to database: %v", err))) } return storeContainer @@ -133,6 +133,9 @@ func InitWaCLI(storeContainer *sqlstore.Container) *whatsmeow.Client { } func MustLogin(waCli *whatsmeow.Client) { + if waCli == nil { + panic(pkgError.InternalServerError("Whatsapp client is not initialized")) + } if !waCli.IsConnected() { panic(pkgError.AuthError("you are not connect to services server, please reconnect")) } else if !waCli.IsLoggedIn() { @@ -279,13 +282,13 @@ func sendAutoReplyWebhook(evt *events.Message) error { req, err := http.NewRequestWithContext(context.Background(), http.MethodPost, config.WhatsappAutoReplyWebhook, bytes.NewBuffer(postBody)) if err != nil { log.Errorf("error when create http object %v", err) - return err + return pkgError.WebhookError(fmt.Sprintf("error when create http object %v", err)) } req.Header.Set("Content-Type", "application/json") resp, err := client.Do(req) if err != nil { log.Errorf("error when submit webhook %v", err) - return err + return pkgError.WebhookError(fmt.Sprintf("error when submit webhook %v", err)) } defer resp.Body.Close() return nil diff --git a/src/services/send.go b/src/services/send.go index 727a81a..e7eb7a2 100644 --- a/src/services/send.go +++ b/src/services/send.go @@ -8,6 +8,7 @@ import ( pkgError "github.com/aldinokemal/go-whatsapp-web-multidevice/pkg/error" "github.com/aldinokemal/go-whatsapp-web-multidevice/pkg/utils" "github.com/aldinokemal/go-whatsapp-web-multidevice/pkg/whatsapp" + "github.com/aldinokemal/go-whatsapp-web-multidevice/validations" fiberUtils "github.com/gofiber/fiber/v2/utils" "github.com/h2non/bimg" "github.com/valyala/fasthttp" @@ -31,6 +32,10 @@ func NewSendService(waCli *whatsmeow.Client) domainSend.ISendService { } func (service serviceSend) SendText(ctx context.Context, request domainSend.MessageRequest) (response domainSend.MessageResponse, err error) { + err = validations.ValidateSendMessage(request) + if err != nil { + return response, err + } dataWaRecipient, err := whatsapp.ValidateJidWithLogin(service.WaCli, request.Phone) if err != nil { return response, err @@ -49,6 +54,10 @@ func (service serviceSend) SendText(ctx context.Context, request domainSend.Mess } func (service serviceSend) SendImage(ctx context.Context, request domainSend.ImageRequest) (response domainSend.ImageResponse, err error) { + err = validations.ValidateSendImage(request) + if err != nil { + return response, err + } dataWaRecipient, err := whatsapp.ValidateJidWithLogin(service.WaCli, request.Phone) if err != nil { return response, err @@ -143,6 +152,10 @@ func (service serviceSend) SendImage(ctx context.Context, request domainSend.Ima } func (service serviceSend) SendFile(ctx context.Context, request domainSend.FileRequest) (response domainSend.FileResponse, err error) { + err = validations.ValidateSendFile(request) + if err != nil { + return response, err + } dataWaRecipient, err := whatsapp.ValidateJidWithLogin(service.WaCli, request.Phone) if err != nil { return response, err @@ -194,6 +207,10 @@ func (service serviceSend) SendFile(ctx context.Context, request domainSend.File } func (service serviceSend) SendVideo(ctx context.Context, request domainSend.VideoRequest) (response domainSend.VideoResponse, err error) { + err = validations.ValidateSendVideo(request) + if err != nil { + return response, err + } dataWaRecipient, err := whatsapp.ValidateJidWithLogin(service.WaCli, request.Phone) if err != nil { return response, err @@ -297,6 +314,10 @@ func (service serviceSend) SendVideo(ctx context.Context, request domainSend.Vid } func (service serviceSend) SendContact(ctx context.Context, request domainSend.ContactRequest) (response domainSend.ContactResponse, err error) { + err = validations.ValidateSendContact(request) + if err != nil { + return response, err + } dataWaRecipient, err := whatsapp.ValidateJidWithLogin(service.WaCli, request.Phone) if err != nil { return response, err @@ -320,6 +341,10 @@ func (service serviceSend) SendContact(ctx context.Context, request domainSend.C } func (service serviceSend) SendLink(ctx context.Context, request domainSend.LinkRequest) (response domainSend.LinkResponse, err error) { + err = validations.ValidateSendLink(request) + if err != nil { + return response, err + } dataWaRecipient, err := whatsapp.ValidateJidWithLogin(service.WaCli, request.Phone) if err != nil { return response, err @@ -348,6 +373,10 @@ func (service serviceSend) SendLink(ctx context.Context, request domainSend.Link } func (service serviceSend) Revoke(_ context.Context, request domainSend.RevokeRequest) (response domainSend.RevokeResponse, err error) { + err = validations.ValidateRevokeMessage(request) + if err != nil { + return response, err + } dataWaRecipient, err := whatsapp.ValidateJidWithLogin(service.WaCli, request.Phone) if err != nil { return response, err @@ -365,6 +394,10 @@ func (service serviceSend) Revoke(_ context.Context, request domainSend.RevokeRe } func (service serviceSend) UpdateMessage(ctx context.Context, request domainSend.UpdateMessageRequest) (response domainSend.UpdateMessageResponse, err error) { + err = validations.ValidateUpdateMessage(request) + if err != nil { + return response, err + } dataWaRecipient, err := whatsapp.ValidateJidWithLogin(service.WaCli, request.Phone) if err != nil { return response, err diff --git a/src/services/user.go b/src/services/user.go index 6075ff9..16a825b 100644 --- a/src/services/user.go +++ b/src/services/user.go @@ -6,6 +6,7 @@ import ( "fmt" domainUser "github.com/aldinokemal/go-whatsapp-web-multidevice/domains/user" "github.com/aldinokemal/go-whatsapp-web-multidevice/pkg/whatsapp" + "github.com/aldinokemal/go-whatsapp-web-multidevice/validations" "go.mau.fi/whatsmeow" "go.mau.fi/whatsmeow/types" ) @@ -21,6 +22,10 @@ func NewUserService(waCli *whatsmeow.Client) domainUser.IUserService { } func (service userService) Info(_ context.Context, request domainUser.InfoRequest) (response domainUser.InfoResponse, err error) { + err = validations.ValidateUserInfo(request) + if err != nil { + return response, err + } var jids []types.JID dataWaRecipient, err := whatsapp.ValidateJidWithLogin(service.WaCli, request.Phone) if err != nil { @@ -60,6 +65,10 @@ func (service userService) Info(_ context.Context, request domainUser.InfoReques } func (service userService) Avatar(_ context.Context, request domainUser.AvatarRequest) (response domainUser.AvatarResponse, err error) { + err = validations.ValidateUserAvatar(request) + if err != nil { + return response, err + } dataWaRecipient, err := whatsapp.ValidateJidWithLogin(service.WaCli, request.Phone) if err != nil { return response, err