diff --git a/cmd/server/games.go b/cmd/server/games.go index 1e208c4..b1b9f68 100644 --- a/cmd/server/games.go +++ b/cmd/server/games.go @@ -97,20 +97,19 @@ func (s PlayerState) Points() int { return points } -func (games Games) GameByName(ctx context.Context, uid, name string) (string, error) { +func (games Games) GameByName(ctx context.Context, name string) (string, error) { var result string err := games.db.Query(ctx, func(rows *sql.Rows) error { return rows.Scan(&result) }, ` SELECT - players.game_uuid + games.uuid FROM - players - JOIN games ON players.game_uuid=games.uuid - WHERE players.user_uuid=? AND games.name=? + games + WHERE games.name=? ORDER BY games.updated DESC LIMIT 1 - `, uid, name) + `, name) return result, err } diff --git a/cmd/server/games_test.go b/cmd/server/games_test.go index 95407e5..8ae7379 100644 --- a/cmd/server/games_test.go +++ b/cmd/server/games_test.go @@ -31,7 +31,7 @@ func TestGames(t *testing.T) { t.Error(v) } - if v, err := games.GameByName(ctx, "", ""); err != nil { + if v, err := games.GameByName(ctx, ""); err != nil { t.Error("err getting game by empty name for empty user:", err) } else if len(v) > 0 { t.Error(v) @@ -112,7 +112,7 @@ func TestGames(t *testing.T) { t.Error("wrong game found for user:", v) } - if v, err := games.GameByName(ctx, "p1", "g1"); err != nil { + if v, err := games.GameByName(ctx, "g1"); err != nil { t.Error("err getting game by name for user:", err) } else if v != id { t.Error("wrong game by name for user:", v) diff --git a/cmd/server/v1.go b/cmd/server/v1.go index 30f55c2..6d17e54 100644 --- a/cmd/server/v1.go +++ b/cmd/server/v1.go @@ -1,9 +1,12 @@ package main import ( + "bytes" "fmt" + "io" "net/http" "path" + "slices" "strings" ) @@ -13,6 +16,8 @@ func isV1(r *http.Request) bool { func (s *S) serveV1(w http.ResponseWriter, r *http.Request) error { switch path.Join(r.Method, r.URL.Path) { + case "GET/v1/state/" + s.Session(r.Context()).ID: + return fmt.Errorf("not impl") case "PUT/v1/state/" + s.Session(r.Context()).ID + "/party": return s.serveV1PutParty(w, r) default: @@ -22,5 +27,27 @@ func (s *S) serveV1(w http.ResponseWriter, r *http.Request) error { } func (s *S) serveV1PutParty(w http.ResponseWriter, r *http.Request) error { - return fmt.Errorf("not impl") + party, err := io.ReadAll(r.Body) + if err != nil { + return err + } + party = bytes.TrimSpace(party) + if len(party) == 0 { + return nil + } + + gid, err := s.games.GameByName(r.Context(), string(party)) + if err != nil { + return err + } + + games, err := s.games.GamesForUser(r.Context(), gid) + if err != nil { + return err + } + + if slices.Contains(games, gid) { + return nil + } + return fmt.Errorf("not impl create player join") }