add missing path property handling
This commit is contained in:
@@ -11,7 +11,14 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func (hc *handlersContext) getAllCages(c *gin.Context) {
|
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 {
|
if err != nil {
|
||||||
utils.GetLoggerFromCtx(c).WithError(err).Error("error while getting cages")
|
utils.GetLoggerFromCtx(c).WithError(err).Error("error while getting cages")
|
||||||
utils.JSONErrorWithMessage(c.Writer, model.ErrInternalServer, "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) {
|
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")
|
err := hc.validator.VarCtx(c, cageID, "uuid4")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -29,8 +37,14 @@ func (hc *handlersContext) getACage(c *gin.Context) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
cage, err := hc.db.GetCageById(cageID)
|
err = hc.validator.VarCtx(c, gameID, "uuid4")
|
||||||
if e, ok := err.(*dao.DAOError); ok {
|
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 {
|
switch {
|
||||||
case e.Type == dao.ErrTypeNotFound:
|
case e.Type == dao.ErrTypeNotFound:
|
||||||
utils.JSONErrorWithMessage(c.Writer, model.ErrNotFound, "Cage not found")
|
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) {
|
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()
|
b, err := c.GetRawData()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
utils.GetLoggerFromCtx(c).WithError(err).Error("error while creating cage, read data fail")
|
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
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
cageToCreate.Game = model.Game{ID: gameID}
|
||||||
err = hc.db.CreateCage(&cageToCreate)
|
err = hc.db.CreateCage(&cageToCreate)
|
||||||
if e, ok := err.(*dao.DAOError); ok {
|
if e, ok := err.(*dao.Error); ok {
|
||||||
switch {
|
switch {
|
||||||
case e.Type == dao.ErrTypeDuplicate:
|
case e.Type == dao.ErrTypeDuplicate:
|
||||||
utils.JSONErrorWithMessage(c.Writer, model.ErrAlreadyExists, "Cage already exists")
|
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) {
|
func (hc *handlersContext) deleteACage(c *gin.Context) {
|
||||||
|
gameID := c.Param("gameID")
|
||||||
cageID := c.Param("cageId")
|
cageID := c.Param("cageID")
|
||||||
|
|
||||||
err := hc.validator.VarCtx(c, cageID, "uuid4")
|
err := hc.validator.VarCtx(c, cageID, "uuid4")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -109,9 +131,15 @@ func (hc *handlersContext) deleteACage(c *gin.Context) {
|
|||||||
return
|
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
|
// check cage id given in URL exists
|
||||||
_, err = hc.db.GetCageById(cageID)
|
_, err = hc.db.GetCageByID(gameID, cageID)
|
||||||
if e, ok := err.(*dao.DAOError); ok {
|
if e, ok := err.(*dao.Error); ok {
|
||||||
switch {
|
switch {
|
||||||
case e.Type == dao.ErrTypeNotFound:
|
case e.Type == dao.ErrTypeNotFound:
|
||||||
utils.JSONErrorWithMessage(c.Writer, model.ErrNotFound, "Cage to delete not found")
|
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)
|
err = hc.db.DeleteCage(cageID)
|
||||||
if e, ok := err.(*dao.DAOError); ok {
|
if e, ok := err.(*dao.Error); ok {
|
||||||
switch {
|
switch {
|
||||||
case e.Type == dao.ErrTypeNotFound:
|
case e.Type == dao.ErrTypeNotFound:
|
||||||
utils.JSONErrorWithMessage(c.Writer, model.ErrNotFound, "Cage to delete not found")
|
utils.JSONErrorWithMessage(c.Writer, model.ErrNotFound, "Cage to delete not found")
|
||||||
|
|||||||
@@ -21,16 +21,16 @@ func (hc *handlersContext) getAllGames(c *gin.Context) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (hc *handlersContext) getAGame(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 {
|
if err != nil {
|
||||||
utils.JSONError(c.Writer, validators.NewDataValidationAPIError(err))
|
utils.JSONError(c.Writer, validators.NewDataValidationAPIError(err))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
game, err := hc.gameService.GetAGameById(gameId)
|
game, err := hc.gameService.GetAGameByID(gameID)
|
||||||
if e, ok := err.(*dao.DAOError); ok {
|
if e, ok := err.(*dao.Error); ok {
|
||||||
switch {
|
switch {
|
||||||
case e.Type == dao.ErrTypeNotFound:
|
case e.Type == dao.ErrTypeNotFound:
|
||||||
utils.JSONErrorWithMessage(c.Writer, model.ErrNotFound, "Game not found")
|
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)
|
err = hc.db.CreateGame(&gameToCreate)
|
||||||
if e, ok := err.(*dao.DAOError); ok {
|
if e, ok := err.(*dao.Error); ok {
|
||||||
switch {
|
switch {
|
||||||
case e.Type == dao.ErrTypeDuplicate:
|
case e.Type == dao.ErrTypeDuplicate:
|
||||||
utils.JSONErrorWithMessage(c.Writer, model.ErrAlreadyExists, "Game already exists")
|
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) {
|
func (hc *handlersContext) deleteAGame(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 {
|
if err != nil {
|
||||||
@@ -110,8 +110,8 @@ func (hc *handlersContext) deleteAGame(c *gin.Context) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// check game id given in URL exists
|
// check game id given in URL exists
|
||||||
_, err = hc.db.GetGameById(gameID)
|
_, err = hc.db.GetGameByID(gameID)
|
||||||
if e, ok := err.(*dao.DAOError); ok {
|
if e, ok := err.(*dao.Error); ok {
|
||||||
switch {
|
switch {
|
||||||
case e.Type == dao.ErrTypeNotFound:
|
case e.Type == dao.ErrTypeNotFound:
|
||||||
utils.JSONErrorWithMessage(c.Writer, model.ErrNotFound, "Game to delete not found")
|
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)
|
err = hc.db.DeleteGame(gameID)
|
||||||
if e, ok := err.(*dao.DAOError); ok {
|
if e, ok := err.(*dao.Error); ok {
|
||||||
switch {
|
switch {
|
||||||
case e.Type == dao.ErrTypeNotFound:
|
case e.Type == dao.ErrTypeNotFound:
|
||||||
utils.JSONErrorWithMessage(c.Writer, model.ErrNotFound, "Game to delete not found")
|
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) {
|
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)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,7 +11,22 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func (hc *handlersContext) getAllHamsters(c *gin.Context) {
|
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 {
|
if err != nil {
|
||||||
utils.GetLoggerFromCtx(c).WithError(err).Error("error while getting hamsters")
|
utils.GetLoggerFromCtx(c).WithError(err).Error("error while getting hamsters")
|
||||||
utils.JSONErrorWithMessage(c.Writer, model.ErrInternalServer, "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) {
|
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 {
|
if err != nil {
|
||||||
utils.JSONError(c.Writer, validators.NewDataValidationAPIError(err))
|
utils.JSONError(c.Writer, validators.NewDataValidationAPIError(err))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
hamster, err := hc.db.GetHamsterById(hamsterID)
|
err = hc.validator.VarCtx(c, gameID, "uuid4")
|
||||||
if e, ok := err.(*dao.DAOError); ok {
|
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 {
|
switch {
|
||||||
case e.Type == dao.ErrTypeNotFound:
|
case e.Type == dao.ErrTypeNotFound:
|
||||||
utils.JSONErrorWithMessage(c.Writer, model.ErrNotFound, "Hamster not found")
|
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) {
|
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()
|
b, err := c.GetRawData()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
utils.GetLoggerFromCtx(c).WithError(err).Error("error while creating hamster, read data fail")
|
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
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
hamsterToCreate.Cage = &model.Cage{ID: cageID, Game: model.Game{ID: gameID}}
|
||||||
err = hc.db.CreateHamster(&hamsterToCreate)
|
err = hc.db.CreateHamster(&hamsterToCreate)
|
||||||
if e, ok := err.(*dao.DAOError); ok {
|
if e, ok := err.(*dao.Error); ok {
|
||||||
switch {
|
switch {
|
||||||
case e.Type == dao.ErrTypeDuplicate:
|
case e.Type == dao.ErrTypeDuplicate:
|
||||||
utils.JSONErrorWithMessage(c.Writer, model.ErrAlreadyExists, "Hamster already exists")
|
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) {
|
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 {
|
if err != nil {
|
||||||
utils.JSONError(c.Writer, validators.NewDataValidationAPIError(err))
|
utils.JSONError(c.Writer, validators.NewDataValidationAPIError(err))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// check hamster id given in URL exists
|
// check hamster id given in URL exists
|
||||||
_, err = hc.db.GetHamsterById(hamsterID)
|
_, err = hc.db.GetHamsterByID(hamsterID, gameID, cageID)
|
||||||
if e, ok := err.(*dao.DAOError); ok {
|
if e, ok := err.(*dao.Error); ok {
|
||||||
switch {
|
switch {
|
||||||
case e.Type == dao.ErrTypeNotFound:
|
case e.Type == dao.ErrTypeNotFound:
|
||||||
utils.JSONErrorWithMessage(c.Writer, model.ErrNotFound, "Hamster to delete not found")
|
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)
|
err = hc.db.DeleteHamster(hamsterID)
|
||||||
if e, ok := err.(*dao.DAOError); ok {
|
if e, ok := err.(*dao.Error); ok {
|
||||||
switch {
|
switch {
|
||||||
case e.Type == dao.ErrTypeNotFound:
|
case e.Type == dao.ErrTypeNotFound:
|
||||||
utils.JSONErrorWithMessage(c.Writer, model.ErrNotFound, "Hamster to delete not found")
|
utils.JSONErrorWithMessage(c.Writer, model.ErrNotFound, "Hamster to delete not found")
|
||||||
|
|||||||
@@ -75,32 +75,32 @@ func NewRouter(config *Config) *gin.Engine {
|
|||||||
securedUserRoute := userRoute.Group("")
|
securedUserRoute := userRoute.Group("")
|
||||||
//TODO add secure auth
|
//TODO add secure auth
|
||||||
securedUserRoute.Handle(http.MethodGet, "", hc.getAllUsers)
|
securedUserRoute.Handle(http.MethodGet, "", hc.getAllUsers)
|
||||||
securedUserRoute.Handle(http.MethodGet, "/:userId", hc.getUser)
|
securedUserRoute.Handle(http.MethodGet, "/:userID", hc.getUser)
|
||||||
securedUserRoute.Handle(http.MethodPut, "/:userId", hc.updateUser)
|
securedUserRoute.Handle(http.MethodPut, "/:userID", hc.updateUser)
|
||||||
securedUserRoute.Handle(http.MethodDelete, "/:userId", hc.deleteUser)
|
securedUserRoute.Handle(http.MethodDelete, "/:userID", hc.deleteUser)
|
||||||
// end: user routes
|
// end: user routes
|
||||||
|
|
||||||
gameRoute := securedUserRoute.Group("/:userId/games")
|
gameRoute := securedUserRoute.Group("/:userID/games")
|
||||||
gameRoute.Handle(http.MethodGet, "", hc.getAllGames)
|
gameRoute.Handle(http.MethodGet, "", hc.getAllGames)
|
||||||
gameRoute.Handle(http.MethodGet, "/:gameId", hc.getAGame)
|
gameRoute.Handle(http.MethodGet, "/:gameID", hc.getAGame)
|
||||||
gameRoute.Handle(http.MethodPost, "/:gameId", hc.createAGame)
|
gameRoute.Handle(http.MethodPost, "/:gameID", hc.createAGame)
|
||||||
gameRoute.Handle(http.MethodPut, "/:gameId", hc.updateAGame)
|
gameRoute.Handle(http.MethodPut, "/:gameID", hc.updateAGame)
|
||||||
gameRoute.Handle(http.MethodGet, "/:gameId/hamsters", hc.getHamstersOfGame)
|
gameRoute.Handle(http.MethodGet, "/:gameID/hamsters", hc.getHamstersOfGame)
|
||||||
gameRoute.Handle(http.MethodDelete, "/:gameId", hc.deleteAGame)
|
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, "", hc.getAllCages)
|
||||||
cageRoute.Handle(http.MethodGet, "/:cageId", hc.getACage)
|
cageRoute.Handle(http.MethodGet, "/:cageID", hc.getACage)
|
||||||
cageRoute.Handle(http.MethodPost, "/:cageId", hc.createACage)
|
cageRoute.Handle(http.MethodPost, "/:cageID", hc.createACage)
|
||||||
cageRoute.Handle(http.MethodPut, "/:cageId", hc.updateACage)
|
cageRoute.Handle(http.MethodPut, "/:cageID", hc.updateACage)
|
||||||
cageRoute.Handle(http.MethodDelete, "/:cageId", hc.deleteACage)
|
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, "", hc.getAllHamsters)
|
||||||
hamsterRoute.Handle(http.MethodGet, "/:hamsterId", hc.getAHamster)
|
hamsterRoute.Handle(http.MethodGet, "/:hamsterID", hc.getAHamster)
|
||||||
hamsterRoute.Handle(http.MethodPost, "/:hamsterId", hc.createAHamster)
|
hamsterRoute.Handle(http.MethodPost, "/:hamsterID", hc.createAHamster)
|
||||||
hamsterRoute.Handle(http.MethodPut, "/:hamsterId", hc.updateAHamster)
|
hamsterRoute.Handle(http.MethodPut, "/:hamsterID", hc.updateAHamster)
|
||||||
hamsterRoute.Handle(http.MethodDelete, "/:hamsterId", hc.deleteAHamster)
|
hamsterRoute.Handle(http.MethodDelete, "/:hamsterID", hc.deleteAHamster)
|
||||||
|
|
||||||
return router
|
return router
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -43,7 +43,7 @@ func (hc *handlersContext) connectUser(c *gin.Context) {
|
|||||||
utils.JSONError(c.Writer, model.ErrBadRequestFormat)
|
utils.JSONError(c.Writer, model.ErrBadRequestFormat)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
user, err := hc.userService.GetUserFromGoogleId(tokenInfo.UserId)
|
user, err := hc.userService.GetUserFromGoogleID(tokenInfo.UserId)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
utils.GetLogger().WithError(err).Error(err)
|
utils.GetLogger().WithError(err).Error(err)
|
||||||
if castedError, ok := err.(*model.APIError); ok {
|
if castedError, ok := err.(*model.APIError); ok {
|
||||||
@@ -92,7 +92,7 @@ func (hc *handlersContext) createUser(c *gin.Context) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
err = hc.db.CreateUser(&user)
|
err = hc.db.CreateUser(&user)
|
||||||
if e, ok := err.(*dao.DAOError); ok {
|
if e, ok := err.(*dao.Error); ok {
|
||||||
switch {
|
switch {
|
||||||
case e.Type == dao.ErrTypeDuplicate:
|
case e.Type == dao.ErrTypeDuplicate:
|
||||||
utils.JSONErrorWithMessage(c.Writer, model.ErrAlreadyExists, "User already exists")
|
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)
|
user, err := hc.db.GetUsersByID(userID)
|
||||||
if e, ok := err.(*dao.DAOError); ok {
|
if e, ok := err.(*dao.Error); ok {
|
||||||
switch {
|
switch {
|
||||||
case e.Type == dao.ErrTypeNotFound:
|
case e.Type == dao.ErrTypeNotFound:
|
||||||
utils.JSONErrorWithMessage(c.Writer, model.ErrNotFound, "User not found")
|
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
|
// check user id given in URL exists
|
||||||
_, err = hc.db.GetUsersByID(userID)
|
_, err = hc.db.GetUsersByID(userID)
|
||||||
if e, ok := err.(*dao.DAOError); ok {
|
if e, ok := err.(*dao.Error); ok {
|
||||||
switch {
|
switch {
|
||||||
case e.Type == dao.ErrTypeNotFound:
|
case e.Type == dao.ErrTypeNotFound:
|
||||||
utils.JSONErrorWithMessage(c.Writer, model.ErrNotFound, "User to delete not found")
|
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)
|
err = hc.db.DeleteUser(userID)
|
||||||
if e, ok := err.(*dao.DAOError); ok {
|
if e, ok := err.(*dao.Error); ok {
|
||||||
switch {
|
switch {
|
||||||
case e.Type == dao.ErrTypeNotFound:
|
case e.Type == dao.ErrTypeNotFound:
|
||||||
utils.JSONErrorWithMessage(c.Writer, model.ErrNotFound, "User to delete not found")
|
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
|
// check user id given in URL exists
|
||||||
user, err := hc.db.GetUsersByID(userID)
|
user, err := hc.db.GetUsersByID(userID)
|
||||||
if e, ok := err.(*dao.DAOError); ok {
|
if e, ok := err.(*dao.Error); ok {
|
||||||
switch {
|
switch {
|
||||||
case e.Type == dao.ErrTypeNotFound:
|
case e.Type == dao.ErrTypeNotFound:
|
||||||
utils.JSONErrorWithMessage(c.Writer, model.ErrNotFound, "User to update not found")
|
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
|
// make the update
|
||||||
err = hc.db.UpdateUser(user)
|
err = hc.db.UpdateUser(user)
|
||||||
if e, ok := err.(*dao.DAOError); ok {
|
if e, ok := err.(*dao.Error); ok {
|
||||||
switch {
|
switch {
|
||||||
case e.Type == dao.ErrTypeNotFound:
|
case e.Type == dao.ErrTypeNotFound:
|
||||||
utils.JSONErrorWithMessage(c.Writer, model.ErrNotFound, "User to update not found")
|
utils.JSONErrorWithMessage(c.Writer, model.ErrNotFound, "User to update not found")
|
||||||
|
|||||||
@@ -32,6 +32,9 @@
|
|||||||
<column name="mother_id" type="uuid">
|
<column name="mother_id" type="uuid">
|
||||||
<constraints nullable="false"/>
|
<constraints nullable="false"/>
|
||||||
</column>
|
</column>
|
||||||
|
<column name="cage_id" type="uuid">
|
||||||
|
<constraints nullable="false"/>
|
||||||
|
</column>
|
||||||
<column name="hunger_level" type="integer">
|
<column name="hunger_level" type="integer">
|
||||||
<constraints nullable="false"/>
|
<constraints nullable="false"/>
|
||||||
</column>
|
</column>
|
||||||
|
|||||||
@@ -13,10 +13,10 @@ func NewGameService(database dao.Database) *GameService {
|
|||||||
return &GameService{serviceContext{db: database}}
|
return &GameService{serviceContext{db: database}}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (gs *GameService) GetAGameById(id string) (*model.Game, error) {
|
func (gs *GameService) GetAGameByID(id string) (*model.Game, error) {
|
||||||
game, err := gs.db.GetGameById(id)
|
game, err := gs.db.GetGameByID(id)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if castedError, ok := err.(*dao.DAOError); ok {
|
if castedError, ok := err.(*dao.Error); ok {
|
||||||
switch castedError.Type {
|
switch castedError.Type {
|
||||||
case dao.ErrTypeNotFound:
|
case dao.ErrTypeNotFound:
|
||||||
return nil, &model.ErrNotFound
|
return nil, &model.ErrNotFound
|
||||||
|
|||||||
@@ -14,10 +14,10 @@ func NewUserService(database dao.Database) *UserService {
|
|||||||
return &UserService{serviceContext{db: database}}
|
return &UserService{serviceContext{db: database}}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (us *UserService) GetUserFromGoogleId(googleUserId string) (*model.User, error) {
|
func (us *UserService) GetUserFromGoogleID(googleUserID string) (*model.User, error) {
|
||||||
user, err := us.db.GetUsersByGoogleID(googleUserId)
|
user, err := us.db.GetUsersByGoogleID(googleUserID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if castedError, ok := err.(*dao.DAOError); ok {
|
if castedError, ok := err.(*dao.Error); ok {
|
||||||
switch castedError.Type {
|
switch castedError.Type {
|
||||||
case dao.ErrTypeNotFound:
|
case dao.ErrTypeNotFound:
|
||||||
return nil, &model.ErrNotFound
|
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) {
|
func (us *UserService) CreateUserFromGoogleToken(id string, email string) (*model.User, error) {
|
||||||
randNick := utils.String(20)
|
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)
|
err := us.db.CreateUser(user)
|
||||||
return user, err
|
return user, err
|
||||||
|
|
||||||
|
|||||||
@@ -17,25 +17,26 @@ type Database interface {
|
|||||||
|
|
||||||
// start: cage games funcs
|
// start: cage games funcs
|
||||||
GetAllGames() ([]*model.Game, error)
|
GetAllGames() ([]*model.Game, error)
|
||||||
GetGameById(string) (*model.Game, error)
|
GetGameByID(string) (*model.Game, error)
|
||||||
CreateGame(*model.Game) error
|
CreateGame(*model.Game) error
|
||||||
DeleteGame(string) error
|
DeleteGame(string) error
|
||||||
UpdateGame(*model.Game) error
|
UpdateGame(*model.Game) error
|
||||||
// end: games dao funcs
|
// end: games dao funcs
|
||||||
|
|
||||||
// start: cage cages funcs
|
// start: cage funcs
|
||||||
GetAllCages() ([]*model.Cage, error)
|
GetAllCages(string) ([]*model.Cage, error)
|
||||||
GetCageById(string) (*model.Cage, error)
|
GetCageByID(string, string) (*model.Cage, error)
|
||||||
CreateCage(*model.Cage) error
|
CreateCage(*model.Cage) error
|
||||||
DeleteCage(string) error
|
DeleteCage(string) error
|
||||||
UpdateCage(*model.Cage) error
|
UpdateCage(*model.Cage) error
|
||||||
// end: games dao funcs
|
// end: cage dao funcs
|
||||||
// start: cage cages funcs
|
// start: hamster funcs
|
||||||
GetAllHamsters() ([]*model.Hamster, error)
|
GetAllHamsters(string, string) ([]*model.Hamster, error)
|
||||||
GetHamsterById(string) (*model.Hamster, error)
|
GetHamsterByID(string, string, string) (*model.Hamster, error)
|
||||||
CreateHamster(*model.Hamster) error
|
CreateHamster(*model.Hamster) error
|
||||||
DeleteHamster(string) error
|
DeleteHamster(string) error
|
||||||
UpdateHamster(*model.Hamster) error
|
UpdateHamster(*model.Hamster) error
|
||||||
// end: games dao funcs
|
GetHamstersOfGame(string) ([]*model.Hamster, error)
|
||||||
|
// end: hamster dao funcs
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,19 +12,19 @@ const (
|
|||||||
ErrTypeForeignKeyViolation
|
ErrTypeForeignKeyViolation
|
||||||
)
|
)
|
||||||
|
|
||||||
type DAOError struct {
|
type Error struct {
|
||||||
Cause error
|
Cause error
|
||||||
Type Type
|
Type Type
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewDAOError(t Type, cause error) error {
|
func NewDAOError(t Type, cause error) error {
|
||||||
return &DAOError{
|
return &Error{
|
||||||
Type: t,
|
Type: t,
|
||||||
Cause: cause,
|
Cause: cause,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *DAOError) Error() string {
|
func (e *Error) Error() string {
|
||||||
if e.Cause != nil {
|
if e.Cause != nil {
|
||||||
return fmt.Sprintf("Type %d: %s", e.Type, e.Cause.Error())
|
return fmt.Sprintf("Type %d: %s", e.Type, e.Cause.Error())
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -34,14 +34,21 @@ func (db *DatabaseFake) loadCages() []*model.Cage {
|
|||||||
return cages
|
return cages
|
||||||
}
|
}
|
||||||
|
|
||||||
func (db *DatabaseFake) GetAllCages() ([]*model.Cage, error) {
|
func (db *DatabaseFake) GetAllCages(gameID string) ([]*model.Cage, error) {
|
||||||
return db.loadCages(), nil
|
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()
|
cages := db.loadCages()
|
||||||
for _, g := range cages {
|
for _, g := range cages {
|
||||||
if g.ID == cageId {
|
if g.Game.ID == gameID && g.ID == cageID {
|
||||||
return g, nil
|
return g, nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -38,10 +38,10 @@ func (db *DatabaseFake) GetAllGames() ([]*model.Game, error) {
|
|||||||
return db.loadGames(), nil
|
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()
|
games := db.loadGames()
|
||||||
for _, g := range games {
|
for _, g := range games {
|
||||||
if g.ID == gameId {
|
if g.ID == gameID {
|
||||||
return g, nil
|
return g, nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -64,3 +64,14 @@ func (db *DatabaseFake) DeleteGame(string) error {
|
|||||||
func (db *DatabaseFake) UpdateGame(*model.Game) error {
|
func (db *DatabaseFake) UpdateGame(*model.Game) error {
|
||||||
return nil
|
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
|
||||||
|
}
|
||||||
|
|||||||
@@ -34,14 +34,21 @@ func (db *DatabaseFake) loadHamsters() []*model.Hamster {
|
|||||||
return hamsters
|
return hamsters
|
||||||
}
|
}
|
||||||
|
|
||||||
func (db *DatabaseFake) GetAllHamsters() ([]*model.Hamster, error) {
|
func (db *DatabaseFake) GetAllHamsters(gameID, cageID string) ([]*model.Hamster, error) {
|
||||||
return db.loadHamsters(), nil
|
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()
|
hamsters := db.loadHamsters()
|
||||||
for _, g := range hamsters {
|
for _, g := range hamsters {
|
||||||
if g.ID == hamsterId {
|
if g.ID == hamsterID && g.Cage.ID == cageID && g.Cage.Game.ID == gameID {
|
||||||
return g, nil
|
return g, nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -98,7 +98,7 @@ func (db *DatabaseFake) UpdateUser(user *model.User) error {
|
|||||||
func (db *DatabaseFake) GetUsersByGoogleID(userID string) (*model.User, error) {
|
func (db *DatabaseFake) GetUsersByGoogleID(userID string) (*model.User, error) {
|
||||||
users := db.loadUsers()
|
users := db.loadUsers()
|
||||||
for _, u := range users {
|
for _, u := range users {
|
||||||
if u.GoogleId == userID {
|
if u.GoogleID == userID {
|
||||||
return u, nil
|
return u, nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,12 +7,13 @@ import (
|
|||||||
"hamster-tycoon/storage/model"
|
"hamster-tycoon/storage/model"
|
||||||
)
|
)
|
||||||
|
|
||||||
func (db *DatabasePostgreSQL) GetAllCages() ([]*model.Cage, error) {
|
func (db *DatabasePostgreSQL) GetAllCages(gameID string) ([]*model.Cage, error) {
|
||||||
q := `
|
q := `
|
||||||
SELECT c.id, created_at, updated_at, game_id
|
SELECT c.id, created_at, updated_at, game_id
|
||||||
FROM public.Cage c
|
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 {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -33,13 +34,13 @@ func (db *DatabasePostgreSQL) GetAllCages() ([]*model.Cage, error) {
|
|||||||
return cages, nil
|
return cages, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (db *DatabasePostgreSQL) GetCageById(id string) (*model.Cage, error) {
|
func (db *DatabasePostgreSQL) GetCageByID(gameID, cageID string) (*model.Cage, error) {
|
||||||
q := `
|
q := `
|
||||||
SELECT c.id, created_at, updated_at, game_id
|
SELECT c.id, created_at, updated_at, game_id
|
||||||
FROM public.Cage c
|
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{}
|
game := model.Game{}
|
||||||
cage := model.Cage{
|
cage := model.Cage{
|
||||||
|
|||||||
@@ -34,7 +34,7 @@ func (db *DatabasePostgreSQL) GetAllGames() ([]*model.Game, error) {
|
|||||||
return games, nil
|
return games, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (db *DatabasePostgreSQL) GetGameById(id string) (*model.Game, error) {
|
func (db *DatabasePostgreSQL) GetGameByID(id string) (*model.Game, error) {
|
||||||
q := `
|
q := `
|
||||||
SELECT g.id, g.server_id, g.user_id, g.created_at, g.updated_at
|
SELECT g.id, g.server_id, g.user_id, g.created_at, g.updated_at
|
||||||
FROM public.game g
|
FROM public.game g
|
||||||
@@ -88,6 +88,47 @@ func (db *DatabasePostgreSQL) DeleteGame(id string) error {
|
|||||||
return err
|
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 {
|
func (db *DatabasePostgreSQL) UpdateGame(*model.Game) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,12 +7,15 @@ import (
|
|||||||
"hamster-tycoon/storage/model"
|
"hamster-tycoon/storage/model"
|
||||||
)
|
)
|
||||||
|
|
||||||
func (db *DatabasePostgreSQL) GetAllHamsters() ([]*model.Hamster, error) {
|
func (db *DatabasePostgreSQL) GetAllHamsters(gameID, cageID string) ([]*model.Hamster, error) {
|
||||||
q := `
|
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
|
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 public.Hamster h
|
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 {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -24,6 +27,7 @@ func (db *DatabasePostgreSQL) GetAllHamsters() ([]*model.Hamster, error) {
|
|||||||
Mother: &model.Hamster{},
|
Mother: &model.Hamster{},
|
||||||
Father: &model.Hamster{},
|
Father: &model.Hamster{},
|
||||||
GestationFather: &model.Hamster{},
|
GestationFather: &model.Hamster{},
|
||||||
|
Cage: &model.Cage{},
|
||||||
}
|
}
|
||||||
err := rows.Scan(&hamster.ID, &hamster.CreatedAt,
|
err := rows.Scan(&hamster.ID, &hamster.CreatedAt,
|
||||||
&hamster.UpdatedAt, &hamster.Name,
|
&hamster.UpdatedAt, &hamster.Name,
|
||||||
@@ -34,7 +38,7 @@ func (db *DatabasePostgreSQL) GetAllHamsters() ([]*model.Hamster, error) {
|
|||||||
&hamster.Height, &hamster.Alive,
|
&hamster.Height, &hamster.Alive,
|
||||||
&hamster.Sold, &hamster.Gestation,
|
&hamster.Sold, &hamster.Gestation,
|
||||||
&hamster.GestationPeriod, &hamster.GestationCooldown,
|
&hamster.GestationPeriod, &hamster.GestationCooldown,
|
||||||
&hamster.GestationFather.ID)
|
&hamster.GestationFather.ID, &hamster.Cage.ID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -43,18 +47,21 @@ func (db *DatabasePostgreSQL) GetAllHamsters() ([]*model.Hamster, error) {
|
|||||||
return hamsters, nil
|
return hamsters, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (db *DatabasePostgreSQL) GetHamsterById(id string) (*model.Hamster, error) {
|
func (db *DatabasePostgreSQL) GetHamsterByID(id, gameID, cageID string) (*model.Hamster, error) {
|
||||||
q := `
|
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
|
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 public.Hamster h
|
FROM hamster h
|
||||||
WHERE c.id = $1
|
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{
|
hamster := model.Hamster{
|
||||||
Mother: &model.Hamster{},
|
Mother: &model.Hamster{},
|
||||||
Father: &model.Hamster{},
|
Father: &model.Hamster{},
|
||||||
GestationFather: &model.Hamster{},
|
GestationFather: &model.Hamster{},
|
||||||
|
Cage: &model.Cage{},
|
||||||
}
|
}
|
||||||
err := row.Scan(&hamster.ID, &hamster.CreatedAt,
|
err := row.Scan(&hamster.ID, &hamster.CreatedAt,
|
||||||
&hamster.UpdatedAt, &hamster.Name,
|
&hamster.UpdatedAt, &hamster.Name,
|
||||||
@@ -65,7 +72,7 @@ func (db *DatabasePostgreSQL) GetHamsterById(id string) (*model.Hamster, error)
|
|||||||
&hamster.Height, &hamster.Alive,
|
&hamster.Height, &hamster.Alive,
|
||||||
&hamster.Sold, &hamster.Gestation,
|
&hamster.Sold, &hamster.Gestation,
|
||||||
&hamster.GestationPeriod, &hamster.GestationCooldown,
|
&hamster.GestationPeriod, &hamster.GestationCooldown,
|
||||||
&hamster.GestationFather.ID)
|
&hamster.GestationFather.ID, &hamster.Cage.ID)
|
||||||
|
|
||||||
if errPq, ok := err.(*pq.Error); ok {
|
if errPq, ok := err.(*pq.Error); ok {
|
||||||
return nil, handlePgError(errPq)
|
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 {
|
func (db *DatabasePostgreSQL) CreateHamster(hamster *model.Hamster) error {
|
||||||
q := `
|
q := `
|
||||||
INSERT INTO public.Hamster
|
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
|
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
|
RETURNING id, created_at
|
||||||
`
|
`
|
||||||
|
|
||||||
@@ -94,7 +101,7 @@ func (db *DatabasePostgreSQL) CreateHamster(hamster *model.Hamster) error {
|
|||||||
&hamster.Height, &hamster.Alive,
|
&hamster.Height, &hamster.Alive,
|
||||||
&hamster.Sold, &hamster.Gestation,
|
&hamster.Sold, &hamster.Gestation,
|
||||||
&hamster.GestationPeriod, &hamster.GestationCooldown,
|
&hamster.GestationPeriod, &hamster.GestationCooldown,
|
||||||
&hamster.GestationFather.ID).
|
&hamster.GestationFather.ID, &hamster.Cage.ID).
|
||||||
Scan(&hamster.ID, &hamster.CreatedAt)
|
Scan(&hamster.ID, &hamster.CreatedAt)
|
||||||
if errPq, ok := err.(*pq.Error); ok {
|
if errPq, ok := err.(*pq.Error); ok {
|
||||||
return handlePgError(errPq)
|
return handlePgError(errPq)
|
||||||
|
|||||||
@@ -60,7 +60,7 @@ func (db *DatabasePostgreSQL) CreateUser(user *model.User) error {
|
|||||||
`
|
`
|
||||||
|
|
||||||
err := db.session.
|
err := db.session.
|
||||||
QueryRow(q, user.Nickname, user.GoogleId).
|
QueryRow(q, user.Nickname, user.GoogleID).
|
||||||
Scan(&user.ID, &user.CreatedAt)
|
Scan(&user.ID, &user.CreatedAt)
|
||||||
if errPq, ok := err.(*pq.Error); ok {
|
if errPq, ok := err.(*pq.Error); ok {
|
||||||
return handlePgError(errPq)
|
return handlePgError(errPq)
|
||||||
@@ -94,7 +94,7 @@ func (db *DatabasePostgreSQL) GetUsersByGoogleID(id string) (*model.User, error)
|
|||||||
row := db.session.QueryRow(q, id)
|
row := db.session.QueryRow(q, id)
|
||||||
|
|
||||||
u := model.User{}
|
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 {
|
if errPq, ok := err.(*pq.Error); ok {
|
||||||
return nil, handlePgError(errPq)
|
return nil, handlePgError(errPq)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -51,6 +51,7 @@ type Hamster struct {
|
|||||||
Child []*Hamster `json:"childs"`
|
Child []*Hamster `json:"childs"`
|
||||||
CreatedAt time.Time `json:"createdAt"`
|
CreatedAt time.Time `json:"createdAt"`
|
||||||
UpdatedAt *time.Time `json:"updatedAt"`
|
UpdatedAt *time.Time `json:"updatedAt"`
|
||||||
|
Cage *Cage `json:"cage"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h *Hamster) Die() {
|
func (h *Hamster) Die() {
|
||||||
@@ -90,9 +91,8 @@ func (h *Hamster) Fuck(another *Hamster) (bool, error) {
|
|||||||
female, male := func() (*Hamster, *Hamster) {
|
female, male := func() (*Hamster, *Hamster) {
|
||||||
if h.Sexe == FEMALE {
|
if h.Sexe == FEMALE {
|
||||||
return h, another
|
return h, another
|
||||||
} else {
|
|
||||||
return another, h
|
|
||||||
}
|
}
|
||||||
|
return another, h
|
||||||
}()
|
}()
|
||||||
female.GestationFather = male
|
female.GestationFather = male
|
||||||
female.Gestation = true
|
female.Gestation = true
|
||||||
@@ -147,9 +147,8 @@ func randSexe() string {
|
|||||||
return func() string {
|
return func() string {
|
||||||
if randNumber(1, 2) == 2 {
|
if randNumber(1, 2) == 2 {
|
||||||
return MALE
|
return MALE
|
||||||
} else {
|
|
||||||
return FEMALE
|
|
||||||
}
|
}
|
||||||
|
return FEMALE
|
||||||
}()
|
}()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ type User struct {
|
|||||||
ID string `json:"id"`
|
ID string `json:"id"`
|
||||||
CreatedAt time.Time `json:"createdAt"`
|
CreatedAt time.Time `json:"createdAt"`
|
||||||
UpdatedAt *time.Time `json:"updatedAt"`
|
UpdatedAt *time.Time `json:"updatedAt"`
|
||||||
GoogleId string `json:"-"`
|
GoogleID string `json:"-"`
|
||||||
Games []Game
|
Games []Game
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ type UserData struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type UserDataEditable struct {
|
type UserDataEditable struct {
|
||||||
UserId string `json:'userId'`
|
UserID string `json:'userID'`
|
||||||
Type string `json:"type"`
|
Type string `json:"type"`
|
||||||
Name string `json:"name"`
|
Name string `json:"name"`
|
||||||
Content string `json:"content"`
|
Content string `json:"content"`
|
||||||
|
|||||||
Reference in New Issue
Block a user