Enha: use of db methods

This commit is contained in:
Grail Finder
2025-07-02 12:55:50 +03:00
parent b66f9c4c06
commit 9973546aad
6 changed files with 89 additions and 78 deletions

View File

@ -60,34 +60,34 @@ func createRoom(ctx context.Context, req *models.RoomReq) (*models.Room, error)
// context // context
func getStateByCtx(ctx context.Context) (*models.UserState, error) { // func getStateByCtx(ctx context.Context) (*models.UserState, error) {
username, ok := ctx.Value(models.CtxUsernameKey).(string) // username, ok := ctx.Value(models.CtxUsernameKey).(string)
if !ok { // if !ok {
log.Debug("no username in ctx") // log.Debug("no username in ctx")
return &models.UserState{}, errors.New("no username in ctx") // return &models.UserState{}, errors.New("no username in ctx")
} // }
us, err := loadState(username) // us, err := loadState(username)
if err != nil { // if err != nil {
return &models.UserState{}, err // return &models.UserState{}, err
} // }
return us, nil // return us, nil
} // }
// func dbCreate(fi *models.FullInfo) error{ // func dbCreate(fi *models.FullInfo) error{
// repo.CreateRoom() // repo.CreateRoom()
// } // }
// func saveFullInfo(fi *models.FullInfo) error { func saveFullInfo(fi *models.FullInfo) error {
// // INFO: no transactions; so case is possible where first object is updated but the second is not // INFO: no transactions; so case is possible where first object is updated but the second is not
// if err := saveState(fi.State.Username, fi.State); err != nil { if err := repo.PlayerUpdate(fi.State); err != nil {
// return err return err
// } }
// log.Debug("saved user state", "state", fi.State) log.Debug("saved user state", "state", fi.State)
// if err := saveRoom(fi.Room); err != nil { if err := repo.RoomUpdate(context.Background(), fi.Room); err != nil {
// return err return err
// } }
// return nil return nil
// } }
func notifyBotIfNeeded(room *models.Room) { func notifyBotIfNeeded(room *models.Room) {
if botName := room.WhichBotToMove(); botName != "" { if botName := room.WhichBotToMove(); botName != "" {
@ -229,24 +229,24 @@ func joinTeam(ctx context.Context, role, team string) (*models.FullInfo, error)
} }
// get all rooms // get all rooms
func listRooms(allRooms bool) []*models.Room { // func listRooms(allRooms bool) []*models.Room {
cacheMap := memcache.GetAll() // cacheMap := memcache.GetAll()
publicRooms := []*models.Room{} // publicRooms := []*models.Room{}
// no way to know if room is public until unmarshal -_-; // // no way to know if room is public until unmarshal -_-;
for key, value := range cacheMap { // for key, value := range cacheMap {
if strings.HasPrefix(key, models.CacheRoomPrefix) { // if strings.HasPrefix(key, models.CacheRoomPrefix) {
room := &models.Room{} // room := &models.Room{}
if err := json.Unmarshal(value, &room); err != nil { // if err := json.Unmarshal(value, &room); err != nil {
log.Warn("failed to unmarshal room", "error", err) // log.Warn("failed to unmarshal room", "error", err)
continue // continue
} // }
if room.IsPublic || allRooms { // if room.IsPublic || allRooms {
publicRooms = append(publicRooms, room) // publicRooms = append(publicRooms, room)
} // }
} // }
} // }
return publicRooms // return publicRooms
} // }
// get bots // get bots
func listBots() map[string]map[string]string { func listBots() map[string]map[string]string {

View File

@ -91,23 +91,31 @@ func HandleFrontLogin(w http.ResponseWriter, r *http.Request) {
// check if room_id provided and exists // check if room_id provided and exists
if roomID != "" { if roomID != "" {
log.Debug("got room_id in login", "room_id", roomID) log.Debug("got room_id in login", "room_id", roomID)
room, err := getRoomByID(roomID) // room, err := getRoomByID(roomID)
room, err := repo.RoomGetByID(r.Context(), roomID)
if err != nil { if err != nil {
abortWithError(w, err.Error()) abortWithError(w, err.Error())
return return
} }
// room.PlayerList = append(room.PlayerList, fi.State.Username) // room.PlayerList = append(room.PlayerList, fi.State.Username)
fi.State.RoomID = room.ID
fi.Room = room fi.Room = room
fi.List = nil fi.List = nil
fi.State.RoomID = room.ID
repo.PlayerSetRoomID(fi.State.Username, room.ID)
// repo.RoomUpdate()
// save full info instead // save full info instead
if err := saveFullInfo(fi); err != nil { // if err := saveFullInfo(fi); err != nil {
// abortWithError(w, err.Error())
// return
// }
} else {
log.Debug("no room_id in login")
// fi.List = listRooms(false)
fi.List, err = repo.RoomList(r.Context())
if err != nil {
abortWithError(w, err.Error()) abortWithError(w, err.Error())
return return
} }
} else {
log.Debug("no room_id in login")
fi.List = listRooms(false)
// save state to cache // save state to cache
// if err := saveState(cleanName, userstate); err != nil { // if err := saveState(cleanName, userstate); err != nil {
if err := repo.PlayerUpdate(userstate); err != nil { if err := repo.PlayerUpdate(userstate); err != nil {

View File

@ -42,17 +42,20 @@ func HandleCreateRoom(w http.ResponseWriter, r *http.Request) {
} }
fi.State.RoomID = room.ID fi.State.RoomID = room.ID
fi.Room = room fi.Room = room
fi.Room.IsPublic = true // hardcode for local test; move to form if err := repo.RoomCreate(r.Context(), room); err != nil {
if err := repo.CreateRoom(r.Context(), room); err != nil {
abortWithError(w, err.Error()) abortWithError(w, err.Error())
return return
} }
if err := saveFullInfo(fi); err != nil { if err := repo.PlayerSetRoomID(fi.State.Username, room.ID); err != nil {
msg := "failed to set current room to session" abortWithError(w, err.Error())
log.Error(msg, "error", err)
abortWithError(w, msg)
return return
} }
// if err := saveFullInfo(fi); err != nil {
// msg := "failed to set current room to session"
// log.Error(msg, "error", err)
// abortWithError(w, msg)
// return
// }
notify(models.NotifyRoomListUpdate, "") notify(models.NotifyRoomListUpdate, "")
tmpl, err := template.ParseGlob("components/*.html") tmpl, err := template.ParseGlob("components/*.html")
if err != nil { if err != nil {
@ -198,7 +201,7 @@ func HandleStartGame(w http.ResponseWriter, r *http.Request) {
func HandleJoinRoom(w http.ResponseWriter, r *http.Request) { func HandleJoinRoom(w http.ResponseWriter, r *http.Request) {
roomID := r.URL.Query().Get("id") roomID := r.URL.Query().Get("id")
room, err := getRoomByID(roomID) room, err := repo.RoomGetByID(r.Context(), roomID)
if err != nil { if err != nil {
abortWithError(w, err.Error()) abortWithError(w, err.Error())
return return

View File

@ -60,7 +60,7 @@ func HandleHome(w http.ResponseWriter, r *http.Request) {
} }
} }
if fi != nil && fi.Room == nil { if fi != nil && fi.Room == nil {
rooms, err := repo.ListRooms(r.Context()) rooms, err := repo.RoomList(r.Context())
if err != nil { if err != nil {
log.Error("failed to list rooms;", "error", err) log.Error("failed to list rooms;", "error", err)
} }
@ -96,7 +96,7 @@ func HandleExit(w http.ResponseWriter, r *http.Request) {
// return // return
// } // }
if creatorLeft { if creatorLeft {
if err := repo.DeleteRoomByID(r.Context(), exitedRoom.ID); err != nil { if err := repo.RoomDeleteByID(r.Context(), exitedRoom.ID); err != nil {
log.Error("failed to remove room", "error", err) log.Error("failed to remove room", "error", err)
} }
// removeRoom(exitedRoom.ID) // removeRoom(exitedRoom.ID)
@ -105,7 +105,7 @@ func HandleExit(w http.ResponseWriter, r *http.Request) {
notify(models.NotifyRoomListUpdate, "") notify(models.NotifyRoomListUpdate, "")
} }
// scary to update the whole room // scary to update the whole room
if err := repo.UpdateRoom(r.Context(), exitedRoom); err != nil { if err := repo.RoomUpdate(r.Context(), exitedRoom); err != nil {
abortWithError(w, err.Error()) abortWithError(w, err.Error())
return return
} }
@ -113,7 +113,12 @@ func HandleExit(w http.ResponseWriter, r *http.Request) {
abortWithError(w, err.Error()) abortWithError(w, err.Error())
return return
} }
fi.List = listRooms(false) // fi.List = listRooms(false)
fi.List, err = repo.RoomList(r.Context())
if err != nil {
abortWithError(w, err.Error())
return
}
if err := tmpl.ExecuteTemplate(w, "base", fi); err != nil { if err := tmpl.ExecuteTemplate(w, "base", fi); err != nil {
log.Error("failed to exec templ;", "error", err, "templ", "base") log.Error("failed to exec templ;", "error", err, "templ", "base")
} }

View File

@ -19,7 +19,7 @@ CREATE TABLE rooms (
CREATE TABLE players ( CREATE TABLE players (
id INTEGER PRIMARY KEY AUTOINCREMENT, id INTEGER PRIMARY KEY AUTOINCREMENT,
room_id TEXT NOT NULL, room_id TEXT, -- nullable
username TEXT NOT NULL, username TEXT NOT NULL,
team TEXT NOT NULL DEFAULT '', -- 'red' or 'blue' team TEXT NOT NULL DEFAULT '', -- 'red' or 'blue'
role TEXT NOT NULL DEFAULT '', -- 'guesser' or 'mime' role TEXT NOT NULL DEFAULT '', -- 'guesser' or 'mime'

View File

@ -6,15 +6,15 @@ import (
) )
type RoomsRepo interface { type RoomsRepo interface {
ListRooms(ctx context.Context) ([]*models.Room, error) RoomList(ctx context.Context) ([]*models.Room, error)
GetRoomByID(ctx context.Context, id string) (*models.Room, error) RoomGetByID(ctx context.Context, id string) (*models.Room, error)
GetRoomExtended(ctx context.Context, id string) (*models.Room, error) RoomGetExtended(ctx context.Context, id string) (*models.Room, error)
CreateRoom(ctx context.Context, room *models.Room) error RoomCreate(ctx context.Context, room *models.Room) error
DeleteRoomByID(ctx context.Context, id string) error RoomDeleteByID(ctx context.Context, id string) error
UpdateRoom(ctx context.Context, room *models.Room) error RoomUpdate(ctx context.Context, room *models.Room) error
} }
func (p *RepoProvider) ListRooms(ctx context.Context) ([]*models.Room, error) { func (p *RepoProvider) RoomList(ctx context.Context) ([]*models.Room, error) {
rooms := []*models.Room{} rooms := []*models.Room{}
err := p.DB.SelectContext(ctx, &rooms, `SELECT * FROM rooms`) err := p.DB.SelectContext(ctx, &rooms, `SELECT * FROM rooms`)
if err != nil { if err != nil {
@ -23,7 +23,7 @@ func (p *RepoProvider) ListRooms(ctx context.Context) ([]*models.Room, error) {
return rooms, nil return rooms, nil
} }
func (p *RepoProvider) GetRoomByID(ctx context.Context, id string) (*models.Room, error) { func (p *RepoProvider) RoomGetByID(ctx context.Context, id string) (*models.Room, error) {
room := &models.Room{} room := &models.Room{}
err := p.DB.GetContext(ctx, room, `SELECT * FROM rooms WHERE id = ?`, id) err := p.DB.GetContext(ctx, room, `SELECT * FROM rooms WHERE id = ?`, id)
if err != nil { if err != nil {
@ -32,28 +32,27 @@ func (p *RepoProvider) GetRoomByID(ctx context.Context, id string) (*models.Room
return room, nil return room, nil
} }
func (p *RepoProvider) CreateRoom(ctx context.Context, r *models.Room) error { func (p *RepoProvider) RoomCreate(ctx context.Context, r *models.Room) error {
_, err := p.DB.ExecContext(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_running, is_over, team_won, room_link) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, r.ID, r.CreatedAt, r.CreatorName, r.TeamTurn, r.ThisTurnLimit, r.OpenedThisTurn, r.BlueCounter, r.RedCounter, r.RedTurn, r.MimeDone, r.IsRunning, r.IsOver, r.TeamWon, r.RoomLink) _, err := p.DB.ExecContext(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_running, is_over, team_won, room_link) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, r.ID, r.CreatedAt, r.CreatorName, r.TeamTurn, r.ThisTurnLimit, r.OpenedThisTurn, r.BlueCounter, r.RedCounter, r.RedTurn, r.MimeDone, r.IsRunning, r.IsOver, r.TeamWon, r.RoomLink)
return err return err
} }
func (p *RepoProvider) DeleteRoomByID(ctx context.Context, id string) error { func (p *RepoProvider) RoomDeleteByID(ctx context.Context, id string) error {
_, err := p.DB.ExecContext(ctx, `DELETE FROM rooms WHERE id = ?`, id) _, err := p.DB.ExecContext(ctx, `DELETE FROM rooms WHERE id = ?`, id)
return err return err
} }
func (p *RepoProvider) UpdateRoom(ctx context.Context, r *models.Room) error { func (p *RepoProvider) RoomUpdate(ctx context.Context, r *models.Room) error {
_, err := p.DB.ExecContext(ctx, `UPDATE rooms SET team_turn = ?, this_turn_limit = ?, opened_this_turn = ?, blue_counter = ?, red_counter = ?, red_turn = ?, mime_done = ?, = ?, is_running = ?, is_over = ?, team_won = ?, room_link = ? WHERE id = ?`, r.TeamTurn, r.ThisTurnLimit, r.OpenedThisTurn, r.BlueCounter, r.RedCounter, r.RedTurn, r.MimeDone, r.IsRunning, r.IsOver, r.TeamWon, r.RoomLink, r.ID) _, err := p.DB.ExecContext(ctx, `UPDATE rooms SET team_turn = ?, this_turn_limit = ?, opened_this_turn = ?, blue_counter = ?, red_counter = ?, red_turn = ?, mime_done = ?, = ?, is_running = ?, is_over = ?, team_won = ?, room_link = ? WHERE id = ?`, r.TeamTurn, r.ThisTurnLimit, r.OpenedThisTurn, r.BlueCounter, r.RedCounter, r.RedTurn, r.MimeDone, r.IsRunning, r.IsOver, r.TeamWon, r.RoomLink, r.ID)
return err return err
} }
func (p *RepoProvider) GetRoomExtended(ctx context.Context, id string) (*models.Room, error) { func (p *RepoProvider) RoomGetExtended(ctx context.Context, id string) (*models.Room, error) {
room := &models.Room{} room := &models.Room{}
err := p.DB.GetContext(ctx, room, `SELECT * FROM rooms WHERE id = ?`, id) err := p.DB.GetContext(ctx, room, `SELECT * FROM rooms WHERE id = ?`, id)
if err != nil { if err != nil {
return nil, err return nil, err
} }
// Get players // Get players
players := []*models.Player{} players := []*models.Player{}
err = p.DB.SelectContext(ctx, &players, `SELECT * FROM players WHERE room_id = ?`, id) err = p.DB.SelectContext(ctx, &players, `SELECT * FROM players WHERE room_id = ?`, id)
@ -86,23 +85,20 @@ func (p *RepoProvider) GetRoomExtended(ctx context.Context, id string) (*models.
} }
} }
} }
// Get word cards // Get word cards
wordCards := []*models.WordCard{} wordCards := []models.WordCard{}
err = p.DB.SelectContext(ctx, &wordCards, `SELECT * FROM word_cards WHERE room_id = ?`, id) err = p.DB.SelectContext(ctx, &wordCards, `SELECT * FROM word_cards WHERE room_id = ?`, id)
if err != nil { if err != nil {
return nil, err return nil, err
} }
room.Cards = wordCards room.Cards = wordCards
// Get actions // Get actions
actions := []*models.Action{} actions := []models.Action{}
err = p.DB.SelectContext(ctx, &actions, `SELECT * FROM actions WHERE room_id = ? ORDER BY created_at ASC`, id) err = p.DB.SelectContext(ctx, &actions, `SELECT * FROM actions WHERE room_id = ? ORDER BY created_at ASC`, id)
if err != nil { if err != nil {
return nil, err return nil, err
} }
room.ActionHistory = actions room.ActionHistory = actions
// Get settings // Get settings
settings := &models.GameSettings{} settings := &models.GameSettings{}
err = p.DB.GetContext(ctx, settings, `SELECT * FROM settings WHERE room_id = ?`, id) err = p.DB.GetContext(ctx, settings, `SELECT * FROM settings WHERE room_id = ?`, id)
@ -110,6 +106,5 @@ func (p *RepoProvider) GetRoomExtended(ctx context.Context, id string) (*models.
return nil, err return nil, err
} }
room.Settings = *settings room.Settings = *settings
return room, nil return room, nil
} }