From 8baf03595eade2d67ceea60440a8926df555ffef Mon Sep 17 00:00:00 2001 From: Grail Finder Date: Thu, 8 May 2025 20:04:09 +0300 Subject: [PATCH] Feat: end turn endpoint --- components/room.html | 4 ++++ handlers/actions.go | 6 +++--- handlers/auth.go | 6 +++--- handlers/game.go | 28 ++++++++++++++++++++++++++++ main.go | 1 + models/main.go | 11 +++++++++++ models/state.go | 1 + 7 files changed, 51 insertions(+), 6 deletions(-) diff --git a/components/room.html b/components/room.html index 93ef6df..696e429 100644 --- a/components/room.html +++ b/components/room.html @@ -1,6 +1,7 @@ {{define "room"}}

Hello {{.State.Username}};

+

Turn of the {{.Room.TeamTurn}} team

{{if eq .State.Team ""}} join the team! @@ -26,4 +27,7 @@

{{template "cardtable" .Room}}
+
+ +
{{end}} diff --git a/handlers/actions.go b/handlers/actions.go index 9816a9a..4f51860 100644 --- a/handlers/actions.go +++ b/handlers/actions.go @@ -70,9 +70,9 @@ func saveStateByCtx(ctx context.Context, state *models.UserState) error { return saveState(username, state) } -func saveFullInfoByUsername(username string, fi *models.FullInfo) error { +func saveFullInfo(fi *models.FullInfo) error { // INFO: unfortunately working no transactions; so case are possible where first object is updated but the second is not - if err := saveState(username, fi.State); err != nil { + if err := saveState(fi.State.Username, fi.State); err != nil { return err } if err := saveRoom(fi.Room); err != nil { @@ -194,7 +194,7 @@ func joinTeam(ctx context.Context, role, team string) (*models.FullInfo, error) err := errors.New("uknown role:" + role) return nil, err } - if err := saveFullInfoByUsername(fi.State.Username, fi); err != nil { + if err := saveFullInfo(fi); err != nil { return nil, err } return fi, nil diff --git a/handlers/auth.go b/handlers/auth.go index 5800db1..f12864c 100644 --- a/handlers/auth.go +++ b/handlers/auth.go @@ -76,7 +76,7 @@ func HandleFrontLogin(w http.ResponseWriter, r *http.Request) { state.State.Username = cleanName // save state to cache // if err := saveState(cleanName, state.State); err != nil { - if err := saveFullInfoByUsername(cleanName, state); err != nil { + if err := saveFullInfo(state); err != nil { log.Error("failed to save state", "error", err) abortWithError(w, err.Error()) return @@ -144,8 +144,8 @@ func cacheSetSession(key string, session *models.Session) error { return err } memcache.Set(key, sesb) - // expire in 10 min - memcache.Expire(key, 10*60) + // TODO: to config + memcache.Expire(key, 60*60) return nil } diff --git a/handlers/game.go b/handlers/game.go index 0684823..9f5f8c0 100644 --- a/handlers/game.go +++ b/handlers/game.go @@ -2,6 +2,7 @@ package handlers import ( "context" + "errors" "golias/models" "html/template" "net/http" @@ -125,3 +126,30 @@ func HandleJoinTeam(w http.ResponseWriter, r *http.Request) { } tmpl.ExecuteTemplate(w, "base", fi) } + +func HandleEndTurn(w http.ResponseWriter, r *http.Request) { + // get username + fi, err := getFullInfoByCtx(r.Context()) + if err != nil { + abortWithError(w, err.Error()) + return + } + // check if one who pressed it is from the team who has the turn + if fi.Room.TeamTurn != string(fi.State.Team) { + err = errors.New("unexpected team turn:" + fi.Room.TeamTurn) + abortWithError(w, err.Error()) + return + } + fi.Room.ChangeTurn() + if err := saveFullInfo(fi); err != nil { + abortWithError(w, err.Error()) + return + } + // return html + tmpl, err := template.ParseGlob("components/*.html") + if err != nil { + abortWithError(w, err.Error()) + return + } + tmpl.ExecuteTemplate(w, "base", fi) +} diff --git a/main.go b/main.go index bc0cd51..431f52c 100644 --- a/main.go +++ b/main.go @@ -24,6 +24,7 @@ func ListenToRequests(port string) error { mux.HandleFunc("POST /login", handlers.HandleFrontLogin) mux.HandleFunc("GET /room", handlers.HandleRoomEnter) mux.HandleFunc("POST /join-team", handlers.HandleJoinTeam) + mux.HandleFunc("GET /end-turn", handlers.HandleEndTurn) //elements mux.HandleFunc("GET /room/createform", handlers.HandleShowCreateForm) mux.HandleFunc("GET /room/hideform", handlers.HandleHideCreateForm) diff --git a/models/main.go b/models/main.go index bfb118c..8185330 100644 --- a/models/main.go +++ b/models/main.go @@ -59,6 +59,17 @@ type Room struct { RedTurn bool // false is blue turn } +func (r *Room) ChangeTurn() { + switch r.TeamTurn { + case "blue": + r.TeamTurn = "red" + case "red": + r.TeamTurn = "blue" + default: + r.TeamTurn = "blue" + } +} + type WordCard struct { Word string Color WordColor diff --git a/models/state.go b/models/state.go index 8b63450..f455675 100644 --- a/models/state.go +++ b/models/state.go @@ -84,6 +84,7 @@ func MakeTestState() *FullInfo { Cards: cards, RedTeam: redTeam, BlueTeam: blueTeam, + TeamTurn: "blue", } us := &UserState{ Username: "test-name",