diff --git a/models/main.go b/models/main.go index 1c36398..fd10f79 100644 --- a/models/main.go +++ b/models/main.go @@ -50,12 +50,24 @@ type Team struct { } type Action struct { - Actor string - ActorColor string - Action string // clue | guess - Word string - WordColor string - Number string // for clue + ID int `json:"id" db:"id"` + RoomID string `json:"room_id" db:"room_id"` + Actor string `json:"actor" db:"actor"` + ActorColor string `json:"actor_color" db:"actor_color"` + Action string `json:"action_type" db:"action_type"` + Word string `json:"word" db:"word"` + WordColor string `json:"word_color" db:"word_color"` + Number string `json:"number_associated" db:"number_associated"` + CreatedAt time.Time `json:"created_at" db:"created_at"` +} + +type Player struct { + ID int `json:"id" db:"id"` + RoomID string `json:"room_id" db:"room_id"` + Username string `json:"username" db:"username"` + Team UserTeam `json:"team" db:"team"` + Role UserRole `json:"role" db:"role"` + IsBot bool `json:"is_bot" db:"is_bot"` } type BotPlayer struct { diff --git a/repos/main.go b/repos/main.go index 1b8b8c8..04bf44b 100644 --- a/repos/main.go +++ b/repos/main.go @@ -1,11 +1,31 @@ package repos -import "github.com/jackc/pgx/v5/pgxpool" +import ( + "context" + "log/slog" + "os" + + "github.com/jackc/pgx/v5/pgxpool" +) type AllRepos interface { RoomsRepo + ActionsRepo + PlayersRepo } type RepoProvider struct { DB *pgxpool.Pool } + +func NewRepoProvider(pathToDB string) *RepoProvider { + dbpool, err := pgxpool.New(context.Background(), pathToDB) + if err != nil { + slog.Error("Unable to connect to database", "error", err) + os.Exit(1) + } + slog.Info("Successfully connected to database") + return &RepoProvider{ + DB: dbpool, + } +} diff --git a/repos/players.go b/repos/players.go new file mode 100644 index 0000000..d96b947 --- /dev/null +++ b/repos/players.go @@ -0,0 +1,31 @@ +package repos + +import ( + "context" + "gralias/models" +) + +type PlayersRepo interface { + GetPlayer(roomID, username string) (*models.Player, error) + AddPlayer(player *models.Player) error + DeletePlayer(roomID, username string) error +} + +func (p *RepoProvider) GetPlayer(roomID, username string) (*models.Player, error) { + var player models.Player + err := p.DB.QueryRow(context.Background(), "SELECT id, room_id, username, team, role, is_bot FROM players WHERE room_id = $1 AND username = $2", roomID, username).Scan(&player.ID, &player.RoomID, &player.Username, &player.Team, &player.Role, &player.IsBot) + if err != nil { + return nil, err + } + return &player, nil +} + +func (p *RepoProvider) AddPlayer(player *models.Player) error { + _, err := p.DB.Exec(context.Background(), "INSERT INTO players (room_id, username, team, role, is_bot) VALUES ($1, $2, $3, $4, $5)", player.RoomID, player.Username, player.Team, player.Role, player.IsBot) + return err +} + +func (p *RepoProvider) DeletePlayer(roomID, username string) error { + _, err := p.DB.Exec(context.Background(), "DELETE FROM players WHERE room_id = $1 AND username = $2", roomID, username) + return err +}