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
 54	user.Planets = append(user.Planets, planet.Id)
 55	user.StoreInDb()
 56
 57	return user, err
 58}
 59
 60var signingKey = []byte("TODO") // TODO
 61
 62func (srv Service) Login(email, password string) (*string, *models.User, error) {
 63	var userDb models.UserDb
 64	err := srv.db.Users.Find(bson.M{"email": email}).One(&userDb)
 65	if err != nil {
 66		return nil, nil, errors.New("user not exist")
 67	}
 68	if !checkPasswordHash(password, userDb.Password) {
 69		return nil, nil, errors.New("error with password")
 70	}
 71	user := models.UserDbToUser(srv.db, userDb)
 72
 73	// create jwt
 74	token := jwt.New(jwt.SigningMethodHS256)
 75	claims := make(jwt.MapClaims)
 76	claims["user"] = true
 77	claims["exp"] = time.Now().Add(time.Hour * 24).Unix()
 78	token.Claims = claims
 79
 80	tokenString, err := token.SignedString(signingKey)
 81	if err != nil {
 82		return nil, nil, errors.New("error creating token")
 83	}
 84
 85	return &tokenString, user, err
 86}
 87
 88func (srv Service) GetUserById(userid bson.ObjectId) (*models.User, error) {
 89	var userDb models.UserDb
 90	err := srv.db.Users.Find(bson.M{"_id": userid}).One(&userDb)
 91	if err != nil {
 92		return nil, err
 93	}
 94	user := models.UserDbToUser(srv.db, userDb)
 95	_, err = user.GetResources()
 96	return user, err
 97}
 98
 99func (srv Service) GetUserPlanetsById(userid bson.ObjectId) ([]*models.Planet, error) {
100	var planets []*models.Planet
101	err := srv.db.Planets.Find(bson.M{"ownerid": userid}).All(&planets)
102	if err != nil {
103		return nil, err
104	}
105	return planets, err
106}