From 7cea5a120afe2af8310cc46677f0849d87aeac2e Mon Sep 17 00:00:00 2001 From: Jonni Liljamo Date: Wed, 25 Jan 2023 13:12:31 +0200 Subject: [PATCH] feat(sdbapi): endpoint for patching game state --- sdbapi/apierror/apierror.go | 1 + sdbapi/handlers/patchgamestate.go | 56 +++++++++++++++++++++++++++++++ sdbapi/main.go | 2 +- 3 files changed, 58 insertions(+), 1 deletion(-) create mode 100644 sdbapi/handlers/patchgamestate.go diff --git a/sdbapi/apierror/apierror.go b/sdbapi/apierror/apierror.go index 6c97fe8..b28d8ee 100644 --- a/sdbapi/apierror/apierror.go +++ b/sdbapi/apierror/apierror.go @@ -23,4 +23,5 @@ const ( GameNotFound string = "game not found" GameCreationFailed string = "game creation failed" GetAllFormingFailed string = "something went wrong while fetching all forming games" + GameStatePatchFailed string = "failed to patch game state" ) diff --git a/sdbapi/handlers/patchgamestate.go b/sdbapi/handlers/patchgamestate.go new file mode 100644 index 0000000..65228a4 --- /dev/null +++ b/sdbapi/handlers/patchgamestate.go @@ -0,0 +1,56 @@ +/* + * This file is part of sdbapi + * Copyright (C) 2023 Jonni Liljamo + * + * Licensed under GPL-3.0-only. + * See LICENSE for licensing information. + */ + +package handlers + +import ( + "api/apierror" + "api/db" + "api/models" + "net/http" + + "github.com/gin-gonic/gin" +) + +func PatchGameState(c *gin.Context) { + id := c.Param("id") + + // Check if the game exists + var game models.Game + record := db.DbConn.Where("id = ?", id).First(&game) + if record.Error != nil { + c.JSON(http.StatusNotFound, gin.H{"error": apierror.GameNotFound}) + c.Abort() + return + } + + // Get the user who requested the patching, and verify that they are the game creator (p1) + p1, _ := db.GetUserByEmail(c.GetString("email")) + if game.P1 != p1.ID { + c.JSON(http.StatusUnauthorized, gin.H{"error": apierror.NotAuthorized}) + c.Abort() + return + } + + var patchedGame models.Game + if err := c.ShouldBindJSON(&patchedGame); err != nil { + c.JSON(http.StatusBadRequest, gin.H{"error": apierror.InvalidInput}) + c.Abort() + return + } + + updatedRecord := db.DbConn.Model(&game).Update("state", patchedGame.State) + if updatedRecord.Error != nil { + c.JSON(http.StatusInternalServerError, gin.H{"error": apierror.GameStatePatchFailed}) + c.Abort() + return + } + + // Don't have anything to return + c.JSON(http.StatusNoContent, nil) +} diff --git a/sdbapi/main.go b/sdbapi/main.go index 14bc639..263f6b0 100644 --- a/sdbapi/main.go +++ b/sdbapi/main.go @@ -50,7 +50,7 @@ func createRouter() *gin.Engine { game.GET("/:id", handlers.GameInfo) game.GET("/all_forming", handlers.FormingGames) game.POST("/create", handlers.CreateGame) - //game.PATCH("/:id/state", handlers.PatchGameState) + game.PATCH("/:id/state", handlers.PatchGameState) //game.GET("/for_user/:id", handlers.UsersGames) } } -- 2.44.1