sms.go 1.95 KiB
Newer Older
Mayuri Shinde's avatar
Mayuri Shinde committed
package sms

import (
	"net/http"
	"net/url"
	"sync"

	"corelab.mkcl.org/MKCLOS/coredevelopmentplatform/corepkgv2/configmdl"
	"corelab.mkcl.org/MKCLOS/coredevelopmentplatform/corepkgv2/constantmdl"
	"corelab.mkcl.org/MKCLOS/coredevelopmentplatform/corepkgv2/errormdl"
	"corelab.mkcl.org/MKCLOS/coredevelopmentplatform/corepkgv2/loggermdl"
)

type SMSConfig struct {
	SMSGatewayUrl string
	UserName      string
	Password      string
	SenderID      string
	CDMAHeader    string
}

var once sync.Once
var config = SMSConfig{}
var smsInitError error

// Init - initializes toml file configurations
func Init(tomlFilepath string) error {
	once.Do(func() {
		_, err := configmdl.InitConfig(tomlFilepath, &config)
		if errormdl.CheckErr(err) != nil {
			loggermdl.LogError(err)
			smsInitError = err
			return
		}
	})
	return smsInitError
}

// SendSMS -
func SendSMS(message string, mobileNumber string) error {
	// define url
	var Url *url.URL

	// add url
	Url, parseErr := url.Parse(config.SMSGatewayUrl)
	if errormdl.CheckErr(parseErr) != nil {
		loggermdl.LogError("error occured while connect with SMS gateway : ", errormdl.CheckErr(parseErr))
		return parseErr
	}

	// add url parameters
	urlParameters := url.Values{}
	urlParameters.Add("username", config.UserName)
	urlParameters.Add("password", config.Password)
	if len(mobileNumber) == 0 {
		loggermdl.LogError("error occured while calling SendSMS : ", errormdl.Wrap("Mobile number empty"))
		return errormdl.Wrap("Mobile number empty")
	}
	urlParameters.Add("to", constantmdl.COUNTRYCODE+mobileNumber)
	urlParameters.Add("from", config.CDMAHeader)
	urlParameters.Add("text", message)

	// encode url
	Url.RawQuery = urlParameters.Encode()

	// send get request
	response, getErr := http.Get(Url.String())
	if errormdl.CheckErr1(getErr) != nil {
		loggermdl.LogError("error occured while calling SendSMS : ", errormdl.CheckErr1(getErr))
		if response != nil {
			response.Body.Close()
		}
		return getErr
	}

	response.Body.Close()
	return nil
}