Browse Source

feat: move validation to service (#41)

* feat: move validation to service layer

* feat: change Whatsapp return error
pull/42/head
Aldino Kemal 3 years ago
committed by GitHub
parent
commit
409e3d6a22
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 29
      src/internal/rest/send.go
  2. 7
      src/internal/rest/user.go
  3. 17
      src/pkg/error/whatsapp_error.go
  4. 9
      src/pkg/whatsapp/whatsapp.go
  5. 33
      src/services/send.go
  6. 9
      src/services/user.go

29
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)

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

17
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")
)

9
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

33
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

9
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

Loading…
Cancel
Save