This commit is contained in:
2021-08-24 00:11:00 +02:00
parent 57bde4ac3c
commit 0757262143
22 changed files with 716 additions and 632 deletions

View File

@@ -15,28 +15,19 @@ type Database interface {
UpdateUser(*model.User) error
// end: user dao funcs
// start: cage games funcs
GetAllGames() ([]*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 funcs
GetAllCages(string) ([]*model.Cage, error)
GetCageByID(string, string) (*model.Cage, error)
GetAllCages() ([]*model.Cage, error)
GetCageByID(string) (*model.Cage, error)
CreateCage(*model.Cage) error
DeleteCage(string) error
UpdateCage(*model.Cage) error
// end: cage dao funcs
// start: hamster funcs
GetAllHamsters(string, string) ([]*model.Hamster, error)
GetHamsterByID(string, string, string) (*model.Hamster, error)
GetAllHamsters(string) ([]*model.Hamster, error)
GetHamsterByID(string, string) (*model.Hamster, error)
CreateHamster(*model.Hamster) error
DeleteHamster(string) error
UpdateHamster(*model.Hamster) error
GetHamstersOfGame(string) ([]*model.Hamster, error)
// end: hamster dao funcs
}

View File

@@ -1,37 +0,0 @@
package fake
import (
"encoding/json"
"hamster-tycoon/storage/dao"
"hamster-tycoon/utils"
"time"
"github.com/allegro/bigcache"
)
type DatabaseFake struct {
Cache *bigcache.BigCache
}
func NewDatabaseFake() dao.Database {
cache, err := bigcache.NewBigCache(bigcache.DefaultConfig(time.Minute))
if err != nil {
utils.GetLogger().WithError(err).Fatal("Error while instantiate cache")
}
return &DatabaseFake{
Cache: cache,
}
}
func (db *DatabaseFake) save(key string, data []interface{}) {
b, err := json.Marshal(data)
if err != nil {
utils.GetLogger().WithError(err).Errorf("Error while marshal fake %s", key)
db.Cache.Set(key, []byte("[]"))
return
}
err = db.Cache.Set(key, b)
if err != nil {
utils.GetLogger().WithError(err).Errorf("Error while saving fake %s", key)
}
}

View File

@@ -1,73 +0,0 @@
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(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(gameID, cageID string) (*model.Cage, error) {
cages := db.loadCages()
for _, g := range cages {
if g.Game.ID == gameID && 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
}

View File

@@ -1,77 +0,0 @@
package fake
import (
"encoding/json"
"errors"
uuid "github.com/satori/go.uuid"
"hamster-tycoon/storage/dao"
"hamster-tycoon/storage/model"
"hamster-tycoon/utils"
)
const (
cacheKeyGames = "games"
)
func (db *DatabaseFake) saveGames(games []*model.Game) {
data := make([]interface{}, 0)
for _, v := range games {
data = append(data, v)
}
db.save(cacheKeyGames, data)
}
func (db *DatabaseFake) loadGames() []*model.Game {
games := make([]*model.Game, 0)
b, err := db.Cache.Get(cacheKeyGames)
if err != nil {
return games
}
err = json.Unmarshal(b, &games)
if err != nil {
utils.GetLogger().WithError(err).Error("Error while unmarshal fake users")
}
return games
}
func (db *DatabaseFake) GetAllGames() ([]*model.Game, error) {
return db.loadGames(), nil
}
func (db *DatabaseFake) GetGameByID(gameID string) (*model.Game, error) {
games := db.loadGames()
for _, g := range games {
if g.ID == gameID {
return g, nil
}
}
return nil, dao.NewDAOError(dao.ErrTypeNotFound, errors.New("game not found"))
}
func (db *DatabaseFake) CreateGame(game *model.Game) error {
game.ID = uuid.NewV4().String()
games := db.loadGames()
games = append(games, game)
db.saveGames(games)
return nil
}
func (db *DatabaseFake) DeleteGame(string) error {
return nil
}
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

@@ -1,73 +0,0 @@
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(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, gameID, cageID string) (*model.Hamster, error) {
hamsters := db.loadHamsters()
for _, g := range hamsters {
if g.ID == hamsterID && g.Cage.ID == cageID && g.Cage.Game.ID == gameID {
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
}

View File

@@ -1,106 +0,0 @@
package fake
import (
"encoding/json"
"errors"
"hamster-tycoon/storage/dao"
"hamster-tycoon/storage/model"
"hamster-tycoon/utils"
"time"
"github.com/satori/go.uuid"
)
const (
cacheKeyUsers = "users"
)
func (db *DatabaseFake) saveUsers(users []*model.User) {
data := make([]interface{}, 0)
for _, v := range users {
data = append(data, v)
}
db.save(cacheKeyUsers, data)
}
func (db *DatabaseFake) loadUsers() []*model.User {
users := make([]*model.User, 0)
b, err := db.Cache.Get(cacheKeyUsers)
if err != nil {
return users
}
err = json.Unmarshal(b, &users)
if err != nil {
utils.GetLogger().WithError(err).Error("Error while unmarshal fake users")
}
return users
}
func (db *DatabaseFake) GetAllUsers() ([]*model.User, error) {
return db.loadUsers(), nil
}
func (db *DatabaseFake) GetUsersByID(userID string) (*model.User, error) {
users := db.loadUsers()
for _, u := range users {
if u.ID == userID {
return u, nil
}
}
return nil, dao.NewDAOError(dao.ErrTypeNotFound, errors.New("user not found"))
}
func (db *DatabaseFake) CreateUser(user *model.User) error {
user.ID = uuid.NewV4().String()
user.CreatedAt = time.Now()
users := db.loadUsers()
users = append(users, user)
db.saveUsers(users)
return nil
}
func (db *DatabaseFake) DeleteUser(userID string) error {
users := db.loadUsers()
newUsers := make([]*model.User, 0)
for _, u := range users {
if u.ID != userID {
newUsers = append(newUsers, u)
}
}
db.saveUsers(newUsers)
return nil
}
func (db *DatabaseFake) UpdateUser(user *model.User) error {
users := db.loadUsers()
var foundUser *model.User
for _, u := range users {
if u.ID == user.ID {
foundUser = u
break
}
}
if foundUser == nil {
return dao.NewDAOError(dao.ErrTypeNotFound, errors.New("user not found"))
}
foundUser.UserEditable = user.UserEditable
now := time.Now()
foundUser.UpdatedAt = &now
db.saveUsers(users)
*user = *foundUser
return nil
}
func (db *DatabaseFake) GetUsersByGoogleID(userID string) (*model.User, error) {
users := db.loadUsers()
for _, u := range users {
if u.GoogleID == userID {
return u, nil
}
}
return nil, dao.NewDAOError(dao.ErrTypeNotFound, errors.New("user not found"))
}

View File

@@ -2,18 +2,18 @@ package postgresql
import (
"database/sql"
"github.com/lib/pq"
"hamster-tycoon/storage/dao"
"hamster-tycoon/storage/model"
"github.com/lib/pq"
)
func (db *DatabasePostgreSQL) GetAllCages(gameID string) ([]*model.Cage, error) {
func (db *DatabasePostgreSQL) GetAllCages() ([]*model.Cage, error) {
q := `
SELECT c.id, created_at, updated_at, game_id
SELECT c.id, created_at, updated_at
FROM public.Cage c
WHERE c.game_id=$1
`
rows, err := db.session.Query(q, gameID)
rows, err := db.session.Query(q)
if err != nil {
return nil, err
}
@@ -21,11 +21,8 @@ func (db *DatabasePostgreSQL) GetAllCages(gameID string) ([]*model.Cage, error)
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)
cage := model.Cage{}
err := rows.Scan(&cage.ID, &cage.CreatedAt, &cage.UpdatedAt)
if err != nil {
return nil, err
}
@@ -34,19 +31,16 @@ func (db *DatabasePostgreSQL) GetAllCages(gameID string) ([]*model.Cage, error)
return cages, nil
}
func (db *DatabasePostgreSQL) GetCageByID(gameID, cageID string) (*model.Cage, error) {
func (db *DatabasePostgreSQL) GetCageByID(cageID string) (*model.Cage, error) {
q := `
SELECT c.id, created_at, updated_at, game_id
SELECT c.id, created_at, updated_at
FROM public.Cage c
WHERE c.game_id=$1 and c.id = $2
WHERE c.id = $2
`
row := db.session.QueryRow(q, gameID, cageID)
row := db.session.QueryRow(q, cageID)
game := model.Game{}
cage := model.Cage{
Game: game,
}
err := row.Scan(&cage.ID, &cage.CreatedAt, &cage.UpdatedAt, &game.ID)
cage := model.Cage{}
err := row.Scan(&cage.ID, &cage.CreatedAt, &cage.UpdatedAt)
if errPq, ok := err.(*pq.Error); ok {
return nil, handlePgError(errPq)
}
@@ -57,21 +51,7 @@ func (db *DatabasePostgreSQL) GetCageByID(gameID, cageID string) (*model.Cage, e
}
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
return nil
}
func (db *DatabasePostgreSQL) DeleteCage(id string) error {

View File

@@ -1,127 +0,0 @@
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.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() {
user := model.User{}
game := model.Game{}
err := rows.Scan(&game.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.name, g.user_id, g.created_at, g.updated_at
FROM public.game g
WHERE g.id = $1
`
row := db.session.QueryRow(q, id)
user := model.User{}
game := model.Game{}
err := row.Scan(&game.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
(user_id, name)
VALUES
($1, $2)
RETURNING id, created_at
`
err := db.session.
QueryRow(q, 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
}

View File

@@ -2,20 +2,20 @@ package postgresql
import (
"database/sql"
"github.com/lib/pq"
"hamster-tycoon/storage/dao"
"hamster-tycoon/storage/model"
"github.com/lib/pq"
)
func (db *DatabasePostgreSQL) GetAllHamsters(gameID, cageID string) ([]*model.Hamster, error) {
func (db *DatabasePostgreSQL) GetAllHamsters(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, cage_id
SELECT id, created_at, updated_at, name, number, sexe, age, father_id, mother_id, hunger_level, thirst_level, weight, height, alive, sold, golden, 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, cageID, gameID)
rows, err := db.session.Query(q, cageID)
if err != nil {
return nil, err
}
@@ -36,7 +36,7 @@ func (db *DatabasePostgreSQL) GetAllHamsters(gameID, cageID string) ([]*model.Ha
&hamster.Mother.ID, &hamster.HungerLevel,
&hamster.ThirstLevel, &hamster.Weight,
&hamster.Height, &hamster.Alive,
&hamster.Sold, &hamster.Gestation,
&hamster.Sold, &hamster.Golden, &hamster.Gestation,
&hamster.GestationPeriod, &hamster.GestationCooldown,
&hamster.GestationFather.ID, &hamster.Cage.ID)
if err != nil {
@@ -47,15 +47,14 @@ func (db *DatabasePostgreSQL) GetAllHamsters(gameID, cageID string) ([]*model.Ha
return hamsters, nil
}
func (db *DatabasePostgreSQL) GetHamsterByID(id, gameID, cageID string) (*model.Hamster, error) {
func (db *DatabasePostgreSQL) GetHamsterByID(id, 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, cage_id
SELECT id, created_at, updated_at, name, number, sexe, age, father_id, mother_id, hunger_level, thirst_level, weight, height, alive, sold, golden, 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, cageID, gameID)
row := db.session.QueryRow(q, id, cageID)
hamster := model.Hamster{
Mother: &model.Hamster{},
@@ -70,7 +69,7 @@ func (db *DatabasePostgreSQL) GetHamsterByID(id, gameID, cageID string) (*model.
&hamster.Mother.ID, &hamster.HungerLevel,
&hamster.ThirstLevel, &hamster.Weight,
&hamster.Height, &hamster.Alive,
&hamster.Sold, &hamster.Gestation,
&hamster.Sold, &hamster.Golden, &hamster.Gestation,
&hamster.GestationPeriod, &hamster.GestationCooldown,
&hamster.GestationFather.ID, &hamster.Cage.ID)
@@ -86,7 +85,7 @@ func (db *DatabasePostgreSQL) GetHamsterByID(id, gameID, cageID string) (*model.
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,cage_id)
(name, number, sexe, age, father_id, mother_id, hunger_level, thirst_level, weight, height, alive, sold, golden, 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, $17)
RETURNING id, created_at
@@ -99,7 +98,7 @@ func (db *DatabasePostgreSQL) CreateHamster(hamster *model.Hamster) error {
&hamster.Mother.ID, &hamster.HungerLevel,
&hamster.ThirstLevel, &hamster.Weight,
&hamster.Height, &hamster.Alive,
&hamster.Sold, &hamster.Gestation,
&hamster.Sold, &hamster.Golden, &hamster.Gestation,
&hamster.GestationPeriod, &hamster.GestationCooldown,
&hamster.GestationFather.ID, &hamster.Cage.ID).
Scan(&hamster.ID, &hamster.CreatedAt)

View File

@@ -4,7 +4,6 @@ import "time"
type Cage struct {
ID string `json:"id"`
Game Game `json:"game"`
Hamsters []*Hamster `json:"hamsters"`
CreatedAt time.Time `json:"createdAt"`
UpdatedAt *time.Time `json:"updatedAt"`

View File

@@ -1,13 +0,0 @@
package model
import "time"
type Game struct {
ID string `json:"game_id"`
User User `json:"-"`
Name string `json:"name"`
Cages []*Cage `json:"cages"`
SoldHamster []*Hamster `json:"sold_hamsters"`
CreatedAt time.Time `json:"createdAt"`
UpdatedAt *time.Time `json:"updatedAt"`
}

View File

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