arnaucube
arnaucube/gogame-oldPublic Self-hosted repository
gogame-old/services/usersrv/usersrv.go
services/usersrv/usersrv.goRaw
  1package usersrv
  2
  3import (
  4	"errors"
  5	"time"
  6
  7	"github.com/arnaucube/gogame/database"
  8	"github.com/arnaucube/gogame/models"
  9	"github.com/arnaucube/gogame/services/gamesrv"
 10	jwt "github.com/dgrijalva/jwt-go"
 11	"golang.org/x/crypto/bcrypt"
 12	"gopkg.in/mgo.v2/bson"
 13)
 14
 15type Service struct {
 16	db      *database.Db
 17	gamesrv *gamesrv.Service
 18}
 19
 20func New(db *database.Db, gameservice *gamesrv.Service) *Service {
 21	return &Service{
 22		db:      db,
 23		gamesrv: gameservice,
 24	}
 25}
 26
 27func hashPassword(password string) (string, error) {
 28	hash, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.MinCost)
 29	return string(hash), err
 30}
 31func checkPasswordHash(password, hash string) bool {
 32	err := bcrypt.CompareHashAndPassword([]byte(hash), []byte(password))
 33	return err == nil
 34}
 35
 36func (srv Service) Register(name, password, email string) (*models.User, error) {
 37	var userDb models.User
 38	err := srv.db.Users.Find(bson.M{"email": email}).One(&userDb)
 39	if err == nil {
 40		return nil, errors.New("user already exist")
 41	}
 42
 43	hashedPassword, err := hashPassword(password)
 44	if err != nil {
 45		return nil, err
 46	}
 47	user, err := models.NewUser(srv.db, name, hashedPassword, email)
 48	if err != nil {
 49		return nil, err
 50	}
 51
 52	_, planet, err := srv.gamesrv.CreatePlanet(user.Id)
 53	if err != nil {
 54		return nil, err
 55	}
 56
 57	user.Planets = append(user.Planets, planet.Id)
 58	user.StoreInDb()
 59
 60	return user, err
 61}
 62
 63var signingKey = []byte("TODO") // TODO
 64
 65func (srv Service) Login(email, password string) (*string, *models.User, error) {
 66	var userDb models.UserDb
 67	err := srv.db.Users.Find(bson.M{"email": email}).One(&userDb)
 68	if err != nil {
 69		return nil, nil, errors.New("user not exist")
 70	}
 71	if !checkPasswordHash(password, userDb.Password) {
 72		return nil, nil, errors.New("error with password")
 73	}
 74	user := models.UserDbToUser(srv.db, userDb)
 75
 76	// create jwt
 77	token := jwt.New(jwt.SigningMethodHS256)
 78	claims := make(jwt.MapClaims)
 79	claims["user"] = true
 80	claims["exp"] = time.Now().Add(time.Hour * 24).Unix()
 81	token.Claims = claims
 82
 83	tokenString, err := token.SignedString(signingKey)
 84	if err != nil {
 85		return nil, nil, errors.New("error creating token")
 86	}
 87
 88	return &tokenString, user, err
 89}
 90
 91func (srv Service) GetUserById(userid bson.ObjectId) (*models.User, error) {
 92	var userDb models.UserDb
 93	err := srv.db.Users.Find(bson.M{"_id": userid}).One(&userDb)
 94	if err != nil {
 95		return nil, err
 96	}
 97	user := models.UserDbToUser(srv.db, userDb)
 98	return user, nil
 99}
100
101func (srv Service) GetUserPlanetsById(userid bson.ObjectId) ([]*models.Planet, error) {
102	var planets []*models.Planet
103	err := srv.db.Planets.Find(bson.M{"ownerid": userid}).All(&planets)
104	if err != nil {
105		return nil, err
106	}
107	return planets, err
108}