135 lines
3.2 KiB
Go
Executable File
135 lines
3.2 KiB
Go
Executable File
package postgresql
|
|
|
|
import (
|
|
"database/sql"
|
|
"github.com/lib/pq"
|
|
"hamster-tycoon/storage/dao"
|
|
"hamster-tycoon/storage/model"
|
|
)
|
|
|
|
func (db *DatabasePostgreSQL) GetAllGames() ([]*model.Game, error) {
|
|
q := `
|
|
SELECT g.id, g.server_id, g.name, g.user_id, g.created_at, g.updated_at
|
|
FROM public.game g
|
|
`
|
|
rows, err := db.session.Query(q)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer rows.Close()
|
|
|
|
games := make([]*model.Game, 0)
|
|
for rows.Next() {
|
|
server := model.Server{}
|
|
user := model.User{}
|
|
game := model.Game{
|
|
Server: server,
|
|
}
|
|
err := rows.Scan(&game.ID, &server.ID, &game.Name, &user.ID, &game.CreatedAt, &game.UpdatedAt)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
games = append(games, &game)
|
|
}
|
|
return games, nil
|
|
}
|
|
|
|
func (db *DatabasePostgreSQL) GetGameByID(id string) (*model.Game, error) {
|
|
q := `
|
|
SELECT g.id, g.server_id, g.name, g.user_id, g.created_at, g.updated_at
|
|
FROM public.game g
|
|
WHERE g.id = $1
|
|
`
|
|
row := db.session.QueryRow(q, id)
|
|
|
|
server := model.Server{}
|
|
user := model.User{}
|
|
game := model.Game{
|
|
Server: server,
|
|
}
|
|
err := row.Scan(&game.ID, &server.ID, &game.Name, &user.ID, &game.CreatedAt, &game.UpdatedAt)
|
|
if errPq, ok := err.(*pq.Error); ok {
|
|
return nil, handlePgError(errPq)
|
|
}
|
|
if err == sql.ErrNoRows {
|
|
return nil, dao.NewDAOError(dao.ErrTypeNotFound, err)
|
|
}
|
|
return &game, err
|
|
}
|
|
|
|
func (db *DatabasePostgreSQL) CreateGame(game *model.Game) error {
|
|
q := `
|
|
INSERT INTO public.game
|
|
(server_id, user_id, name)
|
|
VALUES
|
|
($1, $2, $3)
|
|
RETURNING id, created_at
|
|
`
|
|
|
|
err := db.session.
|
|
QueryRow(q, game.Server.ID, game.User.ID, game.Name).
|
|
Scan(&game.ID, &game.CreatedAt)
|
|
if errPq, ok := err.(*pq.Error); ok {
|
|
return handlePgError(errPq)
|
|
}
|
|
return err
|
|
}
|
|
|
|
func (db *DatabasePostgreSQL) DeleteGame(id string) error {
|
|
q := `
|
|
DELETE FROM public.game
|
|
WHERE id = $1
|
|
`
|
|
|
|
_, err := db.session.Exec(q, id)
|
|
if errPq, ok := err.(*pq.Error); ok {
|
|
return handlePgError(errPq)
|
|
}
|
|
return err
|
|
}
|
|
|
|
func (db *DatabasePostgreSQL) GetHamstersOfGame(gameID string) ([]*model.Hamster, error) {
|
|
q := `
|
|
SELECT id, created_at, updated_at, name, number, sexe, age, father_id, mother_id, hunger_level, thirst_level, weight, height, alive, sold, gestation, gestation_period, gestation_cooldown, gestation_father_id
|
|
FROM public.Hamster h
|
|
JOIN public.cage c
|
|
ON c.id = h.cage_id
|
|
JOIN public.game g
|
|
on c.game_id = g.id
|
|
WHERE g.id = $1
|
|
`
|
|
rows, err := db.session.Query(q, gameID)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer rows.Close()
|
|
|
|
hamsters := make([]*model.Hamster, 0)
|
|
for rows.Next() {
|
|
hamster := model.Hamster{
|
|
Mother: &model.Hamster{},
|
|
Father: &model.Hamster{},
|
|
GestationFather: &model.Hamster{},
|
|
}
|
|
err := rows.Scan(&hamster.ID, &hamster.CreatedAt,
|
|
&hamster.UpdatedAt, &hamster.Name,
|
|
&hamster.Number, &hamster.Sexe,
|
|
&hamster.Age, &hamster.Father.ID,
|
|
&hamster.Mother.ID, &hamster.HungerLevel,
|
|
&hamster.ThirstLevel, &hamster.Weight,
|
|
&hamster.Height, &hamster.Alive,
|
|
&hamster.Sold, &hamster.Gestation,
|
|
&hamster.GestationPeriod, &hamster.GestationCooldown,
|
|
&hamster.GestationFather.ID)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
hamsters = append(hamsters, &hamster)
|
|
}
|
|
return hamsters, nil
|
|
}
|
|
|
|
func (db *DatabasePostgreSQL) UpdateGame(*model.Game) error {
|
|
return nil
|
|
}
|