diff --git a/cmd/server.go b/cmd/server.go index 736c399..aec3d64 100644 --- a/cmd/server.go +++ b/cmd/server.go @@ -4,6 +4,7 @@ import ( "github.com/arnaucube/gogame/config" "github.com/arnaucube/gogame/database" "github.com/arnaucube/gogame/endpoint" + "github.com/arnaucube/gogame/services/gamesrv" "github.com/arnaucube/gogame/services/usersrv" "github.com/urfave/cli" ) @@ -28,7 +29,8 @@ func start(c *cli.Context) error { } // services - userservice := usersrv.New(db) + gameservice := gamesrv.New(db) + userservice := usersrv.New(db, gameservice) if err != nil { return err } diff --git a/endpoint/handlers.go b/endpoint/handlers.go index 8567a4a..d1dd5c8 100644 --- a/endpoint/handlers.go +++ b/endpoint/handlers.go @@ -60,3 +60,23 @@ func handleLogin(c *gin.Context) { "user": user, }) } + +func handleGetResources(c *gin.Context) { + userid := c.Param("userid") + + user, err := userservice.GetUserById(userid) + if err != nil { + fail(c, err, "error on getting user") + return + } + resources, err := user.GetResources() + if err != nil { + fail(c, err, "error on getting user") + return + } + + c.JSON(200, gin.H{ + "user": user, + "resources": resources, + }) +} diff --git a/endpoint/serve.go b/endpoint/serve.go index 52c36e6..8d791f7 100644 --- a/endpoint/serve.go +++ b/endpoint/serve.go @@ -19,6 +19,9 @@ func newApiService() *gin.Engine { api.GET("/info", handleInfo) api.POST("/register", handleRegister) api.POST("/login", handleLogin) + + // TODO add jwt checker + api.GET("/resources/:userid", handleGetResources) return api } diff --git a/models/user.go b/models/user.go index a130ee4..be57a20 100644 --- a/models/user.go +++ b/models/user.go @@ -65,7 +65,7 @@ func (u *User) StoreInDb() error { userDb := UserDb{ Id: u.Id, Name: u.Name, - LastUpdated: u.LastUpdated, + LastUpdated: time.Now(), Resources: u.Resources, } err := u.db.Users.Update(bson.M{"_id": u.Id}, userDb) @@ -85,16 +85,16 @@ func (u *User) GetFromDb() error { func (u *User) GetPlanets() ([]Planet, error) { var planets []Planet - err := u.db.Users.Find(bson.M{"OwnerId": u.Id}).All(&planets) + err := u.db.Planets.Find(bson.M{"ownerid": u.Id}).All(&planets) if err != nil { return planets, err } return planets, nil } -// GetResources updates the values of resources and returns the value +// GetResources updates the values of resources and returns the value, also updates the user.Resources // Resource types: metal, crystal, deuterium, energy -func (u *User) GetResources() (*User, error) { +func (u *User) GetResources() (*Resources, error) { // get current values err := u.GetFromDb() if err != nil { @@ -112,16 +112,17 @@ func (u *User) GetResources() (*User, error) { } // get Resource-Plant level in each planet + // and calculate growth = ResourcePlant.Level for each planet var metalGrowth, crystalGrowth, deuteriumGrowth, energyGrowth int64 for _, planet := range planets { - // calculate growth = ResourcePlant.Level for each planet + fmt.Println("planet", planet) // TODO find correct formulas - metalGrowth = metalGrowth + (planet.Buildings.MetalMine * int64(delta)) - crystalGrowth = crystalGrowth + (planet.Buildings.CrystalMine * int64(delta)) - deuteriumGrowth = deuteriumGrowth + (planet.Buildings.DeuteriumMine * int64(delta)) - energyGrowth = energyGrowth + (planet.Buildings.EnergyMine * int64(delta)) + metalGrowth = metalGrowth + ((1 + planet.Buildings.MetalMine) * int64(delta)) + crystalGrowth = crystalGrowth + ((1 * planet.Buildings.CrystalMine) * int64(delta)) + deuteriumGrowth = deuteriumGrowth + ((1 * planet.Buildings.DeuteriumMine) * int64(delta)) + energyGrowth = energyGrowth + ((1 * planet.Buildings.EnergyMine) * int64(delta)) } - // calculate newAmount = oldAmount + (growth & DeltaTime) + // calculate newAmount = oldAmount + growth u.Resources.Metal = u.Resources.Metal + metalGrowth u.Resources.Crystal = u.Resources.Crystal + crystalGrowth u.Resources.Deuterium = u.Resources.Deuterium + deuteriumGrowth @@ -134,5 +135,5 @@ func (u *User) GetResources() (*User, error) { } // return user - return u, nil + return &u.Resources, nil } diff --git a/services/gamesrv/gamesrv.go b/services/gamesrv/gamesrv.go index 03e6f65..554f1c7 100644 --- a/services/gamesrv/gamesrv.go +++ b/services/gamesrv/gamesrv.go @@ -29,6 +29,12 @@ func (srv Service) CreatePlanet(userId bson.ObjectId) (*models.SolarSystem, *mod Size: size, Name: name, OwnerId: userId, + Buildings: models.BuildingsList{ + MetalMine: 1, + CrystalMine: 1, + DeuteriumMine: 1, + EnergyMine: 1, + }, } err := srv.db.Planets.Insert(newPlanet) if err != nil { diff --git a/services/usersrv/usersrv.go b/services/usersrv/usersrv.go index dbcf28d..9805d7a 100644 --- a/services/usersrv/usersrv.go +++ b/services/usersrv/usersrv.go @@ -6,18 +6,21 @@ import ( "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 + db *database.Db + gamesrv *gamesrv.Service } -func New(db *database.Db) *Service { +func New(db *database.Db, gameservice *gamesrv.Service) *Service { return &Service{ - db, + db: db, + gamesrv: gameservice, } } @@ -42,6 +45,12 @@ func (srv Service) Register(name, password, email string) (*models.User, error) return nil, err } user, err := models.NewUser(srv.db, name, hashedPassword, email) + if err != nil { + return nil, err + } + + _, _, err = srv.gamesrv.CreatePlanet(user.Id) + return user, err } @@ -73,6 +82,15 @@ func (srv Service) Login(email, password string) (*string, *models.User, error) return &tokenString, user, err } +func (srv Service) GetUserById(userid string) (*models.User, error) { + var userDb models.UserDb + err := srv.db.Users.Find(bson.M{"_id": bson.ObjectIdHex(userid)}).One(&userDb) + if err != nil { + return nil, err + } + return models.UserDbToUser(srv.db, userDb), nil +} + // func (srv Service) GetUser(id bson.ObjectId) (*models.User, error) { // // update user stats // user := getUserFromDB diff --git a/test/test.py b/test/test.py index fc9a073..39e4d7d 100644 --- a/test/test.py +++ b/test/test.py @@ -7,10 +7,9 @@ import requests import provoj import time -import subprocess -subprocess.check_call(["mongo", "gogame", "--eval", "'db.dropDatabase()'"]) +import os +os.system("mongo gogame --eval 'db.dropDatabase()'") -time.sleep(1) URL = "http://127.0.0.1:5000" @@ -26,7 +25,6 @@ t.rStatus("post /register", r) jsonR = r.json() print(jsonR) -time.sleep(1) loginData = { "email": "user00@email.com", @@ -37,6 +35,17 @@ t.rStatus("post /login", r) jsonR = r.json() print(jsonR) +userid = jsonR["user"]["id"] +r = requests.get(URL + "/resources/"+ userid) +t.rStatus("get /resources", r) +jsonR = r.json() +print(jsonR) + +time.sleep(4) +r = requests.get(URL + "/resources/"+ userid) +t.rStatus("get /resources", r) +jsonR = r.json() +print(jsonR) t.printScores()