Rework query to return lists

This commit is contained in:
2024-10-27 19:07:47 +01:00
parent 91a3a0f4f7
commit b86d586c42
4 changed files with 222 additions and 148 deletions

View File

@@ -10,20 +10,30 @@ type PlayerServiceQuery struct {
ID *int64 `db:"id"`
}
func (ps *PlayerService) Query(query PlayerServiceQuery) (Player, error) {
player := Player{}
func (ps *PlayerService) Query(query PlayerServiceQuery) ([]Player, error) {
res := []Player{}
sqlQuery := "SELECT id, name, guild FROM player"
whereQuery := BuildWhereQuery(query)
if whereQuery != "" {
sqlQuery += " " + whereQuery
}
err := ps.db.readConn.QueryRow(sqlQuery).Scan(&player.ID, &player.Name, &player.Guild.ID)
rows, err := ps.db.readConn.Query(sqlQuery)
if err != nil {
return player, fmt.Errorf("failed getting player for query %q: %v", sqlQuery, err)
return res, fmt.Errorf("failed getting players for query %q: %v", sqlQuery, err)
}
defer rows.Close()
for rows.Next() {
player := Player{}
err := rows.Scan(&player.ID, &player.Name, &player.Guild.ID)
if err != nil {
return res, fmt.Errorf("failed scanning player: %v", err)
}
res = append(res, player)
}
return player, nil
return res, nil
}
func (ps *PlayerService) Create(name string, guild Guild) (Player, error) {
@@ -38,13 +48,24 @@ func (ps *PlayerService) Create(name string, guild Guild) (Player, error) {
return player, fmt.Errorf("failed to get last insert id: %v", err)
}
return ps.Query(PlayerServiceQuery{ID: &id})
qres, err := ps.Query(PlayerServiceQuery{ID: &id})
if err != nil {
return player, fmt.Errorf("failed getting player for id %d: %v", id, err)
}
if len(qres) > 1 {
return player, fmt.Errorf("more than one player found for id %d", id)
}
return qres[0], nil
}
func (ps *PlayerService) GetOrCreate(name string, guild Guild) (Player, error) {
player := Player{}
player, err := ps.Query(PlayerServiceQuery{Name: &name})
players, err := ps.Query(PlayerServiceQuery{Name: &name})
if err != nil {
if len(players) > 1 {
return player, fmt.Errorf("more than one player found for name %s", name)
}
player, err = ps.Create(name, guild)
if err != nil {
return player, fmt.Errorf("failed creating player: %v", err)