diff --git a/handlers/cage_handler.go b/handlers/cage_handler.go index b3b0d38..be3d73a 100644 --- a/handlers/cage_handler.go +++ b/handlers/cage_handler.go @@ -11,7 +11,14 @@ import ( ) func (hc *handlersContext) getAllCages(c *gin.Context) { - cages, err := hc.db.GetAllCages() + gameID := c.Param("gameID") + err := hc.validator.VarCtx(c, gameID, "uuid4") + if err != nil { + utils.JSONError(c.Writer, validators.NewDataValidationAPIError(err)) + return + } + + cages, err := hc.db.GetAllCages(gameID) if err != nil { utils.GetLoggerFromCtx(c).WithError(err).Error("error while getting cages") utils.JSONErrorWithMessage(c.Writer, model.ErrInternalServer, "Error while getting cages") @@ -21,7 +28,8 @@ func (hc *handlersContext) getAllCages(c *gin.Context) { } func (hc *handlersContext) getACage(c *gin.Context) { - cageID := c.Param("cageId") + cageID := c.Param("cageID") + gameID := c.Param("gameID") err := hc.validator.VarCtx(c, cageID, "uuid4") if err != nil { @@ -29,8 +37,14 @@ func (hc *handlersContext) getACage(c *gin.Context) { return } - cage, err := hc.db.GetCageById(cageID) - if e, ok := err.(*dao.DAOError); ok { + err = hc.validator.VarCtx(c, gameID, "uuid4") + if err != nil { + utils.JSONError(c.Writer, validators.NewDataValidationAPIError(err)) + return + } + + cage, err := hc.db.GetCageByID(gameID, cageID) + if e, ok := err.(*dao.Error); ok { switch { case e.Type == dao.ErrTypeNotFound: utils.JSONErrorWithMessage(c.Writer, model.ErrNotFound, "Cage not found") @@ -55,6 +69,13 @@ func (hc *handlersContext) getACage(c *gin.Context) { } func (hc *handlersContext) createACage(c *gin.Context) { + gameID := c.Param("gameID") + err := hc.validator.VarCtx(c, gameID, "uuid4") + if err != nil { + utils.JSONError(c.Writer, validators.NewDataValidationAPIError(err)) + return + } + b, err := c.GetRawData() if err != nil { utils.GetLoggerFromCtx(c).WithError(err).Error("error while creating cage, read data fail") @@ -75,8 +96,9 @@ func (hc *handlersContext) createACage(c *gin.Context) { return } + cageToCreate.Game = model.Game{ID: gameID} err = hc.db.CreateCage(&cageToCreate) - if e, ok := err.(*dao.DAOError); ok { + if e, ok := err.(*dao.Error); ok { switch { case e.Type == dao.ErrTypeDuplicate: utils.JSONErrorWithMessage(c.Writer, model.ErrAlreadyExists, "Cage already exists") @@ -100,8 +122,8 @@ func (hc *handlersContext) updateACage(c *gin.Context) { } func (hc *handlersContext) deleteACage(c *gin.Context) { - - cageID := c.Param("cageId") + gameID := c.Param("gameID") + cageID := c.Param("cageID") err := hc.validator.VarCtx(c, cageID, "uuid4") if err != nil { @@ -109,9 +131,15 @@ func (hc *handlersContext) deleteACage(c *gin.Context) { return } + err = hc.validator.VarCtx(c, gameID, "uuid4") + if err != nil { + utils.JSONError(c.Writer, validators.NewDataValidationAPIError(err)) + return + } + // check cage id given in URL exists - _, err = hc.db.GetCageById(cageID) - if e, ok := err.(*dao.DAOError); ok { + _, err = hc.db.GetCageByID(gameID, cageID) + if e, ok := err.(*dao.Error); ok { switch { case e.Type == dao.ErrTypeNotFound: utils.JSONErrorWithMessage(c.Writer, model.ErrNotFound, "Cage to delete not found") @@ -128,7 +156,7 @@ func (hc *handlersContext) deleteACage(c *gin.Context) { } err = hc.db.DeleteCage(cageID) - if e, ok := err.(*dao.DAOError); ok { + if e, ok := err.(*dao.Error); ok { switch { case e.Type == dao.ErrTypeNotFound: utils.JSONErrorWithMessage(c.Writer, model.ErrNotFound, "Cage to delete not found") diff --git a/handlers/game_handler.go b/handlers/game_handler.go index bf7058a..1169558 100644 --- a/handlers/game_handler.go +++ b/handlers/game_handler.go @@ -21,16 +21,16 @@ func (hc *handlersContext) getAllGames(c *gin.Context) { } func (hc *handlersContext) getAGame(c *gin.Context) { - gameId := c.Param("gameId") + gameID := c.Param("gameID") - err := hc.validator.VarCtx(c, gameId, "uuid4") + err := hc.validator.VarCtx(c, gameID, "uuid4") if err != nil { utils.JSONError(c.Writer, validators.NewDataValidationAPIError(err)) return } - game, err := hc.gameService.GetAGameById(gameId) - if e, ok := err.(*dao.DAOError); ok { + game, err := hc.gameService.GetAGameByID(gameID) + if e, ok := err.(*dao.Error); ok { switch { case e.Type == dao.ErrTypeNotFound: utils.JSONErrorWithMessage(c.Writer, model.ErrNotFound, "Game not found") @@ -76,7 +76,7 @@ func (hc *handlersContext) createAGame(c *gin.Context) { } err = hc.db.CreateGame(&gameToCreate) - if e, ok := err.(*dao.DAOError); ok { + if e, ok := err.(*dao.Error); ok { switch { case e.Type == dao.ErrTypeDuplicate: utils.JSONErrorWithMessage(c.Writer, model.ErrAlreadyExists, "Game already exists") @@ -101,7 +101,7 @@ func (hc *handlersContext) updateAGame(c *gin.Context) { func (hc *handlersContext) deleteAGame(c *gin.Context) { - gameID := c.Param("gameId") + gameID := c.Param("gameID") err := hc.validator.VarCtx(c, gameID, "uuid4") if err != nil { @@ -110,8 +110,8 @@ func (hc *handlersContext) deleteAGame(c *gin.Context) { } // check game id given in URL exists - _, err = hc.db.GetGameById(gameID) - if e, ok := err.(*dao.DAOError); ok { + _, err = hc.db.GetGameByID(gameID) + if e, ok := err.(*dao.Error); ok { switch { case e.Type == dao.ErrTypeNotFound: utils.JSONErrorWithMessage(c.Writer, model.ErrNotFound, "Game to delete not found") @@ -128,7 +128,7 @@ func (hc *handlersContext) deleteAGame(c *gin.Context) { } err = hc.db.DeleteGame(gameID) - if e, ok := err.(*dao.DAOError); ok { + if e, ok := err.(*dao.Error); ok { switch { case e.Type == dao.ErrTypeNotFound: utils.JSONErrorWithMessage(c.Writer, model.ErrNotFound, "Game to delete not found") @@ -148,5 +148,20 @@ func (hc *handlersContext) deleteAGame(c *gin.Context) { } func (hc *handlersContext) getHamstersOfGame(c *gin.Context) { + gameID := c.Param("gameID") + + err := hc.validator.VarCtx(c, gameID, "uuid4") + if err != nil { + utils.JSONError(c.Writer, validators.NewDataValidationAPIError(err)) + return + } + + games, err := hc.db.GetHamstersOfGame(gameID) + if err != nil { + utils.GetLoggerFromCtx(c).WithError(err).Error("error while getting games") + utils.JSONErrorWithMessage(c.Writer, model.ErrInternalServer, "Error while getting games") + return + } + utils.JSON(c.Writer, http.StatusOK, games) } diff --git a/handlers/hamster_handler.go b/handlers/hamster_handler.go index 789ce23..89ba0db 100644 --- a/handlers/hamster_handler.go +++ b/handlers/hamster_handler.go @@ -11,7 +11,22 @@ import ( ) func (hc *handlersContext) getAllHamsters(c *gin.Context) { - hamsters, err := hc.db.GetAllHamsters() + gameID := c.Param("gameID") + cageID := c.Param("cageID") + + err := hc.validator.VarCtx(c, cageID, "uuid4") + if err != nil { + utils.JSONError(c.Writer, validators.NewDataValidationAPIError(err)) + return + } + + err = hc.validator.VarCtx(c, gameID, "uuid4") + if err != nil { + utils.JSONError(c.Writer, validators.NewDataValidationAPIError(err)) + return + } + + hamsters, err := hc.db.GetAllHamsters(gameID, cageID) if err != nil { utils.GetLoggerFromCtx(c).WithError(err).Error("error while getting hamsters") utils.JSONErrorWithMessage(c.Writer, model.ErrInternalServer, "Error while getting hamsters") @@ -21,16 +36,30 @@ func (hc *handlersContext) getAllHamsters(c *gin.Context) { } func (hc *handlersContext) getAHamster(c *gin.Context) { - hamsterID := c.Param("hamsterId") + gameID := c.Param("gameID") + cageID := c.Param("cageID") + hamsterID := c.Param("hamsterID") - err := hc.validator.VarCtx(c, hamsterID, "uuid4") + err := hc.validator.VarCtx(c, cageID, "uuid4") if err != nil { utils.JSONError(c.Writer, validators.NewDataValidationAPIError(err)) return } - hamster, err := hc.db.GetHamsterById(hamsterID) - if e, ok := err.(*dao.DAOError); ok { + err = hc.validator.VarCtx(c, gameID, "uuid4") + if err != nil { + utils.JSONError(c.Writer, validators.NewDataValidationAPIError(err)) + return + } + + err = hc.validator.VarCtx(c, hamsterID, "uuid4") + if err != nil { + utils.JSONError(c.Writer, validators.NewDataValidationAPIError(err)) + return + } + + hamster, err := hc.db.GetHamsterByID(hamsterID, gameID, cageID) + if e, ok := err.(*dao.Error); ok { switch { case e.Type == dao.ErrTypeNotFound: utils.JSONErrorWithMessage(c.Writer, model.ErrNotFound, "Hamster not found") @@ -55,6 +84,21 @@ func (hc *handlersContext) getAHamster(c *gin.Context) { } func (hc *handlersContext) createAHamster(c *gin.Context) { + gameID := c.Param("gameID") + cageID := c.Param("cageID") + + err := hc.validator.VarCtx(c, cageID, "uuid4") + if err != nil { + utils.JSONError(c.Writer, validators.NewDataValidationAPIError(err)) + return + } + + err = hc.validator.VarCtx(c, gameID, "uuid4") + if err != nil { + utils.JSONError(c.Writer, validators.NewDataValidationAPIError(err)) + return + } + b, err := c.GetRawData() if err != nil { utils.GetLoggerFromCtx(c).WithError(err).Error("error while creating hamster, read data fail") @@ -75,8 +119,9 @@ func (hc *handlersContext) createAHamster(c *gin.Context) { return } + hamsterToCreate.Cage = &model.Cage{ID: cageID, Game: model.Game{ID: gameID}} err = hc.db.CreateHamster(&hamsterToCreate) - if e, ok := err.(*dao.DAOError); ok { + if e, ok := err.(*dao.Error); ok { switch { case e.Type == dao.ErrTypeDuplicate: utils.JSONErrorWithMessage(c.Writer, model.ErrAlreadyExists, "Hamster already exists") @@ -100,18 +145,31 @@ func (hc *handlersContext) updateAHamster(c *gin.Context) { } func (hc *handlersContext) deleteAHamster(c *gin.Context) { + hamsterID := c.Param("hamsterID") + gameID := c.Param("gameID") + cageID := c.Param("cageID") - hamsterID := c.Param("hamsterId") + err := hc.validator.VarCtx(c, cageID, "uuid4") + if err != nil { + utils.JSONError(c.Writer, validators.NewDataValidationAPIError(err)) + return + } - err := hc.validator.VarCtx(c, hamsterID, "uuid4") + err = hc.validator.VarCtx(c, gameID, "uuid4") + if err != nil { + utils.JSONError(c.Writer, validators.NewDataValidationAPIError(err)) + return + } + + err = hc.validator.VarCtx(c, hamsterID, "uuid4") if err != nil { utils.JSONError(c.Writer, validators.NewDataValidationAPIError(err)) return } // check hamster id given in URL exists - _, err = hc.db.GetHamsterById(hamsterID) - if e, ok := err.(*dao.DAOError); ok { + _, err = hc.db.GetHamsterByID(hamsterID, gameID, cageID) + if e, ok := err.(*dao.Error); ok { switch { case e.Type == dao.ErrTypeNotFound: utils.JSONErrorWithMessage(c.Writer, model.ErrNotFound, "Hamster to delete not found") @@ -128,7 +186,7 @@ func (hc *handlersContext) deleteAHamster(c *gin.Context) { } err = hc.db.DeleteHamster(hamsterID) - if e, ok := err.(*dao.DAOError); ok { + if e, ok := err.(*dao.Error); ok { switch { case e.Type == dao.ErrTypeNotFound: utils.JSONErrorWithMessage(c.Writer, model.ErrNotFound, "Hamster to delete not found") diff --git a/handlers/handler.go b/handlers/handler.go index 66cffef..6d9749e 100755 --- a/handlers/handler.go +++ b/handlers/handler.go @@ -75,32 +75,32 @@ func NewRouter(config *Config) *gin.Engine { securedUserRoute := userRoute.Group("") //TODO add secure auth securedUserRoute.Handle(http.MethodGet, "", hc.getAllUsers) - securedUserRoute.Handle(http.MethodGet, "/:userId", hc.getUser) - securedUserRoute.Handle(http.MethodPut, "/:userId", hc.updateUser) - securedUserRoute.Handle(http.MethodDelete, "/:userId", hc.deleteUser) + securedUserRoute.Handle(http.MethodGet, "/:userID", hc.getUser) + securedUserRoute.Handle(http.MethodPut, "/:userID", hc.updateUser) + securedUserRoute.Handle(http.MethodDelete, "/:userID", hc.deleteUser) // end: user routes - gameRoute := securedUserRoute.Group("/:userId/games") + gameRoute := securedUserRoute.Group("/:userID/games") gameRoute.Handle(http.MethodGet, "", hc.getAllGames) - gameRoute.Handle(http.MethodGet, "/:gameId", hc.getAGame) - gameRoute.Handle(http.MethodPost, "/:gameId", hc.createAGame) - gameRoute.Handle(http.MethodPut, "/:gameId", hc.updateAGame) - gameRoute.Handle(http.MethodGet, "/:gameId/hamsters", hc.getHamstersOfGame) - gameRoute.Handle(http.MethodDelete, "/:gameId", hc.deleteAGame) + gameRoute.Handle(http.MethodGet, "/:gameID", hc.getAGame) + gameRoute.Handle(http.MethodPost, "/:gameID", hc.createAGame) + gameRoute.Handle(http.MethodPut, "/:gameID", hc.updateAGame) + gameRoute.Handle(http.MethodGet, "/:gameID/hamsters", hc.getHamstersOfGame) + gameRoute.Handle(http.MethodDelete, "/:gameID", hc.deleteAGame) - cageRoute := gameRoute.Group("/:gameId/cages") + cageRoute := gameRoute.Group("/:gameID/cages") cageRoute.Handle(http.MethodGet, "", hc.getAllCages) - cageRoute.Handle(http.MethodGet, "/:cageId", hc.getACage) - cageRoute.Handle(http.MethodPost, "/:cageId", hc.createACage) - cageRoute.Handle(http.MethodPut, "/:cageId", hc.updateACage) - cageRoute.Handle(http.MethodDelete, "/:cageId", hc.deleteACage) + cageRoute.Handle(http.MethodGet, "/:cageID", hc.getACage) + cageRoute.Handle(http.MethodPost, "/:cageID", hc.createACage) + cageRoute.Handle(http.MethodPut, "/:cageID", hc.updateACage) + cageRoute.Handle(http.MethodDelete, "/:cageID", hc.deleteACage) - hamsterRoute := cageRoute.Group("/:cageId/hamsters") + hamsterRoute := cageRoute.Group("/:cageID/hamsters") hamsterRoute.Handle(http.MethodGet, "", hc.getAllHamsters) - hamsterRoute.Handle(http.MethodGet, "/:hamsterId", hc.getAHamster) - hamsterRoute.Handle(http.MethodPost, "/:hamsterId", hc.createAHamster) - hamsterRoute.Handle(http.MethodPut, "/:hamsterId", hc.updateAHamster) - hamsterRoute.Handle(http.MethodDelete, "/:hamsterId", hc.deleteAHamster) + hamsterRoute.Handle(http.MethodGet, "/:hamsterID", hc.getAHamster) + hamsterRoute.Handle(http.MethodPost, "/:hamsterID", hc.createAHamster) + hamsterRoute.Handle(http.MethodPut, "/:hamsterID", hc.updateAHamster) + hamsterRoute.Handle(http.MethodDelete, "/:hamsterID", hc.deleteAHamster) return router } diff --git a/handlers/user_handler.go b/handlers/user_handler.go index d417e50..0f2e77a 100755 --- a/handlers/user_handler.go +++ b/handlers/user_handler.go @@ -43,7 +43,7 @@ func (hc *handlersContext) connectUser(c *gin.Context) { utils.JSONError(c.Writer, model.ErrBadRequestFormat) return } - user, err := hc.userService.GetUserFromGoogleId(tokenInfo.UserId) + user, err := hc.userService.GetUserFromGoogleID(tokenInfo.UserId) if err != nil { utils.GetLogger().WithError(err).Error(err) if castedError, ok := err.(*model.APIError); ok { @@ -92,7 +92,7 @@ func (hc *handlersContext) createUser(c *gin.Context) { } err = hc.db.CreateUser(&user) - if e, ok := err.(*dao.DAOError); ok { + if e, ok := err.(*dao.Error); ok { switch { case e.Type == dao.ErrTypeDuplicate: utils.JSONErrorWithMessage(c.Writer, model.ErrAlreadyExists, "User already exists") @@ -121,7 +121,7 @@ func (hc *handlersContext) getUser(c *gin.Context) { } user, err := hc.db.GetUsersByID(userID) - if e, ok := err.(*dao.DAOError); ok { + if e, ok := err.(*dao.Error); ok { switch { case e.Type == dao.ErrTypeNotFound: utils.JSONErrorWithMessage(c.Writer, model.ErrNotFound, "User not found") @@ -156,7 +156,7 @@ func (hc *handlersContext) deleteUser(c *gin.Context) { // check user id given in URL exists _, err = hc.db.GetUsersByID(userID) - if e, ok := err.(*dao.DAOError); ok { + if e, ok := err.(*dao.Error); ok { switch { case e.Type == dao.ErrTypeNotFound: utils.JSONErrorWithMessage(c.Writer, model.ErrNotFound, "User to delete not found") @@ -173,7 +173,7 @@ func (hc *handlersContext) deleteUser(c *gin.Context) { } err = hc.db.DeleteUser(userID) - if e, ok := err.(*dao.DAOError); ok { + if e, ok := err.(*dao.Error); ok { switch { case e.Type == dao.ErrTypeNotFound: utils.JSONErrorWithMessage(c.Writer, model.ErrNotFound, "User to delete not found") @@ -203,7 +203,7 @@ func (hc *handlersContext) updateUser(c *gin.Context) { // check user id given in URL exists user, err := hc.db.GetUsersByID(userID) - if e, ok := err.(*dao.DAOError); ok { + if e, ok := err.(*dao.Error); ok { switch { case e.Type == dao.ErrTypeNotFound: utils.JSONErrorWithMessage(c.Writer, model.ErrNotFound, "User to update not found") @@ -244,7 +244,7 @@ func (hc *handlersContext) updateUser(c *gin.Context) { // make the update err = hc.db.UpdateUser(user) - if e, ok := err.(*dao.DAOError); ok { + if e, ok := err.(*dao.Error); ok { switch { case e.Type == dao.ErrTypeNotFound: utils.JSONErrorWithMessage(c.Writer, model.ErrNotFound, "User to update not found") diff --git a/liquibase/changelogs/changeset/create-hamster.xml b/liquibase/changelogs/changeset/create-hamster.xml index ac1aafd..77d6c90 100644 --- a/liquibase/changelogs/changeset/create-hamster.xml +++ b/liquibase/changelogs/changeset/create-hamster.xml @@ -32,6 +32,9 @@ + + + diff --git a/service/game_service.go b/service/game_service.go index b0e0a6c..58ca55b 100644 --- a/service/game_service.go +++ b/service/game_service.go @@ -13,10 +13,10 @@ func NewGameService(database dao.Database) *GameService { return &GameService{serviceContext{db: database}} } -func (gs *GameService) GetAGameById(id string) (*model.Game, error) { - game, err := gs.db.GetGameById(id) +func (gs *GameService) GetAGameByID(id string) (*model.Game, error) { + game, err := gs.db.GetGameByID(id) if err != nil { - if castedError, ok := err.(*dao.DAOError); ok { + if castedError, ok := err.(*dao.Error); ok { switch castedError.Type { case dao.ErrTypeNotFound: return nil, &model.ErrNotFound diff --git a/service/user_service.go b/service/user_service.go index 7f8e567..6d0cf67 100644 --- a/service/user_service.go +++ b/service/user_service.go @@ -14,10 +14,10 @@ func NewUserService(database dao.Database) *UserService { return &UserService{serviceContext{db: database}} } -func (us *UserService) GetUserFromGoogleId(googleUserId string) (*model.User, error) { - user, err := us.db.GetUsersByGoogleID(googleUserId) +func (us *UserService) GetUserFromGoogleID(googleUserID string) (*model.User, error) { + user, err := us.db.GetUsersByGoogleID(googleUserID) if err != nil { - if castedError, ok := err.(*dao.DAOError); ok { + if castedError, ok := err.(*dao.Error); ok { switch castedError.Type { case dao.ErrTypeNotFound: return nil, &model.ErrNotFound @@ -32,7 +32,7 @@ func (us *UserService) GetUserFromGoogleId(googleUserId string) (*model.User, er func (us *UserService) CreateUserFromGoogleToken(id string, email string) (*model.User, error) { randNick := utils.String(20) - user := &model.User{UserEditable: model.UserEditable{Nickname: "player-" + randNick}, GoogleId: id} + user := &model.User{UserEditable: model.UserEditable{Nickname: "player-" + randNick}, GoogleID: id} err := us.db.CreateUser(user) return user, err diff --git a/storage/dao/database.go b/storage/dao/database.go index 4030ca5..b3b1cc4 100755 --- a/storage/dao/database.go +++ b/storage/dao/database.go @@ -17,25 +17,26 @@ type Database interface { // start: cage games funcs GetAllGames() ([]*model.Game, error) - GetGameById(string) (*model.Game, error) + GetGameByID(string) (*model.Game, error) CreateGame(*model.Game) error DeleteGame(string) error UpdateGame(*model.Game) error // end: games dao funcs - // start: cage cages funcs - GetAllCages() ([]*model.Cage, error) - GetCageById(string) (*model.Cage, error) + // start: cage funcs + GetAllCages(string) ([]*model.Cage, error) + GetCageByID(string, string) (*model.Cage, error) CreateCage(*model.Cage) error DeleteCage(string) error UpdateCage(*model.Cage) error - // end: games dao funcs - // start: cage cages funcs - GetAllHamsters() ([]*model.Hamster, error) - GetHamsterById(string) (*model.Hamster, error) + // end: cage dao funcs + // start: hamster funcs + GetAllHamsters(string, string) ([]*model.Hamster, error) + GetHamsterByID(string, string, string) (*model.Hamster, error) CreateHamster(*model.Hamster) error DeleteHamster(string) error UpdateHamster(*model.Hamster) error - // end: games dao funcs + GetHamstersOfGame(string) ([]*model.Hamster, error) + // end: hamster dao funcs } diff --git a/storage/dao/database_error.go b/storage/dao/database_error.go index cedc8b0..160f190 100755 --- a/storage/dao/database_error.go +++ b/storage/dao/database_error.go @@ -12,19 +12,19 @@ const ( ErrTypeForeignKeyViolation ) -type DAOError struct { +type Error struct { Cause error Type Type } func NewDAOError(t Type, cause error) error { - return &DAOError{ + return &Error{ Type: t, Cause: cause, } } -func (e *DAOError) Error() string { +func (e *Error) Error() string { if e.Cause != nil { return fmt.Sprintf("Type %d: %s", e.Type, e.Cause.Error()) } diff --git a/storage/dao/fake/database_fake_cages.go b/storage/dao/fake/database_fake_cages.go index bef784a..1f8d853 100755 --- a/storage/dao/fake/database_fake_cages.go +++ b/storage/dao/fake/database_fake_cages.go @@ -34,14 +34,21 @@ func (db *DatabaseFake) loadCages() []*model.Cage { return cages } -func (db *DatabaseFake) GetAllCages() ([]*model.Cage, error) { - return db.loadCages(), nil +func (db *DatabaseFake) GetAllCages(gameID string) ([]*model.Cage, error) { + cages := db.loadCages() + var cagesLoaded []*model.Cage + for _, g := range cages { + if g.Game.ID == gameID { + cagesLoaded = append(cagesLoaded, g) + } + } + return cagesLoaded, nil } -func (db *DatabaseFake) GetCageById(cageId string) (*model.Cage, error) { +func (db *DatabaseFake) GetCageByID(gameID, cageID string) (*model.Cage, error) { cages := db.loadCages() for _, g := range cages { - if g.ID == cageId { + if g.Game.ID == gameID && g.ID == cageID { return g, nil } } diff --git a/storage/dao/fake/database_fake_games.go b/storage/dao/fake/database_fake_games.go index f1c162c..5525195 100755 --- a/storage/dao/fake/database_fake_games.go +++ b/storage/dao/fake/database_fake_games.go @@ -38,10 +38,10 @@ func (db *DatabaseFake) GetAllGames() ([]*model.Game, error) { return db.loadGames(), nil } -func (db *DatabaseFake) GetGameById(gameId string) (*model.Game, error) { +func (db *DatabaseFake) GetGameByID(gameID string) (*model.Game, error) { games := db.loadGames() for _, g := range games { - if g.ID == gameId { + if g.ID == gameID { return g, nil } } @@ -64,3 +64,14 @@ func (db *DatabaseFake) DeleteGame(string) error { func (db *DatabaseFake) UpdateGame(*model.Game) error { return nil } + +func (db *DatabaseFake) GetHamstersOfGame(game string) ([]*model.Hamster, error) { + hamsters := db.loadHamsters() + var hamstersFound []*model.Hamster + for _, g := range hamsters { + if g.Cage.Game.ID == game { + hamstersFound = append(hamstersFound, g) + } + } + return hamstersFound, nil +} diff --git a/storage/dao/fake/database_fake_hamsters.go b/storage/dao/fake/database_fake_hamsters.go index b463382..c10030b 100755 --- a/storage/dao/fake/database_fake_hamsters.go +++ b/storage/dao/fake/database_fake_hamsters.go @@ -34,14 +34,21 @@ func (db *DatabaseFake) loadHamsters() []*model.Hamster { return hamsters } -func (db *DatabaseFake) GetAllHamsters() ([]*model.Hamster, error) { - return db.loadHamsters(), nil +func (db *DatabaseFake) GetAllHamsters(gameID, cageID string) ([]*model.Hamster, error) { + hamsters := db.loadHamsters() + var hamsterFound []*model.Hamster + for _, g := range hamsters { + if g.Cage.ID == cageID && g.Cage.Game.ID == gameID { + hamsterFound = append(hamsterFound, g) + } + } + return hamsterFound, nil } -func (db *DatabaseFake) GetHamsterById(hamsterId string) (*model.Hamster, error) { +func (db *DatabaseFake) GetHamsterByID(hamsterID, gameID, cageID string) (*model.Hamster, error) { hamsters := db.loadHamsters() for _, g := range hamsters { - if g.ID == hamsterId { + if g.ID == hamsterID && g.Cage.ID == cageID && g.Cage.Game.ID == gameID { return g, nil } } diff --git a/storage/dao/fake/database_fake_users.go b/storage/dao/fake/database_fake_users.go index e25d5d4..ad24452 100755 --- a/storage/dao/fake/database_fake_users.go +++ b/storage/dao/fake/database_fake_users.go @@ -98,7 +98,7 @@ func (db *DatabaseFake) UpdateUser(user *model.User) error { func (db *DatabaseFake) GetUsersByGoogleID(userID string) (*model.User, error) { users := db.loadUsers() for _, u := range users { - if u.GoogleId == userID { + if u.GoogleID == userID { return u, nil } } diff --git a/storage/dao/postgresql/database_postgresql_cages.go b/storage/dao/postgresql/database_postgresql_cages.go index e138373..c64d3f1 100755 --- a/storage/dao/postgresql/database_postgresql_cages.go +++ b/storage/dao/postgresql/database_postgresql_cages.go @@ -7,12 +7,13 @@ import ( "hamster-tycoon/storage/model" ) -func (db *DatabasePostgreSQL) GetAllCages() ([]*model.Cage, error) { +func (db *DatabasePostgreSQL) GetAllCages(gameID string) ([]*model.Cage, error) { q := ` SELECT c.id, created_at, updated_at, game_id FROM public.Cage c + WHERE c.game_id=$1 ` - rows, err := db.session.Query(q) + rows, err := db.session.Query(q, gameID) if err != nil { return nil, err } @@ -33,13 +34,13 @@ func (db *DatabasePostgreSQL) GetAllCages() ([]*model.Cage, error) { return cages, nil } -func (db *DatabasePostgreSQL) GetCageById(id string) (*model.Cage, error) { +func (db *DatabasePostgreSQL) GetCageByID(gameID, cageID string) (*model.Cage, error) { q := ` SELECT c.id, created_at, updated_at, game_id FROM public.Cage c - WHERE c.id = $1 + WHERE c.game_id=$1 and c.id = $2 ` - row := db.session.QueryRow(q, id) + row := db.session.QueryRow(q, gameID, cageID) game := model.Game{} cage := model.Cage{ diff --git a/storage/dao/postgresql/database_postgresql_games.go b/storage/dao/postgresql/database_postgresql_games.go index 8d4b90b..8315eac 100755 --- a/storage/dao/postgresql/database_postgresql_games.go +++ b/storage/dao/postgresql/database_postgresql_games.go @@ -34,7 +34,7 @@ func (db *DatabasePostgreSQL) GetAllGames() ([]*model.Game, error) { return games, nil } -func (db *DatabasePostgreSQL) GetGameById(id string) (*model.Game, error) { +func (db *DatabasePostgreSQL) GetGameByID(id string) (*model.Game, error) { q := ` SELECT g.id, g.server_id, g.user_id, g.created_at, g.updated_at FROM public.game g @@ -88,6 +88,47 @@ func (db *DatabasePostgreSQL) DeleteGame(id string) error { return err } +func (db *DatabasePostgreSQL) GetHamstersOfGame(gameID string) ([]*model.Hamster, error) { + q := ` + SELECT id, created_at, updated_at, name, number, sexe, age, father_id, mother_id, hunger_level, thirst_level, weight, height, alive, sold, gestation, gestation_period, gestation_cooldown, gestation_father_id + FROM public.Hamster h + JOIN public.cage c + ON c.id = h.cage_id + JOIN public.game g + on c.game_id = g.id + WHERE g.id = $1 + ` + rows, err := db.session.Query(q, gameID) + if err != nil { + return nil, err + } + defer rows.Close() + + hamsters := make([]*model.Hamster, 0) + for rows.Next() { + hamster := model.Hamster{ + Mother: &model.Hamster{}, + Father: &model.Hamster{}, + GestationFather: &model.Hamster{}, + } + err := rows.Scan(&hamster.ID, &hamster.CreatedAt, + &hamster.UpdatedAt, &hamster.Name, + &hamster.Number, &hamster.Sexe, + &hamster.Age, &hamster.Father.ID, + &hamster.Mother.ID, &hamster.HungerLevel, + &hamster.ThirstLevel, &hamster.Weight, + &hamster.Height, &hamster.Alive, + &hamster.Sold, &hamster.Gestation, + &hamster.GestationPeriod, &hamster.GestationCooldown, + &hamster.GestationFather.ID) + if err != nil { + return nil, err + } + hamsters = append(hamsters, &hamster) + } + return hamsters, nil +} + func (db *DatabasePostgreSQL) UpdateGame(*model.Game) error { return nil } diff --git a/storage/dao/postgresql/database_postgresql_hamsters.go b/storage/dao/postgresql/database_postgresql_hamsters.go index aa38774..57902ee 100755 --- a/storage/dao/postgresql/database_postgresql_hamsters.go +++ b/storage/dao/postgresql/database_postgresql_hamsters.go @@ -7,12 +7,15 @@ import ( "hamster-tycoon/storage/model" ) -func (db *DatabasePostgreSQL) GetAllHamsters() ([]*model.Hamster, error) { +func (db *DatabasePostgreSQL) GetAllHamsters(gameID, cageID string) ([]*model.Hamster, error) { q := ` - SELECT id, created_at, updated_at, name, number, sexe, age, father_id, mother_id, hunger_level, thirst_level, weight, height, alive, sold, gestation, gestation_period, gestation_cooldown, gestation_father_id - FROM public.Hamster h + SELECT id, created_at, updated_at, name, number, sexe, age, father_id, mother_id, hunger_level, thirst_level, weight, height, alive, sold, gestation, gestation_period, gestation_cooldown, gestation_father_id, cage_id + FROM hamster h + JOIN cage c ON h.cage_id = c.id + JOIN game g on c.game_id = g.id + WHERE c.id=$1 and g.id=$2 ` - rows, err := db.session.Query(q) + rows, err := db.session.Query(q, cageID, gameID) if err != nil { return nil, err } @@ -24,6 +27,7 @@ func (db *DatabasePostgreSQL) GetAllHamsters() ([]*model.Hamster, error) { Mother: &model.Hamster{}, Father: &model.Hamster{}, GestationFather: &model.Hamster{}, + Cage: &model.Cage{}, } err := rows.Scan(&hamster.ID, &hamster.CreatedAt, &hamster.UpdatedAt, &hamster.Name, @@ -34,7 +38,7 @@ func (db *DatabasePostgreSQL) GetAllHamsters() ([]*model.Hamster, error) { &hamster.Height, &hamster.Alive, &hamster.Sold, &hamster.Gestation, &hamster.GestationPeriod, &hamster.GestationCooldown, - &hamster.GestationFather.ID) + &hamster.GestationFather.ID, &hamster.Cage.ID) if err != nil { return nil, err } @@ -43,18 +47,21 @@ func (db *DatabasePostgreSQL) GetAllHamsters() ([]*model.Hamster, error) { return hamsters, nil } -func (db *DatabasePostgreSQL) GetHamsterById(id string) (*model.Hamster, error) { +func (db *DatabasePostgreSQL) GetHamsterByID(id, gameID, cageID string) (*model.Hamster, error) { q := ` - SELECT id, created_at, updated_at, name, number, sexe, age, father_id, mother_id, hunger_level, thirst_level, weight, height, alive, sold, gestation, gestation_period, gestation_cooldown, gestation_father_id - FROM public.Hamster h - WHERE c.id = $1 + SELECT id, created_at, updated_at, name, number, sexe, age, father_id, mother_id, hunger_level, thirst_level, weight, height, alive, sold, gestation, gestation_period, gestation_cooldown, gestation_father_id, cage_id + FROM hamster h + JOIN cage c ON h.cage_id = c.id + JOIN game g on c.game_id = g.id + WHERE h.id=$1 and c.id=$2 and g.id=$3 ` - row := db.session.QueryRow(q, id) + row := db.session.QueryRow(q, id, cageID, gameID) hamster := model.Hamster{ Mother: &model.Hamster{}, Father: &model.Hamster{}, GestationFather: &model.Hamster{}, + Cage: &model.Cage{}, } err := row.Scan(&hamster.ID, &hamster.CreatedAt, &hamster.UpdatedAt, &hamster.Name, @@ -65,7 +72,7 @@ func (db *DatabasePostgreSQL) GetHamsterById(id string) (*model.Hamster, error) &hamster.Height, &hamster.Alive, &hamster.Sold, &hamster.Gestation, &hamster.GestationPeriod, &hamster.GestationCooldown, - &hamster.GestationFather.ID) + &hamster.GestationFather.ID, &hamster.Cage.ID) if errPq, ok := err.(*pq.Error); ok { return nil, handlePgError(errPq) @@ -79,9 +86,9 @@ func (db *DatabasePostgreSQL) GetHamsterById(id string) (*model.Hamster, error) func (db *DatabasePostgreSQL) CreateHamster(hamster *model.Hamster) error { q := ` INSERT INTO public.Hamster - (name, number, sexe, age, father_id, mother_id, hunger_level, thirst_level, weight, height, alive, sold, gestation, gestation_period, gestation_cooldown, gestation_father_id) + (name, number, sexe, age, father_id, mother_id, hunger_level, thirst_level, weight, height, alive, sold, gestation, gestation_period, gestation_cooldown, gestation_father_id,cage_id) VALUES - ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16) + ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17) RETURNING id, created_at ` @@ -94,7 +101,7 @@ func (db *DatabasePostgreSQL) CreateHamster(hamster *model.Hamster) error { &hamster.Height, &hamster.Alive, &hamster.Sold, &hamster.Gestation, &hamster.GestationPeriod, &hamster.GestationCooldown, - &hamster.GestationFather.ID). + &hamster.GestationFather.ID, &hamster.Cage.ID). Scan(&hamster.ID, &hamster.CreatedAt) if errPq, ok := err.(*pq.Error); ok { return handlePgError(errPq) diff --git a/storage/dao/postgresql/database_postgresql_user.go b/storage/dao/postgresql/database_postgresql_user.go index 961019e..c7dff24 100755 --- a/storage/dao/postgresql/database_postgresql_user.go +++ b/storage/dao/postgresql/database_postgresql_user.go @@ -60,7 +60,7 @@ func (db *DatabasePostgreSQL) CreateUser(user *model.User) error { ` err := db.session. - QueryRow(q, user.Nickname, user.GoogleId). + QueryRow(q, user.Nickname, user.GoogleID). Scan(&user.ID, &user.CreatedAt) if errPq, ok := err.(*pq.Error); ok { return handlePgError(errPq) @@ -94,7 +94,7 @@ func (db *DatabasePostgreSQL) GetUsersByGoogleID(id string) (*model.User, error) row := db.session.QueryRow(q, id) u := model.User{} - err := row.Scan(&u.ID, &u.CreatedAt, &u.UpdatedAt, &u.Nickname, &u.GoogleId) + err := row.Scan(&u.ID, &u.CreatedAt, &u.UpdatedAt, &u.Nickname, &u.GoogleID) if errPq, ok := err.(*pq.Error); ok { return nil, handlePgError(errPq) } diff --git a/storage/model/hamster.go b/storage/model/hamster.go index 87c250a..d8a7ff3 100644 --- a/storage/model/hamster.go +++ b/storage/model/hamster.go @@ -51,6 +51,7 @@ type Hamster struct { Child []*Hamster `json:"childs"` CreatedAt time.Time `json:"createdAt"` UpdatedAt *time.Time `json:"updatedAt"` + Cage *Cage `json:"cage"` } func (h *Hamster) Die() { @@ -90,9 +91,8 @@ func (h *Hamster) Fuck(another *Hamster) (bool, error) { female, male := func() (*Hamster, *Hamster) { if h.Sexe == FEMALE { return h, another - } else { - return another, h } + return another, h }() female.GestationFather = male female.Gestation = true @@ -147,9 +147,8 @@ func randSexe() string { return func() string { if randNumber(1, 2) == 2 { return MALE - } else { - return FEMALE } + return FEMALE }() } diff --git a/storage/model/user.go b/storage/model/user.go index 3fb2ec6..f7ec5a9 100755 --- a/storage/model/user.go +++ b/storage/model/user.go @@ -9,7 +9,7 @@ type User struct { ID string `json:"id"` CreatedAt time.Time `json:"createdAt"` UpdatedAt *time.Time `json:"updatedAt"` - GoogleId string `json:"-"` + GoogleID string `json:"-"` Games []Game } diff --git a/storage/model/user_data.go b/storage/model/user_data.go index 81dc9b4..48545f8 100644 --- a/storage/model/user_data.go +++ b/storage/model/user_data.go @@ -10,7 +10,7 @@ type UserData struct { } type UserDataEditable struct { - UserId string `json:'userId'` + UserID string `json:'userID'` Type string `json:"type"` Name string `json:"name"` Content string `json:"content"`