Feat: room and actions repos
This commit is contained in:
10
go.mod
10
go.mod
@ -4,5 +4,15 @@ go 1.24
|
||||
|
||||
require (
|
||||
github.com/BurntSushi/toml v1.5.0
|
||||
github.com/jackc/pgx/v5 v5.7.5
|
||||
github.com/rs/xid v1.6.0
|
||||
)
|
||||
|
||||
require (
|
||||
github.com/jackc/pgpassfile v1.0.0 // indirect
|
||||
github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect
|
||||
github.com/jackc/puddle/v2 v2.2.2 // indirect
|
||||
golang.org/x/crypto v0.37.0 // indirect
|
||||
golang.org/x/sync v0.13.0 // indirect
|
||||
golang.org/x/text v0.24.0 // indirect
|
||||
)
|
||||
|
28
go.sum
28
go.sum
@ -1,4 +1,32 @@
|
||||
github.com/BurntSushi/toml v1.5.0 h1:W5quZX/G/csjUnuI8SUYlsHs9M38FC7znL0lIO+DvMg=
|
||||
github.com/BurntSushi/toml v1.5.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho=
|
||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM=
|
||||
github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg=
|
||||
github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 h1:iCEnooe7UlwOQYpKFhBabPMi4aNAfoODPEFNiAnClxo=
|
||||
github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM=
|
||||
github.com/jackc/pgx/v5 v5.7.5 h1:JHGfMnQY+IEtGM63d+NGMjoRpysB2JBwDr5fsngwmJs=
|
||||
github.com/jackc/pgx/v5 v5.7.5/go.mod h1:aruU7o91Tc2q2cFp5h4uP3f6ztExVpyVv88Xl/8Vl8M=
|
||||
github.com/jackc/puddle/v2 v2.2.2 h1:PR8nw+E/1w0GLuRFSmiioY6UooMp6KJv0/61nB7icHo=
|
||||
github.com/jackc/puddle/v2 v2.2.2/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4=
|
||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||
github.com/rs/xid v1.6.0 h1:fV591PaemRlL6JfRxGDEPl69wICngIQ3shQtzfy2gxU=
|
||||
github.com/rs/xid v1.6.0/go.mod h1:7XoLgs4eV+QndskICGsho+ADou8ySMSjJKDIan90Nz0=
|
||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
||||
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||
github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk=
|
||||
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
|
||||
golang.org/x/crypto v0.37.0 h1:kJNSjF/Xp7kU0iB2Z+9viTPMW4EqqsrywMXLJOOsXSE=
|
||||
golang.org/x/crypto v0.37.0/go.mod h1:vg+k43peMZ0pUMhYmVAWysMK35e6ioLh3wB8ZCAfbVc=
|
||||
golang.org/x/sync v0.13.0 h1:AauUjRAJ9OSnvULf/ARrrVywoJDy0YS2AwQ98I37610=
|
||||
golang.org/x/sync v0.13.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
|
||||
golang.org/x/text v0.24.0 h1:dd5Bzh4yt5KYA8f9CJHCP4FB4D51c2c6JvN37xJJkJ0=
|
||||
golang.org/x/text v0.24.0/go.mod h1:L8rBsPeo2pSS+xqN0d5u2ikmjtmoJbDBT1b7nHvFCdU=
|
||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
|
||||
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||
|
@ -70,33 +70,33 @@ type CardMark struct {
|
||||
|
||||
type Room struct {
|
||||
ID string `json:"id" db:"id"`
|
||||
CreatedAt time.Time `json:"created_at" db:"created_at"` // limit?
|
||||
RoomLink string
|
||||
CreatorName string `json:"creator_name"`
|
||||
ActionHistory []Action
|
||||
TeamTurn UserTeam
|
||||
RedTeam Team
|
||||
BlueTeam Team
|
||||
Cards []WordCard
|
||||
ThisTurnLimit uint8 // how many cards guessers can open this turn
|
||||
OpenedThisTurn uint8 // how many cards have been opened this turn
|
||||
WCMap map[string]WordColor
|
||||
BotMap map[string]BotPlayer // key is bot name
|
||||
BlueCounter uint8
|
||||
RedCounter uint8
|
||||
RedTurn bool // false is blue turn
|
||||
MimeDone bool
|
||||
IsPublic bool
|
||||
IsRunning bool `json:"is_running"`
|
||||
Language string `json:"language" example:"en" form:"language"`
|
||||
RoundTime int32 `json:"round_time"`
|
||||
IsOver bool
|
||||
TeamWon UserTeam // blue | red
|
||||
//
|
||||
Mark CardMark // card is marked
|
||||
// needed for debug
|
||||
LogJournal []string
|
||||
Settings GameSettings
|
||||
CreatedAt time.Time `json:"created_at" db:"created_at"`
|
||||
CreatorName string `json:"creator_name" db:"creator_name"`
|
||||
TeamTurn UserTeam `db:"team_turn"`
|
||||
ThisTurnLimit uint8 `db:"this_turn_limit"`
|
||||
OpenedThisTurn uint8 `db:"opened_this_turn"`
|
||||
BlueCounter uint8 `db:"blue_counter"`
|
||||
RedCounter uint8 `db:"red_counter"`
|
||||
RedTurn bool `db:"red_turn"`
|
||||
MimeDone bool `db:"mime_done"`
|
||||
IsPublic bool `db:"is_public"`
|
||||
IsRunning bool `json:"is_running" db:"is_running"`
|
||||
Language string `json:"language" example:"en" form:"language" db:"language"`
|
||||
RoundTime uint32 `json:"round_time" db:"round_time"`
|
||||
IsOver bool `db:"is_over"`
|
||||
TeamWon UserTeam `db:"team_won"`
|
||||
RoomPass string `json:"room_pass" db:"room_pass"`
|
||||
// fields not in db
|
||||
RoomLink string `db:"-"`
|
||||
ActionHistory []Action `db:"-"`
|
||||
RedTeam Team `db:"-"`
|
||||
BlueTeam Team `db:"-"`
|
||||
Cards []WordCard `db:"-"`
|
||||
WCMap map[string]WordColor `db:"-"`
|
||||
BotMap map[string]BotPlayer `db:"-"`
|
||||
Mark CardMark `db:"-"`
|
||||
LogJournal []string `db:"-"`
|
||||
Settings GameSettings `db:"-"`
|
||||
}
|
||||
|
||||
func (r *Room) ClearMarks() {
|
||||
@ -325,10 +325,10 @@ type WordCard struct {
|
||||
}
|
||||
|
||||
type GameSettings struct {
|
||||
Language string `json:"language" example:"en" form:"language"`
|
||||
RoomPass string `json:"room_pass"`
|
||||
TurnSecondsLeft uint32
|
||||
RoundTime uint32
|
||||
Language string `json:"language" example:"en" form:"language" db:"language"`
|
||||
RoomPass string `json:"room_pass" db:"room_pass"`
|
||||
TurnSecondsLeft uint32 `db:"-"`
|
||||
RoundTime uint32 `json:"round_time" db:"round_time"`
|
||||
}
|
||||
|
||||
// =====
|
||||
@ -343,19 +343,14 @@ type RoomReq struct {
|
||||
|
||||
func (rr *RoomReq) CreateRoom(creator string) *Room {
|
||||
roomID := xid.New().String()
|
||||
settings := GameSettings{
|
||||
Language: rr.Language,
|
||||
RoomPass: rr.RoomPass,
|
||||
RoundTime: rr.RoundTime,
|
||||
}
|
||||
return &Room{
|
||||
// RoomName: ,
|
||||
ID: roomID,
|
||||
CreatedAt: time.Now(),
|
||||
// PlayerList: []string{creator},
|
||||
CreatorName: creator,
|
||||
Language: rr.Language,
|
||||
RoundTime: rr.RoundTime,
|
||||
RoomPass: rr.RoomPass,
|
||||
BotMap: make(map[string]BotPlayer),
|
||||
Settings: settings,
|
||||
}
|
||||
}
|
||||
|
||||
|
46
repos/actions.go
Normal file
46
repos/actions.go
Normal file
@ -0,0 +1,46 @@
|
||||
package repos
|
||||
|
||||
import (
|
||||
"context"
|
||||
"gralias/models"
|
||||
|
||||
"github.com/jackc/pgx/v5"
|
||||
)
|
||||
|
||||
type ActionsRepo interface {
|
||||
ListActions(ctx context.Context, roomID string) ([]models.Action, error)
|
||||
CreateAction(ctx context.Context, roomID string, action *models.Action) error
|
||||
GetLastClue(ctx context.Context, roomID string) (*models.Action, error)
|
||||
DeleteActionsByRoomID(ctx context.Context, roomID string) error
|
||||
}
|
||||
|
||||
func (p *RepoProvider) ListActions(ctx context.Context, roomID string) ([]models.Action, error) {
|
||||
rows, err := p.DB.Query(ctx, `SELECT actor, actor_color, action_type, word, word_color, number_associated FROM actions WHERE room_id = $1 ORDER BY created_at ASC`, roomID)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return pgx.CollectRows(rows, pgx.RowToStructByName[models.Action])
|
||||
}
|
||||
|
||||
func (p *RepoProvider) CreateAction(ctx context.Context, roomID string, a *models.Action) error {
|
||||
_, err := p.DB.Exec(ctx, `INSERT INTO actions (room_id, actor, actor_color, action_type, word, word_color, number_associated) VALUES ($1, $2, $3, $4, $5, $6, $7)`,
|
||||
roomID, a.Actor, a.ActorColor, a.Action, a.Word, a.WordColor, a.Number)
|
||||
return err
|
||||
}
|
||||
|
||||
func (p *RepoProvider) GetLastClue(ctx context.Context, roomID string) (*models.Action, error) {
|
||||
rows, err := p.DB.Query(ctx, `SELECT actor, actor_color, action_type, word, word_color, number_associated FROM actions WHERE room_id = $1 AND action_type = 'gave_clue' ORDER BY created_at DESC LIMIT 1`, roomID)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
action, err := pgx.CollectOneRow(rows, pgx.RowToStructByName[models.Action])
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &action, nil
|
||||
}
|
||||
|
||||
func (p *RepoProvider) DeleteActionsByRoomID(ctx context.Context, roomID string) error {
|
||||
_, err := p.DB.Exec(ctx, `DELETE FROM actions WHERE room_id = $1`, roomID)
|
||||
return err
|
||||
}
|
@ -1,9 +1,11 @@
|
||||
package repos
|
||||
|
||||
import "github.com/jackc/pgx/v5/pgxpool"
|
||||
|
||||
type AllRepos interface {
|
||||
RoomsRepo
|
||||
}
|
||||
|
||||
type RepoProvider struct {
|
||||
// db connection
|
||||
DB *pgxpool.Pool
|
||||
}
|
||||
|
@ -1,15 +1,55 @@
|
||||
package repos
|
||||
|
||||
import "gralias/models"
|
||||
import (
|
||||
"context"
|
||||
"gralias/models"
|
||||
|
||||
"github.com/jackc/pgx/v5"
|
||||
)
|
||||
|
||||
type RoomsRepo interface {
|
||||
ListRooms() ([]models.Room, error)
|
||||
GetRoomByID(id string) (*models.Room, error)
|
||||
CreateRoom(room *models.Room) error
|
||||
DeleteRoomByID(id string) error
|
||||
ListRooms(ctx context.Context) ([]models.Room, error)
|
||||
GetRoomByID(ctx context.Context, id string) (*models.Room, error)
|
||||
CreateRoom(ctx context.Context, room *models.Room) error
|
||||
DeleteRoomByID(ctx context.Context, id string) error
|
||||
UpdateRoom(ctx context.Context, room *models.Room) error
|
||||
}
|
||||
|
||||
// provider implementation
|
||||
func (p RepoProvider) ListRooms() ([]models.Room, error) {
|
||||
return nil, nil
|
||||
func (p *RepoProvider) ListRooms(ctx context.Context) ([]models.Room, error) {
|
||||
rows, err := p.DB.Query(ctx, `SELECT * FROM rooms`)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
rooms, err := pgx.CollectRows(rows, pgx.RowToStructByName[models.Room])
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return rooms, nil
|
||||
}
|
||||
|
||||
func (p *RepoProvider) GetRoomByID(ctx context.Context, id string) (*models.Room, error) {
|
||||
rows, err := p.DB.Query(ctx, `SELECT * FROM rooms WHERE id = $1`, id)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
room, err := pgx.CollectOneRow(rows, pgx.RowToStructByName[models.Room])
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &room, nil
|
||||
}
|
||||
|
||||
func (p *RepoProvider) CreateRoom(ctx context.Context, r *models.Room) error {
|
||||
_, err := p.DB.Exec(ctx, `INSERT INTO rooms (id, created_at, creator_name, team_turn, this_turn_limit, opened_this_turn, blue_counter, red_counter, red_turn, mime_done, is_public, is_running, language, round_time, is_over, team_won, room_pass) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17)`, r.ID, r.CreatedAt, r.CreatorName, r.TeamTurn, r.ThisTurnLimit, r.OpenedThisTurn, r.BlueCounter, r.RedCounter, r.RedTurn, r.MimeDone, r.IsPublic, r.IsRunning, r.Language, r.RoundTime, r.IsOver, r.TeamWon, r.Settings.RoomPass)
|
||||
return err
|
||||
}
|
||||
|
||||
func (p *RepoProvider) DeleteRoomByID(ctx context.Context, id string) error {
|
||||
_, err := p.DB.Exec(ctx, `DELETE FROM rooms WHERE id = $1`, id)
|
||||
return err
|
||||
}
|
||||
|
||||
func (p *RepoProvider) UpdateRoom(ctx context.Context, r *models.Room) error {
|
||||
_, err := p.DB.Exec(ctx, `UPDATE rooms SET team_turn = $1, this_turn_limit = $2, opened_this_turn = $3, blue_counter = $4, red_counter = $5, red_turn = $6, mime_done = $7, is_public = $8, is_running = $9, language = $10, round_time = $11, is_over = $12, team_won = $13, room_pass = $14 WHERE id = $15`, r.TeamTurn, r.ThisTurnLimit, r.OpenedThisTurn, r.BlueCounter, r.RedCounter, r.RedTurn, r.MimeDone, r.IsPublic, r.IsRunning, r.Language, r.RoundTime, r.IsOver, r.TeamWon, r.Settings.RoomPass, r.ID)
|
||||
return err
|
||||
}
|
||||
|
Reference in New Issue
Block a user