Browse Source

feat: add get user info & avatar

pull/3/head
Aldino Kemal 4 years ago
parent
commit
f58fc3ae99
  1. 59
      controllers/user_controller.go
  2. 10
      main.go
  3. 11
      services/user_service.go
  4. 79
      services/user_service_impl.go
  5. 45
      structs/send_struct.go
  6. 23
      validations/send_validation.go

59
controllers/user_controller.go

@ -0,0 +1,59 @@
package controllers
import (
"github.com/aldinokemal/go-whatsapp-web-multidevice/services"
"github.com/aldinokemal/go-whatsapp-web-multidevice/structs"
"github.com/aldinokemal/go-whatsapp-web-multidevice/utils"
"github.com/aldinokemal/go-whatsapp-web-multidevice/validations"
"github.com/gofiber/fiber/v2"
)
type UserController struct {
Service services.UserService
}
func NewUserController(service services.UserService) UserController {
return UserController{Service: service}
}
func (controller *UserController) Route(app *fiber.App) {
app.Get("/user/info", controller.UserInfo)
app.Get("/user/avatar", controller.UserAvatar)
}
func (controller *UserController) UserInfo(c *fiber.Ctx) error {
var request structs.UserInfoRequest
err := c.QueryParser(&request)
utils.PanicIfNeeded(err)
// add validation send message
validations.ValidateUserInfo(request)
request.PhoneNumber = request.PhoneNumber + "@s.whatsapp.net"
response, err := controller.Service.UserInfo(c, request)
utils.PanicIfNeeded(err)
return c.JSON(utils.ResponseData{
Code: 200,
Message: "Success",
Results: response,
})
}
func (controller *UserController) UserAvatar(c *fiber.Ctx) error {
var request structs.UserAvatarRequest
err := c.QueryParser(&request)
utils.PanicIfNeeded(err)
// add validation send message
validations.ValidateUserAvatar(request)
request.PhoneNumber = request.PhoneNumber + "@s.whatsapp.net"
response, err := controller.Service.UserAvatar(c, request)
utils.PanicIfNeeded(err)
return c.JSON(utils.ResponseData{
Code: 200,
Message: "Success",
Results: response,
})
}

10
main.go

@ -25,15 +25,19 @@ func main() {
cli := utils.InitWaCLI(db)
// Service
AppService := services.NewAppService(cli)
appService := services.NewAppService(cli)
sendService := services.NewSendService(cli)
userService := services.NewUserService(cli)
// Controller
AppController := controllers.NewAppController(AppService)
appController := controllers.NewAppController(appService)
sendController := controllers.NewSendController(sendService)
userController := controllers.NewUserController(userService)
AppController.Route(app)
appController.Route(app)
sendController.Route(app)
userController.Route(app)
app.Get("/", func(ctx *fiber.Ctx) error {
return ctx.JSON(map[string]interface{}{"Status": "Ok"})
})

11
services/user_service.go

@ -0,0 +1,11 @@
package services
import (
"github.com/aldinokemal/go-whatsapp-web-multidevice/structs"
"github.com/gofiber/fiber/v2"
)
type UserService interface {
UserInfo(c *fiber.Ctx, request structs.UserInfoRequest) (response structs.UserInfoResponse, err error)
UserAvatar(c *fiber.Ctx, request structs.UserAvatarRequest) (response structs.UserAvatarResponse, err error)
}

79
services/user_service_impl.go

@ -0,0 +1,79 @@
package services
import (
"errors"
"fmt"
"github.com/aldinokemal/go-whatsapp-web-multidevice/structs"
"github.com/aldinokemal/go-whatsapp-web-multidevice/utils"
"github.com/gofiber/fiber/v2"
"go.mau.fi/whatsmeow"
"go.mau.fi/whatsmeow/types"
)
type UserServiceImpl struct {
WaCli *whatsmeow.Client
}
func NewUserService(waCli *whatsmeow.Client) UserService {
return &UserServiceImpl{
WaCli: waCli,
}
}
func (service UserServiceImpl) UserInfo(c *fiber.Ctx, request structs.UserInfoRequest) (response structs.UserInfoResponse, err error) {
var jids []types.JID
jid, ok := utils.ParseJID(request.PhoneNumber)
if !ok {
return response, errors.New("invalid JID " + request.PhoneNumber)
}
jids = append(jids, jid)
resp, err := service.WaCli.GetUserInfo(jids)
if err != nil {
return response, err
}
for _, userInfo := range resp {
var device []structs.UserInfoResponseDataDevice
for _, j := range userInfo.Devices {
device = append(device, structs.UserInfoResponseDataDevice{
User: j.User,
Agent: j.Agent,
Device: j.Device,
Server: j.Server,
AD: j.AD,
})
}
data := structs.UserInfoResponseData{
Status: userInfo.Status,
PictureID: userInfo.PictureID,
Devices: device,
}
if userInfo.VerifiedName != nil {
data.VerifiedName = fmt.Sprintf("%v", *userInfo.VerifiedName)
}
response.Data = append(response.Data, data)
}
return response, nil
}
func (service UserServiceImpl) UserAvatar(c *fiber.Ctx, request structs.UserAvatarRequest) (response structs.UserAvatarResponse, err error) {
jid, ok := utils.ParseJID(request.PhoneNumber)
if !ok {
return response, errors.New("invalid JID " + request.PhoneNumber)
}
pic, err := service.WaCli.GetProfilePictureInfo(jid, false)
if err != nil {
return response, err
} else if pic == nil {
return response, errors.New("no avatar found")
} else {
response.URL = pic.URL
response.ID = pic.ID
response.Type = pic.Type
return response, nil
}
}

45
structs/send_struct.go

@ -1,6 +1,47 @@
package structs
import "mime/multipart"
import (
"mime/multipart"
)
// ============================== USER ==============================
type UserInfoRequest struct {
PhoneNumber string `json:"phone_number" query:"phone_number"`
}
type UserInfoResponseDataDevice struct {
User string
Agent uint8
Device uint8
Server string
AD bool
}
type UserInfoResponseData struct {
VerifiedName string `json:"verified_name"`
Status string `json:"status"`
PictureID string `json:"picture_id"`
Devices []UserInfoResponseDataDevice `json:"devices"`
}
type UserInfoResponse struct {
Data []UserInfoResponseData `json:"data"`
}
type UserAvatarRequest struct {
PhoneNumber string `json:"phone_number" query:"phone_number"`
}
type UserAvatarResponse struct {
URL string `json:"url"`
ID string `json:"id"`
Type string `json:"type"`
}
// ============================== END USER ==============================
// ============================== SEND ==============================
type SendMessageRequest struct {
PhoneNumber string `json:"phone_number" form:"phone_number"`
@ -21,3 +62,5 @@ type SendImageRequest struct {
type SendImageResponse struct {
Status string `json:"status"`
}
// ============================== END SEND ==============================

23
validations/send_validation.go

@ -8,6 +8,29 @@ import (
"strings"
)
func ValidateUserInfo(request structs.UserInfoRequest) {
err := validation.ValidateStruct(&request,
validation.Field(&request.PhoneNumber, validation.Required, is.E164, validation.Length(10, 15)),
)
if err != nil {
panic(utils.ValidationError{
Message: err.Error(),
})
}
}
func ValidateUserAvatar(request structs.UserAvatarRequest) {
err := validation.ValidateStruct(&request,
validation.Field(&request.PhoneNumber, validation.Required, is.E164, validation.Length(10, 15)),
)
if err != nil {
panic(utils.ValidationError{
Message: err.Error(),
})
}
}
func ValidateSendMessage(request structs.SendMessageRequest) {
err := validation.ValidateStruct(&request,
validation.Field(&request.PhoneNumber, validation.Required, is.E164, validation.Length(10, 15)),

Loading…
Cancel
Save