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