From 2a593739aebc9c88bac8cbcc9c1d55eed22c742b Mon Sep 17 00:00:00 2001 From: Grail Finder Date: Thu, 3 Jul 2025 11:00:33 +0300 Subject: [PATCH] Enha: nullable roomID for player [WIP] --- handlers/actions.go | 12 ++++++++++-- handlers/game.go | 6 +++--- models/main.go | 14 +++++++------- repos/players.go | 2 +- 4 files changed, 21 insertions(+), 13 deletions(-) diff --git a/handlers/actions.go b/handlers/actions.go index edea372..a2668c0 100644 --- a/handlers/actions.go +++ b/handlers/actions.go @@ -135,14 +135,22 @@ func getFullInfoByCtx(ctx context.Context) (*models.FullInfo, error) { return nil, err } resp.State = state - if state.RoomID == "" { + if state.RoomID == nil { return resp, nil } // room, err := getRoomByID(state.RoomID) - room, err := repo.RoomGetByID(ctx, state.RoomID) + room, err := repo.RoomGetByID(ctx, *state.RoomID) if err != nil { + // room was deleted; remove it from player; log.Warn("failed to find room despite knowing room_id;", "room_id", state.RoomID) + state.Team = models.UserTeamNone + state.Role = models.UserRoleNone + if err := repo.PlayerExitRoom(ctx, state.Username); err != nil { + log.Warn("failed to exit room", + "room_id", state.RoomID, "username", state.Username) + return resp, err + } return nil, err } resp.Room = room diff --git a/handlers/game.go b/handlers/game.go index 04a2c84..7da1e16 100644 --- a/handlers/game.go +++ b/handlers/game.go @@ -1,7 +1,6 @@ package handlers import ( - "context" "errors" "fmt" "gralias/models" @@ -32,8 +31,7 @@ func HandleCreateRoom(w http.ResponseWriter, r *http.Request) { abortWithError(w, msg) return } - ctx := context.WithValue(r.Context(), "current_room", room.ID) - fi, err := getFullInfoByCtx(ctx) + fi, err := getFullInfoByCtx(r.Context()) if err != nil { msg := "failed to get full info from ctx" log.Error(msg, "error", err) @@ -43,10 +41,12 @@ func HandleCreateRoom(w http.ResponseWriter, r *http.Request) { fi.State.RoomID = room.ID fi.Room = room if err := repo.RoomCreate(r.Context(), room); err != nil { + log.Error("failed to create a room", "error", err) abortWithError(w, err.Error()) return } if err := repo.PlayerSetRoomID(r.Context(), fi.State.Username, room.ID); err != nil { + log.Error("failed to set room id", "error", err) abortWithError(w, err.Error()) return } diff --git a/models/main.go b/models/main.go index 672f3db..ee335f4 100644 --- a/models/main.go +++ b/models/main.go @@ -104,7 +104,7 @@ type Action struct { type Player struct { ID uint32 `json:"id" db:"id"` - RoomID string `json:"room_id" db:"room_id"` + RoomID *string `json:"room_id" db:"room_id"` Username string `json:"username" db:"username"` Team UserTeam `json:"team" db:"team"` Role UserRole `json:"role" db:"role"` @@ -386,12 +386,12 @@ type WordCard struct { // table: settings type GameSettings struct { - ID uint32 `json:"id" db:"id"` - RoomID string `db:"room_id"` - Language string `json:"language" example:"en" form:"language" db:"language"` - RoomPass string `json:"room_pass" db:"room_pass"` - TurnSecondsLeft uint32 `db:"-"` - RoundTime uint32 `json:"round_time" db:"turn_time"` + ID uint32 `json:"id" db:"id"` + RoomID string `db:"room_id"` + Language string `json:"language" example:"en" form:"language" db:"language"` + RoomPass string `json:"room_pass" db:"room_pass"` + TurnSecondsLeft uint32 `db:"-"` + RoundTime uint32 `json:"round_time" db:"turn_time"` CreatedAt time.Time `db:"created_at"` } diff --git a/repos/players.go b/repos/players.go index a4fb7ce..c8e6581 100644 --- a/repos/players.go +++ b/repos/players.go @@ -64,7 +64,7 @@ func (p *RepoProvider) PlayerSetRoomID(ctx context.Context, username, roomID str func (p *RepoProvider) PlayerExitRoom(ctx context.Context, username string) error { db := getDB(ctx, p.DB) - _, err := db.ExecContext(ctx, "UPDATE players SET room_id = null WHERE username = ?", username) + _, err := db.ExecContext(ctx, "UPDATE players SET room_id='', team='', role='' WHERE username = ?", username) return err }