add missing path property handling

This commit is contained in:
Jeffrey Duroyon
2020-05-18 00:56:43 +02:00
parent ca8e42388b
commit f6e0a826a1
21 changed files with 292 additions and 114 deletions

View File

@@ -17,25 +17,26 @@ type Database interface {
// start: cage games funcs
GetAllGames() ([]*model.Game, error)
GetGameById(string) (*model.Game, error)
GetGameByID(string) (*model.Game, error)
CreateGame(*model.Game) error
DeleteGame(string) error
UpdateGame(*model.Game) error
// end: games dao funcs
// start: cage cages funcs
GetAllCages() ([]*model.Cage, error)
GetCageById(string) (*model.Cage, error)
// start: cage funcs
GetAllCages(string) ([]*model.Cage, error)
GetCageByID(string, string) (*model.Cage, error)
CreateCage(*model.Cage) error
DeleteCage(string) error
UpdateCage(*model.Cage) error
// end: games dao funcs
// start: cage cages funcs
GetAllHamsters() ([]*model.Hamster, error)
GetHamsterById(string) (*model.Hamster, error)
// end: cage dao funcs
// start: hamster funcs
GetAllHamsters(string, string) ([]*model.Hamster, error)
GetHamsterByID(string, string, string) (*model.Hamster, error)
CreateHamster(*model.Hamster) error
DeleteHamster(string) error
UpdateHamster(*model.Hamster) error
// end: games dao funcs
GetHamstersOfGame(string) ([]*model.Hamster, error)
// end: hamster dao funcs
}

View File

@@ -12,19 +12,19 @@ const (
ErrTypeForeignKeyViolation
)
type DAOError struct {
type Error struct {
Cause error
Type Type
}
func NewDAOError(t Type, cause error) error {
return &DAOError{
return &Error{
Type: t,
Cause: cause,
}
}
func (e *DAOError) Error() string {
func (e *Error) Error() string {
if e.Cause != nil {
return fmt.Sprintf("Type %d: %s", e.Type, e.Cause.Error())
}

View File

@@ -34,14 +34,21 @@ func (db *DatabaseFake) loadCages() []*model.Cage {
return cages
}
func (db *DatabaseFake) GetAllCages() ([]*model.Cage, error) {
return db.loadCages(), nil
func (db *DatabaseFake) GetAllCages(gameID string) ([]*model.Cage, error) {
cages := db.loadCages()
var cagesLoaded []*model.Cage
for _, g := range cages {
if g.Game.ID == gameID {
cagesLoaded = append(cagesLoaded, g)
}
}
return cagesLoaded, nil
}
func (db *DatabaseFake) GetCageById(cageId string) (*model.Cage, error) {
func (db *DatabaseFake) GetCageByID(gameID, cageID string) (*model.Cage, error) {
cages := db.loadCages()
for _, g := range cages {
if g.ID == cageId {
if g.Game.ID == gameID && g.ID == cageID {
return g, nil
}
}

View File

@@ -38,10 +38,10 @@ func (db *DatabaseFake) GetAllGames() ([]*model.Game, error) {
return db.loadGames(), nil
}
func (db *DatabaseFake) GetGameById(gameId string) (*model.Game, error) {
func (db *DatabaseFake) GetGameByID(gameID string) (*model.Game, error) {
games := db.loadGames()
for _, g := range games {
if g.ID == gameId {
if g.ID == gameID {
return g, nil
}
}
@@ -64,3 +64,14 @@ func (db *DatabaseFake) DeleteGame(string) error {
func (db *DatabaseFake) UpdateGame(*model.Game) error {
return nil
}
func (db *DatabaseFake) GetHamstersOfGame(game string) ([]*model.Hamster, error) {
hamsters := db.loadHamsters()
var hamstersFound []*model.Hamster
for _, g := range hamsters {
if g.Cage.Game.ID == game {
hamstersFound = append(hamstersFound, g)
}
}
return hamstersFound, nil
}

View File

@@ -34,14 +34,21 @@ func (db *DatabaseFake) loadHamsters() []*model.Hamster {
return hamsters
}
func (db *DatabaseFake) GetAllHamsters() ([]*model.Hamster, error) {
return db.loadHamsters(), nil
func (db *DatabaseFake) GetAllHamsters(gameID, cageID string) ([]*model.Hamster, error) {
hamsters := db.loadHamsters()
var hamsterFound []*model.Hamster
for _, g := range hamsters {
if g.Cage.ID == cageID && g.Cage.Game.ID == gameID {
hamsterFound = append(hamsterFound, g)
}
}
return hamsterFound, nil
}
func (db *DatabaseFake) GetHamsterById(hamsterId string) (*model.Hamster, error) {
func (db *DatabaseFake) GetHamsterByID(hamsterID, gameID, cageID string) (*model.Hamster, error) {
hamsters := db.loadHamsters()
for _, g := range hamsters {
if g.ID == hamsterId {
if g.ID == hamsterID && g.Cage.ID == cageID && g.Cage.Game.ID == gameID {
return g, nil
}
}

View File

@@ -98,7 +98,7 @@ func (db *DatabaseFake) UpdateUser(user *model.User) error {
func (db *DatabaseFake) GetUsersByGoogleID(userID string) (*model.User, error) {
users := db.loadUsers()
for _, u := range users {
if u.GoogleId == userID {
if u.GoogleID == userID {
return u, nil
}
}

View File

@@ -7,12 +7,13 @@ import (
"hamster-tycoon/storage/model"
)
func (db *DatabasePostgreSQL) GetAllCages() ([]*model.Cage, error) {
func (db *DatabasePostgreSQL) GetAllCages(gameID string) ([]*model.Cage, error) {
q := `
SELECT c.id, created_at, updated_at, game_id
FROM public.Cage c
WHERE c.game_id=$1
`
rows, err := db.session.Query(q)
rows, err := db.session.Query(q, gameID)
if err != nil {
return nil, err
}
@@ -33,13 +34,13 @@ func (db *DatabasePostgreSQL) GetAllCages() ([]*model.Cage, error) {
return cages, nil
}
func (db *DatabasePostgreSQL) GetCageById(id string) (*model.Cage, error) {
func (db *DatabasePostgreSQL) GetCageByID(gameID, cageID string) (*model.Cage, error) {
q := `
SELECT c.id, created_at, updated_at, game_id
FROM public.Cage c
WHERE c.id = $1
WHERE c.game_id=$1 and c.id = $2
`
row := db.session.QueryRow(q, id)
row := db.session.QueryRow(q, gameID, cageID)
game := model.Game{}
cage := model.Cage{

View File

@@ -34,7 +34,7 @@ func (db *DatabasePostgreSQL) GetAllGames() ([]*model.Game, error) {
return games, nil
}
func (db *DatabasePostgreSQL) GetGameById(id string) (*model.Game, error) {
func (db *DatabasePostgreSQL) GetGameByID(id string) (*model.Game, error) {
q := `
SELECT g.id, g.server_id, g.user_id, g.created_at, g.updated_at
FROM public.game g
@@ -88,6 +88,47 @@ func (db *DatabasePostgreSQL) DeleteGame(id string) error {
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
}

View File

@@ -7,12 +7,15 @@ import (
"hamster-tycoon/storage/model"
)
func (db *DatabasePostgreSQL) GetAllHamsters() ([]*model.Hamster, error) {
func (db *DatabasePostgreSQL) GetAllHamsters(gameID, cageID 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
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, cage_id
FROM hamster h
JOIN cage c ON h.cage_id = c.id
JOIN game g on c.game_id = g.id
WHERE c.id=$1 and g.id=$2
`
rows, err := db.session.Query(q)
rows, err := db.session.Query(q, cageID, gameID)
if err != nil {
return nil, err
}
@@ -24,6 +27,7 @@ func (db *DatabasePostgreSQL) GetAllHamsters() ([]*model.Hamster, error) {
Mother: &model.Hamster{},
Father: &model.Hamster{},
GestationFather: &model.Hamster{},
Cage: &model.Cage{},
}
err := rows.Scan(&hamster.ID, &hamster.CreatedAt,
&hamster.UpdatedAt, &hamster.Name,
@@ -34,7 +38,7 @@ func (db *DatabasePostgreSQL) GetAllHamsters() ([]*model.Hamster, error) {
&hamster.Height, &hamster.Alive,
&hamster.Sold, &hamster.Gestation,
&hamster.GestationPeriod, &hamster.GestationCooldown,
&hamster.GestationFather.ID)
&hamster.GestationFather.ID, &hamster.Cage.ID)
if err != nil {
return nil, err
}
@@ -43,18 +47,21 @@ func (db *DatabasePostgreSQL) GetAllHamsters() ([]*model.Hamster, error) {
return hamsters, nil
}
func (db *DatabasePostgreSQL) GetHamsterById(id string) (*model.Hamster, error) {
func (db *DatabasePostgreSQL) GetHamsterByID(id, gameID, cageID 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
WHERE c.id = $1
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, cage_id
FROM hamster h
JOIN cage c ON h.cage_id = c.id
JOIN game g on c.game_id = g.id
WHERE h.id=$1 and c.id=$2 and g.id=$3
`
row := db.session.QueryRow(q, id)
row := db.session.QueryRow(q, id, cageID, gameID)
hamster := model.Hamster{
Mother: &model.Hamster{},
Father: &model.Hamster{},
GestationFather: &model.Hamster{},
Cage: &model.Cage{},
}
err := row.Scan(&hamster.ID, &hamster.CreatedAt,
&hamster.UpdatedAt, &hamster.Name,
@@ -65,7 +72,7 @@ func (db *DatabasePostgreSQL) GetHamsterById(id string) (*model.Hamster, error)
&hamster.Height, &hamster.Alive,
&hamster.Sold, &hamster.Gestation,
&hamster.GestationPeriod, &hamster.GestationCooldown,
&hamster.GestationFather.ID)
&hamster.GestationFather.ID, &hamster.Cage.ID)
if errPq, ok := err.(*pq.Error); ok {
return nil, handlePgError(errPq)
@@ -79,9 +86,9 @@ func (db *DatabasePostgreSQL) GetHamsterById(id string) (*model.Hamster, error)
func (db *DatabasePostgreSQL) CreateHamster(hamster *model.Hamster) error {
q := `
INSERT INTO public.Hamster
(name, number, sexe, age, father_id, mother_id, hunger_level, thirst_level, weight, height, alive, sold, gestation, gestation_period, gestation_cooldown, gestation_father_id)
(name, number, sexe, age, father_id, mother_id, hunger_level, thirst_level, weight, height, alive, sold, gestation, gestation_period, gestation_cooldown, gestation_father_id,cage_id)
VALUES
($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16)
($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17)
RETURNING id, created_at
`
@@ -94,7 +101,7 @@ func (db *DatabasePostgreSQL) CreateHamster(hamster *model.Hamster) error {
&hamster.Height, &hamster.Alive,
&hamster.Sold, &hamster.Gestation,
&hamster.GestationPeriod, &hamster.GestationCooldown,
&hamster.GestationFather.ID).
&hamster.GestationFather.ID, &hamster.Cage.ID).
Scan(&hamster.ID, &hamster.CreatedAt)
if errPq, ok := err.(*pq.Error); ok {
return handlePgError(errPq)

View File

@@ -60,7 +60,7 @@ func (db *DatabasePostgreSQL) CreateUser(user *model.User) error {
`
err := db.session.
QueryRow(q, user.Nickname, user.GoogleId).
QueryRow(q, user.Nickname, user.GoogleID).
Scan(&user.ID, &user.CreatedAt)
if errPq, ok := err.(*pq.Error); ok {
return handlePgError(errPq)
@@ -94,7 +94,7 @@ func (db *DatabasePostgreSQL) GetUsersByGoogleID(id string) (*model.User, error)
row := db.session.QueryRow(q, id)
u := model.User{}
err := row.Scan(&u.ID, &u.CreatedAt, &u.UpdatedAt, &u.Nickname, &u.GoogleId)
err := row.Scan(&u.ID, &u.CreatedAt, &u.UpdatedAt, &u.Nickname, &u.GoogleID)
if errPq, ok := err.(*pq.Error); ok {
return nil, handlePgError(errPq)
}

View File

@@ -51,6 +51,7 @@ type Hamster struct {
Child []*Hamster `json:"childs"`
CreatedAt time.Time `json:"createdAt"`
UpdatedAt *time.Time `json:"updatedAt"`
Cage *Cage `json:"cage"`
}
func (h *Hamster) Die() {
@@ -90,9 +91,8 @@ func (h *Hamster) Fuck(another *Hamster) (bool, error) {
female, male := func() (*Hamster, *Hamster) {
if h.Sexe == FEMALE {
return h, another
} else {
return another, h
}
return another, h
}()
female.GestationFather = male
female.Gestation = true
@@ -147,9 +147,8 @@ func randSexe() string {
return func() string {
if randNumber(1, 2) == 2 {
return MALE
} else {
return FEMALE
}
return FEMALE
}()
}

View File

@@ -9,7 +9,7 @@ type User struct {
ID string `json:"id"`
CreatedAt time.Time `json:"createdAt"`
UpdatedAt *time.Time `json:"updatedAt"`
GoogleId string `json:"-"`
GoogleID string `json:"-"`
Games []Game
}

View File

@@ -10,7 +10,7 @@ type UserData struct {
}
type UserDataEditable struct {
UserId string `json:'userId'`
UserID string `json:'userID'`
Type string `json:"type"`
Name string `json:"name"`
Content string `json:"content"`