package usersrv
|
|
|
|
import (
|
|
"errors"
|
|
"time"
|
|
|
|
"github.com/arnaucube/gogame/database"
|
|
"github.com/arnaucube/gogame/models"
|
|
"github.com/arnaucube/gogame/services/gamesrv"
|
|
jwt "github.com/dgrijalva/jwt-go"
|
|
"golang.org/x/crypto/bcrypt"
|
|
"gopkg.in/mgo.v2/bson"
|
|
)
|
|
|
|
type Service struct {
|
|
db *database.Db
|
|
gamesrv *gamesrv.Service
|
|
}
|
|
|
|
func New(db *database.Db, gameservice *gamesrv.Service) *Service {
|
|
return &Service{
|
|
db: db,
|
|
gamesrv: gameservice,
|
|
}
|
|
}
|
|
|
|
func hashPassword(password string) (string, error) {
|
|
hash, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.MinCost)
|
|
return string(hash), err
|
|
}
|
|
func checkPasswordHash(password, hash string) bool {
|
|
err := bcrypt.CompareHashAndPassword([]byte(hash), []byte(password))
|
|
return err == nil
|
|
}
|
|
|
|
func (srv Service) Register(name, password, email string) (*models.User, error) {
|
|
var userDb models.User
|
|
err := srv.db.Users.Find(bson.M{"email": email}).One(&userDb)
|
|
if err == nil {
|
|
return nil, errors.New("user already exist")
|
|
}
|
|
|
|
hashedPassword, err := hashPassword(password)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
user, err := models.NewUser(srv.db, name, hashedPassword, email)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
_, planet, err := srv.gamesrv.CreatePlanet(user.Id)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
user.Planets = append(user.Planets, planet.Id)
|
|
user.StoreInDb()
|
|
|
|
return user, err
|
|
}
|
|
|
|
var signingKey = []byte("TODO") // TODO
|
|
|
|
func (srv Service) Login(email, password string) (*string, *models.User, error) {
|
|
var userDb models.UserDb
|
|
err := srv.db.Users.Find(bson.M{"email": email}).One(&userDb)
|
|
if err != nil {
|
|
return nil, nil, errors.New("user not exist")
|
|
}
|
|
if !checkPasswordHash(password, userDb.Password) {
|
|
return nil, nil, errors.New("error with password")
|
|
}
|
|
user := models.UserDbToUser(srv.db, userDb)
|
|
|
|
// create jwt
|
|
token := jwt.New(jwt.SigningMethodHS256)
|
|
claims := make(jwt.MapClaims)
|
|
claims["user"] = true
|
|
claims["exp"] = time.Now().Add(time.Hour * 24).Unix()
|
|
token.Claims = claims
|
|
|
|
tokenString, err := token.SignedString(signingKey)
|
|
if err != nil {
|
|
return nil, nil, errors.New("error creating token")
|
|
}
|
|
|
|
return &tokenString, user, err
|
|
}
|
|
|
|
func (srv Service) GetUserById(userid bson.ObjectId) (*models.User, error) {
|
|
var userDb models.UserDb
|
|
err := srv.db.Users.Find(bson.M{"_id": userid}).One(&userDb)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
user := models.UserDbToUser(srv.db, userDb)
|
|
return user, nil
|
|
}
|
|
|
|
func (srv Service) GetUserPlanetsById(userid bson.ObjectId) ([]*models.Planet, error) {
|
|
var planets []*models.Planet
|
|
err := srv.db.Planets.Find(bson.M{"ownerid": userid}).All(&planets)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return planets, err
|
|
}
|