You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

108 lines
2.6 KiB

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