Skip to content

Commit

Permalink
feat: support editing game
Browse files Browse the repository at this point in the history
  • Loading branch information
Tarow committed Dec 27, 2023
1 parent 050dd38 commit b2c01a8
Show file tree
Hide file tree
Showing 16 changed files with 477 additions and 3,251 deletions.
89 changes: 70 additions & 19 deletions internal/api/handler.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,16 @@ import (
"context"
"fmt"
"net/http"
"slices"
"strconv"
"time"

"github.com/a-h/templ"
"github.com/labstack/echo/v4"
"github.com/labstack/gommon/log"
"github.com/tarow/skat-counter/internal/skat"
"github.com/tarow/skat-counter/internal/skat/gen/model"
template "github.com/tarow/skat-counter/templates"
"github.com/tarow/skat-counter/templates/components"
)

type Handler struct {
Expand Down Expand Up @@ -49,35 +50,34 @@ func (h Handler) GetGameDetails(c echo.Context) error {
c.Logger().Error(err)
return err
}
fmt.Printf("%+v", game)

gameDetails := template.GameDetails(*game)

return render(c, http.StatusOK, gameDetails)
}

func (h Handler) CreateGame(c echo.Context) error {
createGameForm := struct {
form := struct {
Players []string `form:"player"`
Online bool `form:"online"`
Stake float32 `form:"stake"`
}{}

err := c.Bind(&createGameForm)
err := c.Bind(&form)
if err != nil {
c.Logger().Error(err)
return err
}

players := []model.Player{}
for _, p := range createGameForm.Players {
for _, p := range form.Players {
players = append(players, model.Player{Name: p})
}
g := skat.Game{}
g.Players = players

g.Online = true
g.Stake = 1.5
g.Online = form.Online
g.Stake = form.Stake
g.CreatedAt = time.Now()

g, err = h.service.Create(g)
Expand All @@ -87,42 +87,85 @@ func (h Handler) CreateGame(c echo.Context) error {

details := template.GameDetails(g)

c.Response().Header().Set("Access-Control-Expose-Headers", "*")
c.Response().Header().Set("HX-Push-Url", fmt.Sprintf("/games/%v", g.ID))

return render(c, http.StatusCreated, details)
}

func (h Handler) DeleteGame(c echo.Context) error {
gameId := c.Param("id")
func (h Handler) GetEditGameForm(c echo.Context) error {
game, err := h.findGame(c.Param("id"))
if err != nil {
c.Logger().Error(err)
return err
}

parsedId, err := strconv.Atoi(gameId)
form := components.EditGameForm(*game)
return render(c, http.StatusOK, form)
}

func (h Handler) EditGame(c echo.Context) error {
game, err := h.findGame(c.Param("id"))
if err != nil {
return err
}

err = h.service.Delete(int32(parsedId))
form := struct {
Players []string `form:"player"`
Online bool `form:"online"`
Stake float32 `form:"stake"`
}{}
c.Bind(&form)

game.Online = form.Online
game.Stake = form.Stake

slices.SortFunc(game.Players, func(i, j model.Player) int {
return slices.Index(form.Players, i.Name) - slices.Index(form.Players, j.Name)
})

updatedGame, err := h.service.Edit(*game)
if err != nil {
c.Logger().Error(err)
return err
}

return nil
details := template.GameDetails(updatedGame)

return render(c, http.StatusOK, details)
}

func (h Handler) AddRound(c echo.Context) error {
gameId := c.Param("id")
parsedId, err := strconv.Atoi(gameId)
func (h Handler) GetCreateGameForm(c echo.Context) error {
form := components.CreateGameForm()
return render(c, http.StatusOK, form)
}

func (h Handler) DeleteGame(c echo.Context) error {
parsedId, err := strconv.Atoi(c.Param("id"))
if err != nil {
return err
}

err = h.service.Delete(int32(parsedId))
if err != nil {
c.Logger().Error(err)
return err
}

game, err := h.service.Find(int32(parsedId))
games, err := h.service.List()
if err != nil {
c.Logger().Error(err)
return err
}
index := template.GameOverview(games)
c.Response().Header().Set("HX-Push-Url", "/")

return render(c, http.StatusOK, index)
}

func (h Handler) AddRound(c echo.Context) error {
game, err := h.findGame(c.Param("id"))
if err != nil {
return err
}

var params map[string]string = make(map[string]string)
c.Bind(&params)
Expand Down Expand Up @@ -168,7 +211,6 @@ func (h Handler) AddRound(c echo.Context) error {

round, err = h.service.AddRound(game.ID, round)
if err != nil {
log.Error(err)
return err
}

Expand All @@ -188,3 +230,12 @@ func render(ctx echo.Context, status int, t templ.Component) error {

return nil
}

func (h Handler) findGame(gameId string) (*skat.Game, error) {
parsedId, err := strconv.Atoi(gameId)
if err != nil {
return nil, err
}

return h.service.Find(int32(parsedId))
}
43 changes: 40 additions & 3 deletions internal/skat/service.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ package skat

import (
"database/sql"
"fmt"
"slices"

"github.com/go-jet/jet/v2/sqlite"
Expand Down Expand Up @@ -60,15 +59,14 @@ func (s Service) Find(gameId int32) (*Game, error) {

game := Game{}
err := stmt.Query(s.db, &game)
fmt.Println(stmt.DebugSql())
if err != nil {
return &Game{}, err
}

return &game, nil
}

func (s Service) Create(g Game) (game Game, err error) {
func (s Service) Create(g Game) (Game, error) {
tx, err := s.db.Begin()
if err != nil {
return Game{}, err
Expand Down Expand Up @@ -147,6 +145,45 @@ func (s Service) Create(g Game) (game Game, err error) {
return g, nil
}

func (s Service) Edit(g Game) (Game, error) {
tx, err := s.db.Begin()
if err != nil {
return Game{}, err
}
defer tx.Rollback()

stmt := table.Game.UPDATE(table.Game.Stake, table.Game.Online).
MODEL(g).
WHERE(table.Game.ID.EQ(sqlite.Int32(g.ID)))

_, err = stmt.Exec(tx)
if err != nil {
return Game{}, err
}

for rank, player := range g.Players {
stmt := table.GamePlayer.UPDATE(table.GamePlayer.Rank).
MODEL(model.GamePlayer{
GameID: g.ID,
PlayerID: player.ID,
Rank: int32(rank),
}).
WHERE(table.GamePlayer.GameID.EQ(sqlite.Int32(g.ID)).
AND(table.GamePlayer.PlayerID.EQ(sqlite.Int32(player.ID))))
_, err = stmt.Exec(tx)
if err != nil {
return Game{}, err
}
}

err = tx.Commit()
if err != nil {
return Game{}, err
}

return g, nil
}

func (s Service) AddRound(gameId int32, round Round) (Round, error) {
opponents := round.Opponents

Expand Down
6 changes: 6 additions & 0 deletions main.go
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,13 @@ func registerRoutes(e *echo.Echo, handler api.Handler) {
e.GET("/", handler.GetIndex)

e.POST("/games", handler.CreateGame)
e.GET("/games/create", handler.GetCreateGameForm)

e.GET("/games/:id", handler.GetGameDetails)

e.GET("/games/:id/edit", handler.GetEditGameForm)
e.PUT("/games/:id/edit", handler.EditGame)

e.DELETE("/games/:id", handler.DeleteGame)
e.POST("/games/:id/rounds", handler.AddRound)

Expand Down
Loading

0 comments on commit b2c01a8

Please sign in to comment.