package messenger import ( "context" "errors" "fmt" "github.com/SamuelTariku/FortuneBet-Backend/internal/domain" afro "github.com/amanuelabay/afrosms-go" "github.com/twilio/twilio-go" twilioApi "github.com/twilio/twilio-go/rest/api/v2010" ) var ( ErrSMSProviderNotFound = errors.New("SMS Provider Not Found") ) // If the company id is valid, it is a company based notification else its a global notification (by the super admin) func (s *Service) SendSMS(ctx context.Context, receiverPhone, message string, companyID domain.ValidInt64) error { var settingsList domain.SettingList var err error if companyID.Valid { settingsList, err = s.settingSvc.GetOverrideSettingsList(ctx, companyID.Value) if err != nil { // TODO: Send a log about the error return err } } else { settingsList, err = s.settingSvc.GetGlobalSettingList(ctx) if err != nil { // TODO: Send a log about the error return err } } switch settingsList.SMSProvider { case domain.AfroMessage: return s.SendAfroMessageSMS(ctx, receiverPhone, message) case domain.TwilioSms: return s.SendTwilioSMS(ctx, receiverPhone, message) default: return ErrSMSProviderNotFound } } func (s *Service) SendAfroMessageSMS(ctx context.Context, receiverPhone, message string) error { apiKey := s.config.AFRO_SMS_API_KEY senderName := s.config.AFRO_SMS_SENDER_NAME hostURL := s.config.ADRO_SMS_HOST_URL endpoint := "/api/send" // API endpoint has been updated // TODO: no need for package for the afro message operations (pretty simple stuff) request := afro.GetRequest(apiKey, endpoint, hostURL) request.BaseURL = "https://api.afromessage.com/api/send" request.Method = "GET" request.Sender(senderName) request.To(receiverPhone, message) response, err := afro.MakeRequestWithContext(ctx, request) if err != nil { return err } if response["acknowledge"] == "success" { return nil } else { fmt.Println(response["response"].(map[string]interface{})) return errors.New("SMS delivery failed") } } func (s *Service) SendTwilioSMS(ctx context.Context, receiverPhone, message string) error { accountSid := s.config.TwilioAccountSid authToken := s.config.TwilioAuthToken senderPhone := s.config.TwilioSenderPhoneNumber client := twilio.NewRestClientWithParams(twilio.ClientParams{ Username: accountSid, Password: authToken, }) params := &twilioApi.CreateMessageParams{} params.SetTo(receiverPhone) params.SetFrom(senderPhone) params.SetBody(message) _, err := client.Api.CreateMessage(params) if err != nil { return fmt.Errorf("%s", "Error sending SMS message: %s"+err.Error()) } return nil }