Feat: end turn endpoint
This commit is contained in:
@ -1,6 +1,7 @@
|
|||||||
{{define "room"}}
|
{{define "room"}}
|
||||||
<div id="hello-user">
|
<div id="hello-user">
|
||||||
<p>Hello {{.State.Username}};</p>
|
<p>Hello {{.State.Username}};</p>
|
||||||
|
<p>Turn of the {{.Room.TeamTurn}} team</p>
|
||||||
<p>
|
<p>
|
||||||
{{if eq .State.Team ""}}
|
{{if eq .State.Team ""}}
|
||||||
join the team!
|
join the team!
|
||||||
@ -26,4 +27,7 @@
|
|||||||
<div id="cardtable">
|
<div id="cardtable">
|
||||||
{{template "cardtable" .Room}}
|
{{template "cardtable" .Room}}
|
||||||
</div>
|
</div>
|
||||||
|
<div>
|
||||||
|
<button hx-get="/end-turn" hx-target="#room" class="bg-amber-100 text-black px-4 py-2 rounded">End Turn</button>
|
||||||
|
</div>
|
||||||
{{end}}
|
{{end}}
|
||||||
|
@ -70,9 +70,9 @@ func saveStateByCtx(ctx context.Context, state *models.UserState) error {
|
|||||||
return saveState(username, state)
|
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
|
// 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
|
return err
|
||||||
}
|
}
|
||||||
if err := saveRoom(fi.Room); err != nil {
|
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)
|
err := errors.New("uknown role:" + role)
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
if err := saveFullInfoByUsername(fi.State.Username, fi); err != nil {
|
if err := saveFullInfo(fi); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
return fi, nil
|
return fi, nil
|
||||||
|
@ -76,7 +76,7 @@ func HandleFrontLogin(w http.ResponseWriter, r *http.Request) {
|
|||||||
state.State.Username = cleanName
|
state.State.Username = cleanName
|
||||||
// save state to cache
|
// save state to cache
|
||||||
// if err := saveState(cleanName, state.State); err != nil {
|
// 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)
|
log.Error("failed to save state", "error", err)
|
||||||
abortWithError(w, err.Error())
|
abortWithError(w, err.Error())
|
||||||
return
|
return
|
||||||
@ -144,8 +144,8 @@ func cacheSetSession(key string, session *models.Session) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
memcache.Set(key, sesb)
|
memcache.Set(key, sesb)
|
||||||
// expire in 10 min
|
// TODO: to config
|
||||||
memcache.Expire(key, 10*60)
|
memcache.Expire(key, 60*60)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2,6 +2,7 @@ package handlers
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
"errors"
|
||||||
"golias/models"
|
"golias/models"
|
||||||
"html/template"
|
"html/template"
|
||||||
"net/http"
|
"net/http"
|
||||||
@ -125,3 +126,30 @@ func HandleJoinTeam(w http.ResponseWriter, r *http.Request) {
|
|||||||
}
|
}
|
||||||
tmpl.ExecuteTemplate(w, "base", fi)
|
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)
|
||||||
|
}
|
||||||
|
1
main.go
1
main.go
@ -24,6 +24,7 @@ func ListenToRequests(port string) error {
|
|||||||
mux.HandleFunc("POST /login", handlers.HandleFrontLogin)
|
mux.HandleFunc("POST /login", handlers.HandleFrontLogin)
|
||||||
mux.HandleFunc("GET /room", handlers.HandleRoomEnter)
|
mux.HandleFunc("GET /room", handlers.HandleRoomEnter)
|
||||||
mux.HandleFunc("POST /join-team", handlers.HandleJoinTeam)
|
mux.HandleFunc("POST /join-team", handlers.HandleJoinTeam)
|
||||||
|
mux.HandleFunc("GET /end-turn", handlers.HandleEndTurn)
|
||||||
//elements
|
//elements
|
||||||
mux.HandleFunc("GET /room/createform", handlers.HandleShowCreateForm)
|
mux.HandleFunc("GET /room/createform", handlers.HandleShowCreateForm)
|
||||||
mux.HandleFunc("GET /room/hideform", handlers.HandleHideCreateForm)
|
mux.HandleFunc("GET /room/hideform", handlers.HandleHideCreateForm)
|
||||||
|
@ -59,6 +59,17 @@ type Room struct {
|
|||||||
RedTurn bool // false is blue turn
|
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 {
|
type WordCard struct {
|
||||||
Word string
|
Word string
|
||||||
Color WordColor
|
Color WordColor
|
||||||
|
@ -84,6 +84,7 @@ func MakeTestState() *FullInfo {
|
|||||||
Cards: cards,
|
Cards: cards,
|
||||||
RedTeam: redTeam,
|
RedTeam: redTeam,
|
||||||
BlueTeam: blueTeam,
|
BlueTeam: blueTeam,
|
||||||
|
TeamTurn: "blue",
|
||||||
}
|
}
|
||||||
us := &UserState{
|
us := &UserState{
|
||||||
Username: "test-name",
|
Username: "test-name",
|
||||||
|
Reference in New Issue
Block a user