Feat: end turn endpoint
This commit is contained in:
		| @@ -1,6 +1,7 @@ | ||||
| {{define "room"}} | ||||
| <div id="hello-user"> | ||||
|   <p>Hello {{.State.Username}};</p> | ||||
|   <p>Turn of the {{.Room.TeamTurn}} team</p> | ||||
|   <p> | ||||
|     {{if eq .State.Team ""}} | ||||
|     join the team! | ||||
| @@ -26,4 +27,7 @@ | ||||
| <div id="cardtable"> | ||||
|   {{template "cardtable" .Room}} | ||||
| </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}} | ||||
|   | ||||
| @@ -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 | ||||
|   | ||||
| @@ -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 | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -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) | ||||
| } | ||||
|   | ||||
							
								
								
									
										1
									
								
								main.go
									
									
									
									
									
								
							
							
						
						
									
										1
									
								
								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) | ||||
|   | ||||
| @@ -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 | ||||
|   | ||||
| @@ -84,6 +84,7 @@ func MakeTestState() *FullInfo { | ||||
| 		Cards:       cards, | ||||
| 		RedTeam:     redTeam, | ||||
| 		BlueTeam:    blueTeam, | ||||
| 		TeamTurn:    "blue", | ||||
| 	} | ||||
| 	us := &UserState{ | ||||
| 		Username: "test-name", | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Grail Finder
					Grail Finder