From 6721a499a7724b9c084abc49377d472d331f9800 Mon Sep 17 00:00:00 2001 From: Rahul Sutar <rahuls@mkcl.org> Date: Mon, 19 Jun 2017 10:57:23 +0530 Subject: [PATCH] CoreOS Package commit Committing CoreOS package. Blank script file. The script file will have shell commands to install all the dependencies. --- GoGetScript.sh | 0 coreos/DALMySQL.go | 26 ++++++++++++++++++ coreos/DALNoSQL.go | 43 +++++++++++++++++++++++++++++ coreos/DALRedis.go | 20 ++++++++++++++ coreos/EchoHelper.go | 21 +++++++++++++++ coreos/cacheHelper.go | 55 ++++++++++++++++++++++++++++++++++++++ coreos/configHelper.go | 27 +++++++++++++++++++ coreos/dbconfig.go | 29 ++++++++++++++++++++ coreos/dbconfig_test.go | 35 ++++++++++++++++++++++++ coreos/hDataConvertor.go | 25 +++++++++++++++++ coreos/jwtHelper.go | 48 +++++++++++++++++++++++++++++++++ coreos/loggingHelper.go | 48 +++++++++++++++++++++++++++++++++ coreos/smsHelper.go | 45 +++++++++++++++++++++++++++++++ coreos/validationHelper.go | 55 ++++++++++++++++++++++++++++++++++++++ 14 files changed, 477 insertions(+) create mode 100644 GoGetScript.sh create mode 100644 coreos/DALMySQL.go create mode 100644 coreos/DALNoSQL.go create mode 100644 coreos/DALRedis.go create mode 100644 coreos/EchoHelper.go create mode 100644 coreos/cacheHelper.go create mode 100644 coreos/configHelper.go create mode 100644 coreos/dbconfig.go create mode 100644 coreos/dbconfig_test.go create mode 100644 coreos/hDataConvertor.go create mode 100644 coreos/jwtHelper.go create mode 100644 coreos/loggingHelper.go create mode 100644 coreos/smsHelper.go create mode 100644 coreos/validationHelper.go diff --git a/GoGetScript.sh b/GoGetScript.sh new file mode 100644 index 0000000..e69de29 diff --git a/coreos/DALMySQL.go b/coreos/DALMySQL.go new file mode 100644 index 0000000..c725f5d --- /dev/null +++ b/coreos/DALMySQL.go @@ -0,0 +1,26 @@ +package coreos + +import ( + "sync" + + "GolangFullStack/server/api/server/config" + + "github.com/gocraft/dbr" +) + +// Hold a single global connection (pooling provided by sql driver) +var sqlConnection *dbr.Connection +var sqlOnce sync.Once + +//GetSQLConnection to db +func GetSQLConnection() (*dbr.Connection, error) { + sqlOnce.Do(func() { + // create a connection db(e.g. "postgres", "mysql", or "sqlite3") + connection, _ := dbr.Open("mysql", config.MysqlDSN, nil) + + // connection.SetMaxIdleConns(10) + // connection.SetMaxOpenConns(5) + sqlConnection = connection + }) + return sqlConnection, nil +} diff --git a/coreos/DALNoSQL.go b/coreos/DALNoSQL.go new file mode 100644 index 0000000..a6e374a --- /dev/null +++ b/coreos/DALNoSQL.go @@ -0,0 +1,43 @@ +package coreos + +import ( + "GolangFullStack/server/api/server/config" + "fmt" + "sync" + + mgo "gopkg.in/mgo.v2" +) + +var instance *mgo.Session +var once sync.Once + +//GetMongoConnection method +func GetMongoConnection() *mgo.Session { + once.Do(func() { + Host := []string{ + config.MONGODSN, + } + const ( + Username = "" + Password = "" + Database = config.DBNAME + ) + + session, err := mgo.DialWithInfo(&mgo.DialInfo{ + Addrs: Host, + Username: Username, + Password: Password, + Database: Database, + }) + if err != nil { + + } + //defer session.Close() + + fmt.Printf("Connected to replica set %v!\n", session.LiveServers()) + + instance = session + + }) + return instance +} diff --git a/coreos/DALRedis.go b/coreos/DALRedis.go new file mode 100644 index 0000000..f4b876e --- /dev/null +++ b/coreos/DALRedis.go @@ -0,0 +1,20 @@ +package coreos + +import ( + "GolangFullStack/server/api/server/config" + + "github.com/garyburd/redigo/redis" +) + +//GetWorkPool ss +func GetWorkPool() *redis.Pool { + var redisPool = &redis.Pool{ + MaxActive: 5, + MaxIdle: 5, + Wait: true, + Dial: func() (redis.Conn, error) { + return redis.Dial("tcp", config.REDISDSN, redis.DialDatabase(3)) + }, + } + return redisPool +} diff --git a/coreos/EchoHelper.go b/coreos/EchoHelper.go new file mode 100644 index 0000000..fd8fbe7 --- /dev/null +++ b/coreos/EchoHelper.go @@ -0,0 +1,21 @@ +package coreos + +import ( + "sync" + + "github.com/labstack/echo" +) + +var echoInstance *echo.Echo +var echoOnce sync.Once + +//GetEcho method +func GetEcho() *echo.Echo { + echoOnce.Do(func() { + e := echo.New() + + echoInstance = e + + }) + return echoInstance +} diff --git a/coreos/cacheHelper.go b/coreos/cacheHelper.go new file mode 100644 index 0000000..7a71625 --- /dev/null +++ b/coreos/cacheHelper.go @@ -0,0 +1,55 @@ +package coreos + +import ( + "GolangFullStack/server/api/server/config" + "fmt" + "time" + + "github.com/allegro/bigcache" +) + +var bigcacheConfig = bigcache.Config{ + // number of shards (must be a power of 2) + // Shards: 4096, + Shards: config.BIGCACHEShards, + // time after which entry can be evicted + LifeWindow: config.BIGCACHELifeWindow * time.Hour, + // rps * lifeWindow, used only in initial memory allocation + MaxEntriesInWindow: 1000 * 10 * 60, + // MaxEntriesInWindow: 10, + // max entry size in bytes, used only in initial memory allocation + MaxEntrySize: config.BIGCACHEMaxEntrySize, + // prints information about additional memory allocation + Verbose: config.BIGCACHEVerbose, + // cache will not allocate more memory than this limit, value in MB + // if value is reached then the oldest entries can be overridden for the new ones + // 0 value means no size limit + HardMaxCacheSize: config.BIGCACHEHardMaxCacheSize, + // callback fired when the oldest entry is removed because of its + // expiration time or no space left for the new entry. Default value is nil which + // means no callback and it prevents from unwrapping the oldest entry. + OnRemove: nil, +} + +var cache, initErr = bigcache.NewBigCache(bigcacheConfig) + +//GetValue GetValue +func GetValue(key string) ([]byte, error) { + return cache.Get(key) +} + +//SetValue SetValue +func SetValue(key string, value []byte) { + cache.Set(key, value) +} + +//GetLength GetLength +func GetLength() int { + return cache.Len() +} + +//Callback function executed when cache element is removed. +//Executed only when onRemove of cache config poting to this function +func onRemove(key string, entry []byte) { + fmt.Println(key + " removed at " + time.Now().String()) +} diff --git a/coreos/configHelper.go b/coreos/configHelper.go new file mode 100644 index 0000000..e9a2ed7 --- /dev/null +++ b/coreos/configHelper.go @@ -0,0 +1,27 @@ +package coreos + +import ( + "fmt" + + "github.com/spf13/viper" +) + +//InitViper function to initialize viper +func InitViper() { + viper.SetConfigName("config") // name of config file (without extension) + viper.AddConfigPath(".") // optionally look for config in the working directory + err := viper.ReadInConfig() + // Find and read the config file + if err != nil { // Handle errors reading the config file + panic(fmt.Errorf("Fatal error config file %s ", err)) + } +} + +//GetConfig method to get configs from config file +func GetConfig(keyName string) string { + + keyValue := viper.GetString(keyName) + + return keyValue + +} diff --git a/coreos/dbconfig.go b/coreos/dbconfig.go new file mode 100644 index 0000000..7279af7 --- /dev/null +++ b/coreos/dbconfig.go @@ -0,0 +1,29 @@ +package coreos + +import ( + "os" + + "gopkg.in/mgo.v2" +) + +type DB struct { + Session *mgo.Session +} + +func (db *DB) DoDial() (s *mgo.Session, err error) { + return mgo.Dial(DBUrl()) +} + +func (db *DB) Name() string { + return "swapnilapp" +} + +func DBUrl() string { + dburl := os.Getenv("MONGOHQ_URL") + + if dburl == "" { + dburl = "localhost" + } + + return dburl +} diff --git a/coreos/dbconfig_test.go b/coreos/dbconfig_test.go new file mode 100644 index 0000000..b5f02de --- /dev/null +++ b/coreos/dbconfig_test.go @@ -0,0 +1,35 @@ +package coreos + +import ( + "os" + "testing" + + "github.com/stretchr/testify/assert" +) + +var db DB = DB{} + +func cleanEnv() { + os.Setenv("MONGOHQ_URL", "") +} + +func TestGetDbUrl(t *testing.T) { + + assert.Equal(t, "localhost", DBUrl()) + + os.Setenv("MONGOHQ_URL", "abc") + + assert.Equal(t, "abc", DBUrl()) + + cleanEnv() +} + +func TestDBName(t *testing.T) { + assert.Equal(t, "swapnilapp", db.Name()) +} + +func BenchmarkDoDial(b *testing.B) { + for i := 0; i < b.N; i++ { + db.DoDial() + } +} diff --git a/coreos/hDataConvertor.go b/coreos/hDataConvertor.go new file mode 100644 index 0000000..77e9dd1 --- /dev/null +++ b/coreos/hDataConvertor.go @@ -0,0 +1,25 @@ +package coreos + +import ( + "encoding/json" + "log" + + "gopkg.in/mgo.v2/bson" +) + +//ConvertToJSON converts []bson to json +// func ConvertToJSON(data []bson.M) string { +// respBody, err := json.MarshalIndent(data, "", "") +// if err != nil { +// log.Fatal(err) +// } +// return string(respBody) +// } +//ConvertToJSON converts []bson to json +func ConvertToJSON(data []bson.M) string { + respBody, err := json.MarshalIndent(data, "", "") + if err != nil { + log.Fatal(err) + } + return string(respBody) +} diff --git a/coreos/jwtHelper.go b/coreos/jwtHelper.go new file mode 100644 index 0000000..69c976c --- /dev/null +++ b/coreos/jwtHelper.go @@ -0,0 +1,48 @@ +package coreos + +import ( + "fmt" + + "strings" + + jwt "github.com/dgrijalva/jwt-go" + "github.com/labstack/echo/middleware" +) + +const ( + //JwtKey for key of EP + JwtKey = "MKCL-EP-1234567890" +) + +// JwtCustomClaims are custom claims extending default ones. +type JwtCustomClaims struct { + Username string `json:"username"` + jwt.StandardClaims +} + +// GetJwtConfig middleware with the custom claims type +func GetJwtConfig() middleware.JWTConfig { + jwtConfig := middleware.JWTConfig{ + Claims: &JwtCustomClaims{}, + SigningKey: []byte(JwtKey), + } + return jwtConfig +} + +// DecodeToken decode token +func DecodeToken(tokenFromRequest string) jwt.MapClaims { + tokenFromRequest = strings.Trim(strings.Split(tokenFromRequest, "Bearer")[1], " ") + // get data i.e.Claims from token + token, _ := jwt.Parse(tokenFromRequest, func(token *jwt.Token) (interface{}, error) { + // Don't forget to validate the alg is what you expect: + if _, ok := token.Method.(*jwt.SigningMethodRSA); !ok { + return nil, fmt.Errorf("Unexpected signing method: %v", token.Header["alg"]) + } + return JwtKey, nil + }) + claims, ok := token.Claims.(jwt.MapClaims) + if !ok { + return nil + } + return claims +} diff --git a/coreos/loggingHelper.go b/coreos/loggingHelper.go new file mode 100644 index 0000000..594de71 --- /dev/null +++ b/coreos/loggingHelper.go @@ -0,0 +1,48 @@ +package coreos + +import ( + "os" + + "github.com/sirupsen/logrus" +) + +var logger = logrus.New() + +func init() { + //log.Formatter = new(logger.JSONFormatter) + logger.Formatter = new(logrus.TextFormatter) // default + logger.Level = logrus.ErrorLevel + + file, err := os.OpenFile("GolangFullStack.log", os.O_CREATE|os.O_APPEND, 0666) + if err == nil { + logger.Out = file + } else { + logger.Info("Failed to log to file, using default stderr") + } + +} + +//Debug Debug +func Debug(message string) { + logger.Debug(message) +} + +//Info Info +func Info(message string) { + logger.Info(message) +} + +//Warn Warn +func Warn(message string) { + logger.Warn(message) +} + +//Error Error +func Error(message string) { + logger.Error(message) +} + +//Panic Panic +func Panic(message string) { + logger.Panic(message) +} diff --git a/coreos/smsHelper.go b/coreos/smsHelper.go new file mode 100644 index 0000000..e851755 --- /dev/null +++ b/coreos/smsHelper.go @@ -0,0 +1,45 @@ +package coreos + +import ( + "GolangFullStack/server/api/server/config" + "fmt" + "io/ioutil" + "log" + "net/http" + "net/url" +) + +type SMS struct { + MobileNumber string + Message string + UserName string + Password string + SenderID string + CDMAHeader string +} + +// SendSMS : send SMS Service +func SendSMS(smsObject SMS) error { + var postURL string + postURL = config.SMSAPIURL + "?UserName=" + smsObject.UserName + "&password=" + smsObject.Password + "&MobileNo=" + smsObject.MobileNumber + "&SenderID=" + smsObject.SenderID + "&CDMAHeader=" + smsObject.CDMAHeader + "&Message=" + url.QueryEscape(smsObject.Message) + // fmt.Println(postURL) + resp, err := http.Get(postURL) + if err != nil { + // handle error + log.Fatal(err) + } + defer resp.Body.Close() + body, err := ioutil.ReadAll(resp.Body) + fmt.Println(body) + return err +} + +// GetSMSObject : get sms object +func GetSMSObject() SMS { + var smsObject = new(SMS) + smsObject.SenderID = "MKCLTD" + smsObject.UserName = "solar1_trans" + smsObject.Password = "trans123" + smsObject.CDMAHeader = "MKCLTD" + return *smsObject +} diff --git a/coreos/validationHelper.go b/coreos/validationHelper.go new file mode 100644 index 0000000..449466c --- /dev/null +++ b/coreos/validationHelper.go @@ -0,0 +1,55 @@ +package coreos + +import ( + "github.com/go-playground/locales/en" + "gopkg.in/go-playground/validator.v9" + + ut "github.com/go-playground/universal-translator" + en_translations "gopkg.in/go-playground/validator.v9/translations/en" +) + +//Validate method +func Validate(s interface{}) map[string]string { + var validate *validator.Validate + var uni *ut.UniversalTranslator + + validate = validator.New() + + en := en.New() + //mr := mr.New() + + uni = ut.New(en, en) + + trans, _ := uni.GetTranslator("en") + en_translations.RegisterDefaultTranslations(validate, trans) + // mr_translations.RegisterDefaultTranslations(validate, trans) + + //For custom error message + // validate.RegisterTranslation("required", trans, func(ut ut.Translator) error { + // // fmt.Println(ut) + // return ut.Add("required", "{0} must have a value!", true) // see universal-translator for details + + // }, func(ut ut.Translator, fe validator.FieldError) string { + // t, _ := ut.T("required", fe.Field()) + + // return t + // }) + + err := validate.Struct(s) + + if err != nil { + errs := err.(validator.ValidationErrors) + + //customErrs := map[string]string{} + customErrs := make(map[string]string, len(errs)) + + for _, e := range errs { + // can translate each error one at a time. + customErrs[e.Namespace()] = e.Translate(trans) + + } + + return customErrs + } + return nil +} -- GitLab