diff --git a/storage/dao/database.go b/storage/dao/database.go index 5f901f6..4030ca5 100755 --- a/storage/dao/database.go +++ b/storage/dao/database.go @@ -23,4 +23,19 @@ type Database interface { UpdateGame(*model.Game) error // end: games dao funcs + // start: cage cages funcs + GetAllCages() ([]*model.Cage, error) + GetCageById(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) + CreateHamster(*model.Hamster) error + DeleteHamster(string) error + UpdateHamster(*model.Hamster) error + // end: games dao funcs + } diff --git a/storage/dao/fake/database_fake_cages.go b/storage/dao/fake/database_fake_cages.go index b665306..bef784a 100755 --- a/storage/dao/fake/database_fake_cages.go +++ b/storage/dao/fake/database_fake_cages.go @@ -1 +1,66 @@ package fake + +import ( + "encoding/json" + "errors" + uuid "github.com/satori/go.uuid" + "hamster-tycoon/storage/dao" + "hamster-tycoon/storage/model" + "hamster-tycoon/utils" +) + +const ( + cacheKeyCages = "cages" +) + +func (db *DatabaseFake) saveCages(cages []*model.Cage) { + data := make([]interface{}, 0) + for _, v := range cages { + data = append(data, v) + } + db.save(cacheKeyCages, data) +} + +func (db *DatabaseFake) loadCages() []*model.Cage { + cages := make([]*model.Cage, 0) + b, err := db.Cache.Get(cacheKeyCages) + if err != nil { + return cages + } + err = json.Unmarshal(b, &cages) + if err != nil { + utils.GetLogger().WithError(err).Error("Error while unmarshal fake users") + } + return cages +} + +func (db *DatabaseFake) GetAllCages() ([]*model.Cage, error) { + return db.loadCages(), nil +} + +func (db *DatabaseFake) GetCageById(cageId string) (*model.Cage, error) { + cages := db.loadCages() + for _, g := range cages { + if g.ID == cageId { + return g, nil + } + } + return nil, dao.NewDAOError(dao.ErrTypeNotFound, errors.New("cage not found")) +} + +func (db *DatabaseFake) CreateCage(cage *model.Cage) error { + cage.ID = uuid.NewV4().String() + + cages := db.loadCages() + cages = append(cages, cage) + db.saveCages(cages) + return nil +} + +func (db *DatabaseFake) DeleteCage(string) error { + return nil +} + +func (db *DatabaseFake) UpdateCage(*model.Cage) error { + return nil +} diff --git a/storage/dao/fake/database_fake_hamsters.go b/storage/dao/fake/database_fake_hamsters.go index b665306..b463382 100755 --- a/storage/dao/fake/database_fake_hamsters.go +++ b/storage/dao/fake/database_fake_hamsters.go @@ -1 +1,66 @@ package fake + +import ( + "encoding/json" + "errors" + uuid "github.com/satori/go.uuid" + "hamster-tycoon/storage/dao" + "hamster-tycoon/storage/model" + "hamster-tycoon/utils" +) + +const ( + cacheKeyHamsters = "hamsters" +) + +func (db *DatabaseFake) saveHamsters(hamsters []*model.Hamster) { + data := make([]interface{}, 0) + for _, v := range hamsters { + data = append(data, v) + } + db.save(cacheKeyHamsters, data) +} + +func (db *DatabaseFake) loadHamsters() []*model.Hamster { + hamsters := make([]*model.Hamster, 0) + b, err := db.Cache.Get(cacheKeyHamsters) + if err != nil { + return hamsters + } + err = json.Unmarshal(b, &hamsters) + if err != nil { + utils.GetLogger().WithError(err).Error("Error while unmarshal fake users") + } + return hamsters +} + +func (db *DatabaseFake) GetAllHamsters() ([]*model.Hamster, error) { + return db.loadHamsters(), nil +} + +func (db *DatabaseFake) GetHamsterById(hamsterId string) (*model.Hamster, error) { + hamsters := db.loadHamsters() + for _, g := range hamsters { + if g.ID == hamsterId { + return g, nil + } + } + return nil, dao.NewDAOError(dao.ErrTypeNotFound, errors.New("hamster not found")) +} + +func (db *DatabaseFake) CreateHamster(hamster *model.Hamster) error { + hamster.ID = uuid.NewV4().String() + + hamsters := db.loadHamsters() + hamsters = append(hamsters, hamster) + db.saveHamsters(hamsters) + return nil +} + +func (db *DatabaseFake) DeleteHamster(string) error { + return nil +} + +func (db *DatabaseFake) UpdateHamster(*model.Hamster) error { + return nil +} diff --git a/storage/dao/postgresql/database_postgresql_cages.go b/storage/dao/postgresql/database_postgresql_cages.go index 4e9a54a..e138373 100755 --- a/storage/dao/postgresql/database_postgresql_cages.go +++ b/storage/dao/postgresql/database_postgresql_cages.go @@ -1 +1,91 @@ package postgresql + +import ( + "database/sql" + "github.com/lib/pq" + "hamster-tycoon/storage/dao" + "hamster-tycoon/storage/model" +) + +func (db *DatabasePostgreSQL) GetAllCages() ([]*model.Cage, error) { + q := ` + SELECT c.id, created_at, updated_at, game_id + FROM public.Cage c + ` + rows, err := db.session.Query(q) + if err != nil { + return nil, err + } + defer rows.Close() + + cages := make([]*model.Cage, 0) + for rows.Next() { + game := model.Game{} + cage := model.Cage{ + Game: game, + } + err := rows.Scan(&cage.ID, &cage.CreatedAt, &cage.UpdatedAt, &game.ID) + if err != nil { + return nil, err + } + cages = append(cages, &cage) + } + return cages, nil +} + +func (db *DatabasePostgreSQL) GetCageById(id string) (*model.Cage, error) { + q := ` + SELECT c.id, created_at, updated_at, game_id + FROM public.Cage c + WHERE c.id = $1 + ` + row := db.session.QueryRow(q, id) + + game := model.Game{} + cage := model.Cage{ + Game: game, + } + err := row.Scan(&cage.ID, &cage.CreatedAt, &cage.UpdatedAt, &game.ID) + if errPq, ok := err.(*pq.Error); ok { + return nil, handlePgError(errPq) + } + if err == sql.ErrNoRows { + return nil, dao.NewDAOError(dao.ErrTypeNotFound, err) + } + return &cage, err +} + +func (db *DatabasePostgreSQL) CreateCage(cage *model.Cage) error { + q := ` + INSERT INTO public.Cage + (game_id) + VALUES + ($1) + RETURNING id, created_at + ` + + err := db.session. + QueryRow(q, cage.Game.ID). + Scan(&cage.ID, &cage.CreatedAt) + if errPq, ok := err.(*pq.Error); ok { + return handlePgError(errPq) + } + return err +} + +func (db *DatabasePostgreSQL) DeleteCage(id string) error { + q := ` + DELETE FROM public.Cage + WHERE id = $1 + ` + + _, err := db.session.Exec(q, id) + if errPq, ok := err.(*pq.Error); ok { + return handlePgError(errPq) + } + return err +} + +func (db *DatabasePostgreSQL) UpdateCage(cage *model.Cage) error { + return nil +} diff --git a/storage/dao/postgresql/database_postgresql_hamsters.go b/storage/dao/postgresql/database_postgresql_hamsters.go index 4e9a54a..aa38774 100755 --- a/storage/dao/postgresql/database_postgresql_hamsters.go +++ b/storage/dao/postgresql/database_postgresql_hamsters.go @@ -1 +1,120 @@ package postgresql + +import ( + "database/sql" + "github.com/lib/pq" + "hamster-tycoon/storage/dao" + "hamster-tycoon/storage/model" +) + +func (db *DatabasePostgreSQL) GetAllHamsters() ([]*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 + ` + rows, err := db.session.Query(q) + 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) GetHamsterById(id 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 + ` + row := db.session.QueryRow(q, id) + + hamster := model.Hamster{ + Mother: &model.Hamster{}, + Father: &model.Hamster{}, + GestationFather: &model.Hamster{}, + } + err := row.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 errPq, ok := err.(*pq.Error); ok { + return nil, handlePgError(errPq) + } + if err == sql.ErrNoRows { + return nil, dao.NewDAOError(dao.ErrTypeNotFound, err) + } + return &hamster, err +} + +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) + VALUES + ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16) + RETURNING id, created_at + ` + + err := db.session. + QueryRow(q, &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). + Scan(&hamster.ID, &hamster.CreatedAt) + if errPq, ok := err.(*pq.Error); ok { + return handlePgError(errPq) + } + return err +} + +func (db *DatabasePostgreSQL) DeleteHamster(id string) error { + q := ` + DELETE FROM public.Hamster + WHERE id = $1 + ` + + _, err := db.session.Exec(q, id) + if errPq, ok := err.(*pq.Error); ok { + return handlePgError(errPq) + } + return err +} + +func (db *DatabasePostgreSQL) UpdateHamster(hamster *model.Hamster) error { + return nil +}