167 lines
4.1 KiB
Go
167 lines
4.1 KiB
Go
package store
|
|
|
|
import (
|
|
"errors"
|
|
"time"
|
|
|
|
"github.com/globalsign/mgo"
|
|
"github.com/globalsign/mgo/bson"
|
|
log "github.com/golang/glog"
|
|
|
|
"github.com/litmuschaos/litmus/litmus-portal/authentication/pkg/models"
|
|
"github.com/litmuschaos/litmus/litmus-portal/authentication/pkg/types"
|
|
"github.com/litmuschaos/litmus/litmus-portal/authentication/pkg/utils/uuid"
|
|
)
|
|
|
|
// UserConfig user configuration parameters
|
|
type UserConfig struct {
|
|
// store users data collection name(The default is user)
|
|
UsersCName string
|
|
}
|
|
|
|
// NewDefaultUserConfig create a default user configuration
|
|
func NewDefaultUserConfig() *UserConfig {
|
|
return &UserConfig{
|
|
UsersCName: types.DefaultLocalAuthCollection,
|
|
}
|
|
}
|
|
|
|
// NewUserStore create a user store instance based on mongodb
|
|
func NewUserStore(cfg *Config, ucfgs ...*UserConfig) (*UserStore, error) {
|
|
session, err := mgo.Dial(cfg.URL)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
if types.DBUser != "" && types.DBPassword != "" {
|
|
cred := mgo.Credential{
|
|
Username: types.DBUser,
|
|
Password: types.DBPassword,
|
|
}
|
|
err = session.Login(&cred)
|
|
if err != nil {
|
|
log.Errorln("Database connection failed", err)
|
|
return nil, err
|
|
}
|
|
} else {
|
|
return nil, errors.New("Some DB configs are not present")
|
|
}
|
|
|
|
return NewUserStoreWithSession(session, cfg.DB, ucfgs...)
|
|
}
|
|
|
|
// NewUserStoreWithSession create a User store instance based on mongodb
|
|
func NewUserStoreWithSession(session *mgo.Session, dbName string, ucfgs ...*UserConfig) (*UserStore, error) {
|
|
us := &UserStore{
|
|
dbName: dbName,
|
|
session: session,
|
|
ucfg: NewDefaultUserConfig(),
|
|
}
|
|
if len(ucfgs) > 0 {
|
|
us.ucfg = ucfgs[0]
|
|
}
|
|
|
|
return us, nil
|
|
}
|
|
|
|
// UserStore MongoDB storage for OAuth 2.0
|
|
type UserStore struct {
|
|
ucfg *UserConfig
|
|
dbName string
|
|
session *mgo.Session
|
|
}
|
|
|
|
// Close close the mongo session
|
|
func (us *UserStore) Close() {
|
|
us.session.Close()
|
|
}
|
|
|
|
func (us *UserStore) c(name string) *mgo.Collection {
|
|
return us.session.DB(us.dbName).C(name)
|
|
}
|
|
|
|
func (us *UserStore) cHandler(name string, handler func(c *mgo.Collection)) {
|
|
session := us.session.Clone()
|
|
defer session.Close()
|
|
handler(session.DB(us.dbName).C(name))
|
|
return
|
|
}
|
|
|
|
// Set set user information
|
|
func (us *UserStore) Set(user *models.UserCredentials) (err error) {
|
|
us.cHandler(us.ucfg.UsersCName, func(c *mgo.Collection) {
|
|
user.ID = uuid.Must(uuid.NewRandom()).String()
|
|
currentTime := time.Now()
|
|
user.CreatedAt = ¤tTime
|
|
if cerr := c.Insert(user); cerr != nil {
|
|
err = cerr
|
|
return
|
|
}
|
|
})
|
|
|
|
return
|
|
}
|
|
|
|
// GetByUserName according to the ID for the user information
|
|
func (us *UserStore) GetByUserName(username string) (user *models.UserCredentials, err error) {
|
|
us.cHandler(us.ucfg.UsersCName, func(c *mgo.Collection) {
|
|
user = new(models.UserCredentials)
|
|
if cerr := c.Find(bson.M{"username": username}).One(user); cerr != nil {
|
|
err = cerr
|
|
return
|
|
}
|
|
})
|
|
|
|
return
|
|
}
|
|
|
|
// GetAllUsers according to the ID for the user information
|
|
func (us *UserStore) GetAllUsers() (users []*models.UserCredentials, err error) {
|
|
us.cHandler(us.ucfg.UsersCName, func(c *mgo.Collection) {
|
|
if cerr := c.Find(bson.M{}).All(&users); cerr != nil {
|
|
err = cerr
|
|
return
|
|
}
|
|
})
|
|
|
|
return
|
|
}
|
|
|
|
// GetByEmail according to the ID for the user information
|
|
func (us *UserStore) GetByEmail(email string) (user *models.UserCredentials, err error) {
|
|
us.cHandler(us.ucfg.UsersCName, func(c *mgo.Collection) {
|
|
user = new(models.UserCredentials)
|
|
if cerr := c.Find(bson.M{"email": email}).One(user); cerr != nil {
|
|
err = cerr
|
|
return
|
|
}
|
|
})
|
|
|
|
return
|
|
}
|
|
|
|
//UpdateUser updates the user
|
|
func (us *UserStore) UpdateUser(user *models.UserCredentials) (err error) {
|
|
us.cHandler(us.ucfg.UsersCName, func(c *mgo.Collection) {
|
|
currentTime := time.Now()
|
|
user.UpdatedAt = ¤tTime
|
|
if cerr := c.UpdateId(user.GetID(), user); cerr != nil {
|
|
err = cerr
|
|
return
|
|
}
|
|
})
|
|
return
|
|
}
|
|
|
|
// RemoveByUserName use the user id to delete the user information
|
|
func (us *UserStore) RemoveByUserName(username string) (err error) {
|
|
us.cHandler(us.ucfg.UsersCName, func(c *mgo.Collection) {
|
|
if cerr := c.Remove(bson.M{"username": username}); cerr != nil {
|
|
err = cerr
|
|
return
|
|
}
|
|
})
|
|
|
|
return
|
|
}
|