diff options
| author | tyropro <[email protected]> | 2026-04-30 13:00:32 +0100 |
|---|---|---|
| committer | tyropro <[email protected]> | 2026-04-30 13:00:58 +0100 |
| commit | 27a2cefe6d8a50814a0548ec939e780590c3feed (patch) | |
| tree | cb782c7ae549fe705f9a1535f4a71eb457cd28f3 | |
| parent | 9ed564c24c3fda3d917979535aab2ea6ca67fab1 (diff) | |
feature: added state loading from file
| -rw-r--r-- | main.go | 41 | ||||
| -rw-r--r-- | state.go | 93 | ||||
| -rw-r--r-- | status/status.go | 3 |
3 files changed, 98 insertions, 39 deletions
@@ -1,11 +1,7 @@ package main import ( - "cluedo-backend/status" - "encoding/json" - "net/http" "os" - "path/filepath" "github.com/gin-gonic/gin" @@ -47,7 +43,8 @@ func setupRouter(lobby_manager *LobbyManager, ws_manager *WsManager) *gin.Engine router := gin.Default() // server endpoints - router.POST("/state/save", save_state(lobby_manager)) + router.POST("/state/save", save_state_endpoint(lobby_manager)) + router.POST("/state/load", load_state_endpoint(lobby_manager)) // lobby endpoints router.GET("/lobbies", get_lobbies(lobby_manager)) @@ -84,37 +81,3 @@ func NewErrResp(msg string) errResp { Msg: msg, } } - -func save_state(lobby_manager *LobbyManager) gin.HandlerFunc { - return func(c *gin.Context) { - // TODO: Specify these error response to more accurately pinpoint the error - - lobby_manager.mu.Lock() - defer lobby_manager.mu.Unlock() - - // marshall state to json - state_json, err := json.Marshal(lobby_manager) - if err != nil { - c.IndentedJSON(status.GenerateErrorResponse(status.SaveFailed)) - return - } - - // get the current working directory - dir, err := os.Getwd() - if err != nil { - c.IndentedJSON(status.GenerateErrorResponse(status.SaveFailed)) - return - } - - state_file_path := filepath.Join(dir, "state.json") - - // write state to file - err = os.WriteFile(state_file_path, state_json, 0644) - if err != nil { - c.IndentedJSON(status.GenerateErrorResponse(status.SaveFailed)) - return - } - - c.Status(http.StatusOK) - } -} diff --git a/state.go b/state.go new file mode 100644 index 0000000..f4ba8e4 --- /dev/null +++ b/state.go @@ -0,0 +1,93 @@ +package main + +import ( + "cluedo-backend/status" + "encoding/json" + "net/http" + "os" + "path/filepath" + + "github.com/gin-gonic/gin" +) + +func save_state_endpoint(lobby_manager *LobbyManager) gin.HandlerFunc { + return func(c *gin.Context) { + // TODO: Specify these error response to more accurately pinpoint the error + + lobby_manager.mu.Lock() + defer lobby_manager.mu.Unlock() + + // marshall state to json + state_json, err := json.Marshal(lobby_manager) + if err != nil { + c.IndentedJSON(status.GenerateErrorResponse(status.SaveFailed)) + return + } + + // get the current working directory + dir, err := os.Getwd() + if err != nil { + c.IndentedJSON(status.GenerateErrorResponse(status.SaveFailed)) + return + } + + state_file_path := filepath.Join(dir, "state.json") + + // write state to file + err = os.WriteFile(state_file_path, state_json, 0644) + if err != nil { + c.IndentedJSON(status.GenerateErrorResponse(status.SaveFailed)) + return + } + + c.Status(http.StatusOK) + } +} + +func load_state_endpoint(lobby_manager *LobbyManager) gin.HandlerFunc { + return func(c *gin.Context) { + lobby_manager.mu.Lock() + defer lobby_manager.mu.Unlock() + + lobby_state, err := load_state_from_file() + if err != nil { + c.IndentedJSON(status.GenerateErrorResponse(status.LoadFailed)) + } + + lobby_manager.Lobbies = lobby_state + + c.Status(http.StatusOK) + } +} + +func load_state_from_file() (map[string]Lobby, error) { + state_file_path, err := get_state_file_path() + if err != nil { + return make(map[string]Lobby), err + } + + file_contents, err := os.ReadFile(state_file_path) + if err != nil { + return make(map[string]Lobby), err + } + + var temp_lobby_manager LobbyManager + + err = json.Unmarshal(file_contents, &temp_lobby_manager) + + lobby_state := temp_lobby_manager.Lobbies + + return lobby_state, nil +} + +func get_state_file_path() (string, error) { + // get the current working directory + dir, err := os.Getwd() + if err != nil { + return "", err + } + + state_file_path := filepath.Join(dir, "state.json") + + return state_file_path, nil +} diff --git a/status/status.go b/status/status.go index 2acda38..b15ff53 100644 --- a/status/status.go +++ b/status/status.go @@ -23,6 +23,7 @@ const ( LobbyTooSmall ErrorStatus = "lobby_too_small" SaveFailed ErrorStatus = "save_failed" + LoadFailed ErrorStatus = "load_failed" ) type ErrorResponse struct { @@ -69,6 +70,8 @@ func getHttpStatusCode(error_status ErrorStatus) int { case SaveFailed: status_code = http.StatusInternalServerError + case LoadFailed: + status_code = http.StatusInternalServerError } return status_code |
