From dcf76bb7736171be6c166a3459d05751dc2996ae Mon Sep 17 00:00:00 2001 From: Ryan Hamamura <58859899+ryanhamamura@users.noreply.github.com> Date: Mon, 2 Mar 2026 22:40:10 -1000 Subject: [PATCH] refactor: replace session key strings with consts Define KeyPlayerID, KeyUserID, and KeyNickname in the sessions package and use them across all handlers to avoid duplicated magic strings. --- features/auth/handlers.go | 9 +++++---- features/c4game/handlers.go | 2 +- features/lobby/handlers.go | 7 ++++--- features/snakegame/handlers.go | 2 +- sessions/sessions.go | 17 ++++++++++++----- 5 files changed, 23 insertions(+), 14 deletions(-) diff --git a/features/auth/handlers.go b/features/auth/handlers.go index 8c7c8fb..3ca7f6b 100644 --- a/features/auth/handlers.go +++ b/features/auth/handlers.go @@ -11,6 +11,7 @@ import ( "github.com/ryanhamamura/games/auth" "github.com/ryanhamamura/games/db/repository" "github.com/ryanhamamura/games/features/auth/pages" + appsessions "github.com/ryanhamamura/games/sessions" ) type LoginSignals struct { @@ -65,9 +66,9 @@ func HandleLogin(queries *repository.Queries, sessions *scs.SessionManager) http } sessions.RenewToken(r.Context()) //nolint:errcheck - sessions.Put(r.Context(), "user_id", user.ID) + sessions.Put(r.Context(), appsessions.KeyUserID, user.ID) sessions.Put(r.Context(), "username", user.Username) - sessions.Put(r.Context(), "nickname", user.Username) + sessions.Put(r.Context(), appsessions.KeyNickname, user.Username) redirectURL := "/" if returnURL := sessions.GetString(r.Context(), "return_url"); returnURL != "" { @@ -119,9 +120,9 @@ func HandleRegister(queries *repository.Queries, sessions *scs.SessionManager) h } sessions.RenewToken(r.Context()) //nolint:errcheck - sessions.Put(r.Context(), "user_id", user.ID) + sessions.Put(r.Context(), appsessions.KeyUserID, user.ID) sessions.Put(r.Context(), "username", user.Username) - sessions.Put(r.Context(), "nickname", user.Username) + sessions.Put(r.Context(), appsessions.KeyNickname, user.Username) redirectURL := "/" if returnURL := sessions.GetString(r.Context(), "return_url"); returnURL != "" { diff --git a/features/c4game/handlers.go b/features/c4game/handlers.go index 68cead1..c5a5bc0 100644 --- a/features/c4game/handlers.go +++ b/features/c4game/handlers.go @@ -266,7 +266,7 @@ func HandleSetNickname(store *connect4.Store, sm *scs.SessionManager) http.Handl return } - sm.Put(r.Context(), "nickname", signals.Nickname) + sm.Put(r.Context(), sessions.KeyNickname, signals.Nickname) playerID := sessions.GetPlayerID(sm, r) userID := sessions.GetUserID(sm, r) diff --git a/features/lobby/handlers.go b/features/lobby/handlers.go index 5698447..074b0aa 100644 --- a/features/lobby/handlers.go +++ b/features/lobby/handlers.go @@ -11,6 +11,7 @@ import ( "github.com/ryanhamamura/games/db/repository" lobbycomponents "github.com/ryanhamamura/games/features/lobby/components" "github.com/ryanhamamura/games/features/lobby/pages" + appsessions "github.com/ryanhamamura/games/sessions" "github.com/ryanhamamura/games/snake" "github.com/alexedwards/scs/v2" @@ -21,7 +22,7 @@ import ( // HandleLobbyPage renders the main lobby page with active games for logged-in users. func HandleLobbyPage(queries *repository.Queries, sessions *scs.SessionManager, snakeStore *snake.SnakeStore) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { - userID := sessions.GetString(r.Context(), "user_id") + userID := sessions.GetString(r.Context(), appsessions.KeyUserID) username := sessions.GetString(r.Context(), "username") isLoggedIn := userID != "" @@ -95,7 +96,7 @@ func HandleCreateGame(store *connect4.Store, sessions *scs.SessionManager) http. return } - sessions.Put(r.Context(), "nickname", signals.Nickname) + sessions.Put(r.Context(), appsessions.KeyNickname, signals.Nickname) gi := store.Create() sse := datastar.NewSSE(w, r) @@ -137,7 +138,7 @@ func HandleCreateSnakeGame(snakeStore *snake.SnakeStore, sessions *scs.SessionMa return } - sessions.Put(r.Context(), "nickname", signals.Nickname) + sessions.Put(r.Context(), appsessions.KeyNickname, signals.Nickname) mode := snake.ModeMultiplayer if r.URL.Query().Get("mode") == "solo" { diff --git a/features/snakegame/handlers.go b/features/snakegame/handlers.go index 9620377..dffb6a0 100644 --- a/features/snakegame/handlers.go +++ b/features/snakegame/handlers.go @@ -277,7 +277,7 @@ func HandleSetNickname(snakeStore *snake.SnakeStore, sm *scs.SessionManager) htt return } - sm.Put(r.Context(), "nickname", signals.Nickname) + sm.Put(r.Context(), sessions.KeyNickname, signals.Nickname) playerID := sessions.GetPlayerID(sm, r) userID := sessions.GetUserID(sm, r) diff --git a/sessions/sessions.go b/sessions/sessions.go index 02ebae2..3880d47 100644 --- a/sessions/sessions.go +++ b/sessions/sessions.go @@ -14,6 +14,13 @@ import ( "github.com/alexedwards/scs/v2" ) +// Session key names. +const ( + KeyPlayerID = "player_id" + KeyUserID = "user_id" + KeyNickname = "nickname" +) + // SetupSessionManager creates a configured session manager backed by SQLite. // Returns the manager and a cleanup function the caller should defer. func SetupSessionManager(db *sql.DB) (*scs.SessionManager, func()) { @@ -38,12 +45,12 @@ func SetupSessionManager(db *sql.DB) (*scs.SessionManager, func()) { // Authenticated users get their user UUID; guests get a random ID that // is generated and persisted on first access. func GetPlayerID(sm *scs.SessionManager, r *http.Request) player.ID { - pid := sm.GetString(r.Context(), "player_id") + pid := sm.GetString(r.Context(), KeyPlayerID) if pid == "" { pid = player.GenerateID(8) - sm.Put(r.Context(), "player_id", pid) + sm.Put(r.Context(), KeyPlayerID, pid) } - if userID := sm.GetString(r.Context(), "user_id"); userID != "" { + if userID := sm.GetString(r.Context(), KeyUserID); userID != "" { return player.ID(userID) } return player.ID(pid) @@ -51,10 +58,10 @@ func GetPlayerID(sm *scs.SessionManager, r *http.Request) player.ID { // GetUserID returns the authenticated user's UUID, or empty string for guests. func GetUserID(sm *scs.SessionManager, r *http.Request) string { - return sm.GetString(r.Context(), "user_id") + return sm.GetString(r.Context(), KeyUserID) } // GetNickname returns the player's display name from the session. func GetNickname(sm *scs.SessionManager, r *http.Request) string { - return sm.GetString(r.Context(), "nickname") + return sm.GetString(r.Context(), KeyNickname) }