diff --git a/controllers/send_controller.go b/controllers/send_controller.go index 69a84ec..ca53abb 100644 --- a/controllers/send_controller.go +++ b/controllers/send_controller.go @@ -30,7 +30,7 @@ func (controller *SendController) SendText(c *fiber.Ctx) error { // add validation send message validations.ValidateSendMessage(request) - request.PhoneNumber = request.PhoneNumber + "@s.whatsapp.net" + request.Phone = request.Phone + "@s.whatsapp.net" response, err := controller.Service.SendText(c, request) utils.PanicIfNeeded(err) @@ -54,7 +54,7 @@ func (controller *SendController) SendImage(c *fiber.Ctx) error { //add validation send image validations.ValidateSendImage(request) - request.PhoneNumber = request.PhoneNumber + "@s.whatsapp.net" + request.Phone = request.Phone + "@s.whatsapp.net" response, err := controller.Service.SendImage(c, request) utils.PanicIfNeeded(err) @@ -78,7 +78,7 @@ func (controller *SendController) SendFile(c *fiber.Ctx) error { //add validation send image validations.ValidateSendFile(request) - request.PhoneNumber = request.PhoneNumber + "@s.whatsapp.net" + request.Phone = request.Phone + "@s.whatsapp.net" response, err := controller.Service.SendFile(c, request) utils.PanicIfNeeded(err) diff --git a/controllers/user_controller.go b/controllers/user_controller.go index 931ec16..382ec3a 100644 --- a/controllers/user_controller.go +++ b/controllers/user_controller.go @@ -31,7 +31,7 @@ func (controller *UserController) UserInfo(c *fiber.Ctx) error { // add validation send message validations.ValidateUserInfo(request) - request.PhoneNumber = request.PhoneNumber + "@s.whatsapp.net" + request.Phone = request.Phone + "@s.whatsapp.net" response, err := controller.Service.UserInfo(c, request) utils.PanicIfNeeded(err) @@ -50,7 +50,7 @@ func (controller *UserController) UserAvatar(c *fiber.Ctx) error { // add validation send message validations.ValidateUserAvatar(request) - request.PhoneNumber = request.PhoneNumber + "@s.whatsapp.net" + request.Phone = request.Phone + "@s.whatsapp.net" response, err := controller.Service.UserAvatar(c, request) utils.PanicIfNeeded(err) diff --git a/readme.md b/readme.md index 9c320a6..1a53ce7 100644 --- a/readme.md +++ b/readme.md @@ -28,14 +28,14 @@ Current API | ✅ | Login | GET | /app/login | | | ✅ | Logout | GET | /app/logout | | | ✅ | Reconnect | GET | /app/reconnect | | -| ✅ | User Info | GET | /user/info |
Param Type Type Example
phone_numberstringquerystring6289685024099
| -| ✅ | User Avatar | GET | /user/avatar |
Param Type Type Example
phone_numberstringquerystring6289685024099
| +| ✅ | User Info | GET | /user/info |
Param Type Type Example
phonestringquerystring6289685024099
| +| ✅ | User Avatar | GET | /user/avatar |
Param Type Type Example
phonestringquerystring6289685024099
| | ✅ | User My Group List | GET | /user/my/groups | | | ✅ | User My Privacy Setting | GET | /user/my/privacy | | -| ✅ | Send Message (Text) | POST | /send/message |
Param Type Type Example
phone_numberstringform-data6289685024099
messagestringform-dataHello guys this is testing
| -| ✅ | Send Message (Image) | POST | /send/image |
Param Type Type Example
phone_numberstringform-data6289685024099
captionstringform-dataHello guys this is caption
view_onceboolform-datafalse
imagebinaryform-dataimage/jpg,image/jpeg,image/png
| -| ✅ | Send Message (File) | POST | /send/file |
ParamTypeTypeExample
phone_numberstringform-data6289685024099
filebinaryform-dataany (max: 10MB)
| -| ❌ | Send Message (Video) | POST | /send/video |
ParamTypeTypeExample
phone_numberstringform-data6289685024099
videobinaryform-datamp4/avi/mkv
| +| ✅ | Send Message (Text) | POST | /send/message |
Param Type Type Example
phonestringform-data6289685024099
messagestringform-dataHello guys this is testing
| +| ✅ | Send Message (Image) | POST | /send/image |
Param Type Type Example
phonestringform-data6289685024099
captionstringform-dataHello guys this is caption
view_onceboolform-datafalse
imagebinaryform-dataimage/jpg,image/jpeg,image/png
| +| ✅ | Send Message (File) | POST | /send/file |
ParamTypeTypeExample
phonestringform-data6289685024099
filebinaryform-dataany (max: 10MB)
| +| ❌ | Send Message (Video) | POST | /send/video |
ParamTypeTypeExample
phonestringform-data6289685024099
videobinaryform-datamp4/avi/mkv
| ``` ✅ = Available diff --git a/services/send_service_impl.go b/services/send_service_impl.go index 41f6349..2d08e3b 100644 --- a/services/send_service_impl.go +++ b/services/send_service_impl.go @@ -28,12 +28,11 @@ func NewSendService(waCli *whatsmeow.Client) SendService { } func (service SendServiceImpl) SendText(_ *fiber.Ctx, request structs.SendMessageRequest) (response structs.SendMessageResponse, err error) { - if !service.WaCli.IsLoggedIn() { - panic(utils.AuthError{Message: "you are not loggin"}) - } - recipient, ok := utils.ParseJID(request.PhoneNumber) + utils.MustLogin(service.WaCli) + + recipient, ok := utils.ParseJID(request.Phone) if !ok { - return response, errors.New("invalid JID " + request.PhoneNumber) + return response, errors.New("invalid JID " + request.Phone) } msg := &waProto.Message{Conversation: proto.String(request.Message)} ts, err := service.WaCli.SendMessage(recipient, "", msg) @@ -46,9 +45,8 @@ func (service SendServiceImpl) SendText(_ *fiber.Ctx, request structs.SendMessag } func (service SendServiceImpl) SendImage(c *fiber.Ctx, request structs.SendImageRequest) (response structs.SendImageResponse, err error) { - if !service.WaCli.IsLoggedIn() { - panic(utils.AuthError{Message: "you are not loggin"}) - } + utils.MustLogin(service.WaCli) + // Resize image oriImagePath := fmt.Sprintf("%s/%s", config.PathSendItems, request.Image.Filename) err = c.SaveFile(request.Image, oriImagePath) @@ -80,9 +78,9 @@ func (service SendServiceImpl) SendImage(c *fiber.Ctx, request structs.SendImage // Send to WA server dataWaCaption := request.Caption - dataWaRecipient, ok := utils.ParseJID(request.PhoneNumber) + dataWaRecipient, ok := utils.ParseJID(request.Phone) if !ok { - return response, errors.New("invalid JID " + request.PhoneNumber) + return response, errors.New("invalid JID " + request.Phone) } dataWaImage, err := os.ReadFile(newImagePath) if err != nil { @@ -116,9 +114,8 @@ func (service SendServiceImpl) SendImage(c *fiber.Ctx, request structs.SendImage } func (service SendServiceImpl) SendFile(c *fiber.Ctx, request structs.SendFileRequest) (response structs.SendFileResponse, err error) { - if !service.WaCli.IsLoggedIn() { - panic(utils.AuthError{Message: "you are not loggin"}) - } + utils.MustLogin(service.WaCli) + // Resize image oriFilePath := fmt.Sprintf("%s/%s", config.PathSendItems, request.File.Filename) err = c.SaveFile(request.File, oriFilePath) @@ -138,9 +135,9 @@ func (service SendServiceImpl) SendFile(c *fiber.Ctx, request structs.SendFileRe } // Send to WA server - dataWaRecipient, ok := utils.ParseJID(request.PhoneNumber) + dataWaRecipient, ok := utils.ParseJID(request.Phone) if !ok { - return response, errors.New("invalid JID " + request.PhoneNumber) + return response, errors.New("invalid JID " + request.Phone) } dataWaFile, err := os.ReadFile(oriFilePath) if err != nil { diff --git a/services/user_service_impl.go b/services/user_service_impl.go index 5ef6dc5..253add1 100644 --- a/services/user_service_impl.go +++ b/services/user_service_impl.go @@ -21,13 +21,12 @@ func NewUserService(waCli *whatsmeow.Client) UserService { } func (service UserServiceImpl) UserInfo(_ *fiber.Ctx, request structs.UserInfoRequest) (response structs.UserInfoResponse, err error) { - if !service.WaCli.IsLoggedIn() { - panic(utils.AuthError{Message: "you are not loggin"}) - } + utils.MustLogin(service.WaCli) + var jids []types.JID - jid, ok := utils.ParseJID(request.PhoneNumber) + jid, ok := utils.ParseJID(request.Phone) if !ok { - return response, errors.New("invalid JID " + request.PhoneNumber) + return response, errors.New("invalid JID " + request.Phone) } jids = append(jids, jid) @@ -63,12 +62,11 @@ func (service UserServiceImpl) UserInfo(_ *fiber.Ctx, request structs.UserInfoRe } func (service UserServiceImpl) UserAvatar(_ *fiber.Ctx, request structs.UserAvatarRequest) (response structs.UserAvatarResponse, err error) { - if !service.WaCli.IsLoggedIn() { - panic(utils.AuthError{Message: "you are not loggin"}) - } - jid, ok := utils.ParseJID(request.PhoneNumber) + utils.MustLogin(service.WaCli) + + jid, ok := utils.ParseJID(request.Phone) if !ok { - return response, errors.New("invalid JID " + request.PhoneNumber) + return response, errors.New("invalid JID " + request.Phone) } pic, err := service.WaCli.GetProfilePictureInfo(jid, false) if err != nil { @@ -85,6 +83,8 @@ func (service UserServiceImpl) UserAvatar(_ *fiber.Ctx, request structs.UserAvat } func (service UserServiceImpl) UserMyListGroups(_ *fiber.Ctx) (response structs.UserMyListGroupsResponse, err error) { + utils.MustLogin(service.WaCli) + groups, err := service.WaCli.GetJoinedGroups() if err != nil { return @@ -99,6 +99,8 @@ func (service UserServiceImpl) UserMyListGroups(_ *fiber.Ctx) (response structs. } func (service UserServiceImpl) UserMyPrivacySetting(_ *fiber.Ctx) (response structs.UserMyPrivacySettingResponse, err error) { + utils.MustLogin(service.WaCli) + resp, err := service.WaCli.TryFetchPrivacySettings(false) if err != nil { return diff --git a/structs/send_struct.go b/structs/send_struct.go index 4d808dc..23298c8 100644 --- a/structs/send_struct.go +++ b/structs/send_struct.go @@ -8,7 +8,7 @@ import ( // ============================== USER ============================== type UserInfoRequest struct { - PhoneNumber string `json:"phone_number" query:"phone_number"` + Phone string `json:"phone" query:"phone"` } type UserInfoResponseDataDevice struct { @@ -31,7 +31,7 @@ type UserInfoResponse struct { } type UserAvatarRequest struct { - PhoneNumber string `json:"phone_number" query:"phone_number"` + Phone string `json:"phone" query:"phone"` } type UserAvatarResponse struct { @@ -57,8 +57,8 @@ type UserMyListGroupsResponse struct { // ============================== SEND ============================== type SendMessageRequest struct { - PhoneNumber string `json:"phone_number" form:"phone_number"` - Message string `json:"message" form:"message"` + Phone string `json:"phone" form:"phone"` + Message string `json:"message" form:"message"` } type SendMessageResponse struct { @@ -66,10 +66,10 @@ type SendMessageResponse struct { } type SendImageRequest struct { - PhoneNumber string `json:"phone_number" form:"phone_number"` - Caption string `json:"caption" form:"caption"` - Image *multipart.FileHeader `json:"image" form:"image"` - ViewOnce bool `json:"view_once" form:"view_once"` + Phone string `json:"phone" form:"phone"` + Caption string `json:"caption" form:"caption"` + Image *multipart.FileHeader `json:"image" form:"image"` + ViewOnce bool `json:"view_once" form:"view_once"` } type SendImageResponse struct { @@ -77,8 +77,8 @@ type SendImageResponse struct { } type SendFileRequest struct { - PhoneNumber string `json:"phone_number" form:"phone_number"` - File *multipart.FileHeader `json:"file" form:"file"` + Phone string `json:"phone" form:"phone"` + File *multipart.FileHeader `json:"file" form:"file"` } type SendFileResponse struct { diff --git a/utils/whatsapp.go b/utils/whatsapp.go index fec3823..5d4b924 100644 --- a/utils/whatsapp.go +++ b/utils/whatsapp.go @@ -76,6 +76,14 @@ func InitWaCLI(storeContainer *sqlstore.Container) *whatsmeow.Client { return cli } +func MustLogin(waCli *whatsmeow.Client) { + if !waCli.IsConnected() { + panic(AuthError{Message: "you are not connect to whatsapp server, please reconnect"}) + } else if !waCli.IsLoggedIn() { + panic(AuthError{Message: "you are not login"}) + } +} + func handler(rawEvt interface{}) { switch evt := rawEvt.(type) { case *events.AppStateSyncComplete: diff --git a/validations/send_validation.go b/validations/send_validation.go index 1fa6d04..16d463f 100644 --- a/validations/send_validation.go +++ b/validations/send_validation.go @@ -10,7 +10,7 @@ import ( func ValidateSendMessage(request structs.SendMessageRequest) { err := validation.ValidateStruct(&request, - validation.Field(&request.PhoneNumber, validation.Required, is.E164, validation.Length(10, 15)), + validation.Field(&request.Phone, validation.Required, is.E164, validation.Length(10, 15)), validation.Field(&request.Message, validation.Required, validation.Length(4, 50)), ) @@ -18,7 +18,7 @@ func ValidateSendMessage(request structs.SendMessageRequest) { panic(utils.ValidationError{ Message: err.Error(), }) - } else if !strings.HasPrefix(request.PhoneNumber, "62") { + } else if !strings.HasPrefix(request.Phone, "62") { panic(utils.ValidationError{ Message: "this is only work for indonesia country (start with 62)", }) @@ -27,7 +27,7 @@ func ValidateSendMessage(request structs.SendMessageRequest) { func ValidateSendImage(request structs.SendImageRequest) { err := validation.ValidateStruct(&request, - validation.Field(&request.PhoneNumber, validation.Required, is.E164, validation.Length(10, 15)), + validation.Field(&request.Phone, validation.Required, is.E164, validation.Length(10, 15)), validation.Field(&request.Caption, validation.When(true, validation.Length(4, 200))), validation.Field(&request.Image, validation.Required), ) @@ -36,7 +36,7 @@ func ValidateSendImage(request structs.SendImageRequest) { panic(utils.ValidationError{ Message: err.Error(), }) - } else if !strings.HasPrefix(request.PhoneNumber, "62") { + } else if !strings.HasPrefix(request.Phone, "62") { panic(utils.ValidationError{ Message: "this is only work for indonesia country (start with 62)", }) @@ -58,7 +58,7 @@ func ValidateSendImage(request structs.SendImageRequest) { func ValidateSendFile(request structs.SendFileRequest) { err := validation.ValidateStruct(&request, - validation.Field(&request.PhoneNumber, validation.Required, is.E164, validation.Length(10, 15)), + validation.Field(&request.Phone, validation.Required, is.E164, validation.Length(10, 15)), validation.Field(&request.File, validation.Required), ) @@ -66,7 +66,7 @@ func ValidateSendFile(request structs.SendFileRequest) { panic(utils.ValidationError{ Message: err.Error(), }) - } else if !strings.HasPrefix(request.PhoneNumber, "62") { + } else if !strings.HasPrefix(request.Phone, "62") { panic(utils.ValidationError{ Message: "this is only work for indonesia country (start with 62)", }) diff --git a/validations/user_validation.go b/validations/user_validation.go index cdbe067..5d6e83b 100644 --- a/validations/user_validation.go +++ b/validations/user_validation.go @@ -9,7 +9,7 @@ import ( func ValidateUserInfo(request structs.UserInfoRequest) { err := validation.ValidateStruct(&request, - validation.Field(&request.PhoneNumber, validation.Required, is.E164, validation.Length(10, 15)), + validation.Field(&request.Phone, validation.Required, is.E164, validation.Length(10, 15)), ) if err != nil { @@ -20,7 +20,7 @@ func ValidateUserInfo(request structs.UserInfoRequest) { } func ValidateUserAvatar(request structs.UserAvatarRequest) { err := validation.ValidateStruct(&request, - validation.Field(&request.PhoneNumber, validation.Required, is.E164, validation.Length(10, 15)), + validation.Field(&request.Phone, validation.Required, is.E164, validation.Length(10, 15)), ) if err != nil {