55 lines
1.4 KiB
Go
55 lines
1.4 KiB
Go
package main
|
|
|
|
import "fmt"
|
|
|
|
type PlayerService struct {
|
|
db *DB
|
|
}
|
|
type PlayerServiceQuery struct {
|
|
Name *string `db:"name"`
|
|
ID *int64 `db:"id"`
|
|
}
|
|
|
|
func (ps *PlayerService) Query(query PlayerServiceQuery) (Player, error) {
|
|
player := 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)
|
|
if err != nil {
|
|
return player, fmt.Errorf("failed getting player for query %q: %v", sqlQuery, err)
|
|
}
|
|
|
|
return player, nil
|
|
}
|
|
|
|
func (ps *PlayerService) Create(name string, guild Guild) (Player, error) {
|
|
player := Player{}
|
|
res, err := ps.db.writeConn.Exec("insert into player (name, guild) values (?, ?)", name, guild.ID)
|
|
if err != nil {
|
|
return player, fmt.Errorf("failed to insert player: %v", err)
|
|
}
|
|
|
|
id, err := res.LastInsertId()
|
|
if err != nil {
|
|
return player, fmt.Errorf("failed to get last insert id: %v", err)
|
|
}
|
|
|
|
return ps.Query(PlayerServiceQuery{ID: &id})
|
|
}
|
|
|
|
func (ps *PlayerService) GetOrCreate(name string, guild Guild) (Player, error) {
|
|
player := Player{}
|
|
player, err := ps.Query(PlayerServiceQuery{Name: &name})
|
|
if err != nil {
|
|
player, err = ps.Create(name, guild)
|
|
if err != nil {
|
|
return player, fmt.Errorf("failed creating player: %v", err)
|
|
}
|
|
}
|
|
return player, nil
|
|
}
|