refactor: remove persister abstraction layer
Some checks failed
CI / Deploy / test (pull_request) Successful in 8s
CI / Deploy / lint (pull_request) Failing after 46s
CI / Deploy / deploy (pull_request) Has been skipped

Inline persistence logic directly into game stores and handlers:
- game/persist.go: DB mapping methods on GameStore and GameInstance
- snake/persist.go: DB mapping methods on SnakeStore and SnakeGameInstance
- Chat persistence inlined into c4game handlers
- Delete db/persister.go (GamePersister, SnakePersister, ChatPersister)
- Stores now take *repository.Queries directly instead of Persister interface
This commit is contained in:
Ryan Hamamura
2026-03-02 12:30:33 -10:00
parent 8c3b3fc6ea
commit 2aa026b1d5
10 changed files with 475 additions and 448 deletions

View File

@@ -1,40 +1,32 @@
package game
import (
"context"
"crypto/rand"
"encoding/hex"
"sync"
"github.com/ryanhamamura/c4/db/repository"
)
type PlayerSession struct {
Player *Player
}
type Persister interface {
SaveGame(g *Game) error
LoadGame(id string) (*Game, error)
SaveGamePlayer(gameID string, player *Player, slot int) error
LoadGamePlayers(gameID string) ([]*Player, error)
DeleteGame(id string) error
}
type GameStore struct {
games map[string]*GameInstance
gamesMu sync.RWMutex
persister Persister
games map[string]*GameInstance
gamesMu sync.RWMutex
queries *repository.Queries
notifyFunc func(gameID string)
}
func NewGameStore() *GameStore {
func NewGameStore(queries *repository.Queries) *GameStore {
return &GameStore{
games: make(map[string]*GameInstance),
games: make(map[string]*GameInstance),
queries: queries,
}
}
func (gs *GameStore) SetPersister(p Persister) {
gs.persister = p
}
func (gs *GameStore) SetNotifyFunc(f func(gameID string)) {
gs.notifyFunc = f
}
@@ -50,14 +42,14 @@ func (gs *GameStore) makeNotify(gameID string) func() {
func (gs *GameStore) Create() *GameInstance {
id := GenerateID(4)
gi := NewGameInstance(id)
gi.persister = gs.persister
gi.queries = gs.queries
gi.notify = gs.makeNotify(id)
gs.gamesMu.Lock()
gs.games[id] = gi
gs.gamesMu.Unlock()
if gs.persister != nil {
gs.persister.SaveGame(gi.game)
if gs.queries != nil {
gs.saveGame(gi.game)
}
return gi
@@ -72,28 +64,28 @@ func (gs *GameStore) Get(id string) (*GameInstance, bool) {
return gi, true
}
if gs.persister == nil {
if gs.queries == nil {
return nil, false
}
game, err := gs.persister.LoadGame(id)
if err != nil || game == nil {
g, err := gs.loadGame(id)
if err != nil || g == nil {
return nil, false
}
players, _ := gs.persister.LoadGamePlayers(id)
players, _ := gs.loadGamePlayers(id)
for _, p := range players {
if p.Color == 1 {
game.Players[0] = p
g.Players[0] = p
} else if p.Color == 2 {
game.Players[1] = p
g.Players[1] = p
}
}
gi = &GameInstance{
game: game,
persister: gs.persister,
notify: gs.makeNotify(id),
game: g,
queries: gs.queries,
notify: gs.makeNotify(id),
}
gs.gamesMu.Lock()
@@ -108,8 +100,8 @@ func (gs *GameStore) Delete(id string) error {
delete(gs.games, id)
gs.gamesMu.Unlock()
if gs.persister != nil {
return gs.persister.DeleteGame(id)
if gs.queries != nil {
return gs.queries.DeleteGame(context.Background(), id)
}
return nil
}
@@ -121,10 +113,10 @@ func GenerateID(size int) string {
}
type GameInstance struct {
game *Game
gameMu sync.RWMutex
notify func()
persister Persister
game *Game
gameMu sync.RWMutex
notify func()
queries *repository.Queries
}
func NewGameInstance(id string) *GameInstance {
@@ -158,9 +150,9 @@ func (gi *GameInstance) Join(ps *PlayerSession) bool {
return false
}
if gi.persister != nil {
gi.persister.SaveGamePlayer(gi.game.ID, ps.Player, slot)
gi.persister.SaveGame(gi.game)
if gi.queries != nil {
gi.saveGamePlayer(gi.game.ID, ps.Player, slot)
gi.saveGame(gi.game)
}
gi.notify()
@@ -196,8 +188,8 @@ func (gi *GameInstance) CreateRematch(gs *GameStore) *GameInstance {
newID := newGI.ID()
gi.game.RematchGameID = &newID
if gi.persister != nil {
if err := gi.persister.SaveGame(gi.game); err != nil {
if gi.queries != nil {
if err := gi.saveGame(gi.game); err != nil {
gs.Delete(newID)
gi.game.RematchGameID = nil
return nil
@@ -230,8 +222,8 @@ func (gi *GameInstance) DropPiece(col int, playerColor int) bool {
gi.game.SwitchTurn()
}
if gi.persister != nil {
gi.persister.SaveGame(gi.game)
if gi.queries != nil {
gi.saveGame(gi.game)
}
gi.notify()