From 2d2cd288f2a419886a50718a1f7b724cf63ed523 Mon Sep 17 00:00:00 2001 From: Miguel de la Cruz Date: Mon, 13 Sep 2021 22:45:08 +0200 Subject: [PATCH] Add create game and list games endpoints --- server/api/game.go | 46 +++++++++++++++++++++++++++++++++++ server/app/game.go | 23 ++++++++++++++++++ server/services/store/game.go | 4 +++ server/web/web.go | 4 ++- 4 files changed, 76 insertions(+), 1 deletion(-) create mode 100644 server/api/game.go create mode 100644 server/app/game.go diff --git a/server/api/game.go b/server/api/game.go new file mode 100644 index 0000000..4a7ef02 --- /dev/null +++ b/server/api/game.go @@ -0,0 +1,46 @@ +package api + +import ( + "fmt" + "net/http" + + "github.com/rs/zerolog/log" +) + +func (a *API) CreateGame(w http.ResponseWriter, r *http.Request) { + user, _ := UserFromRequest(r) + if !user.Admin { + http.Error(w, http.StatusText(http.StatusForbidden), http.StatusForbidden) + return + } + + body := ParseBody(r) + name := body.String("name") + + if name == "" { + http.Error(w, fmt.Sprintf("%s: name should not be empty", http.StatusText(http.StatusBadRequest)), http.StatusBadRequest) + return + } + + game, err := a.App.CreateGame(name, user.ID) + if err != nil { + log.Error().Err(err).Msg("game couldn't be created") + http.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError) + return + } + + JSON(w, game, 201) +} + +func (a *API) ListGames(w http.ResponseWriter, r *http.Request) { + user, _ := UserFromRequest(r) + + games, err := a.App.ListGamesForUser(user.ID) + if err != nil { + log.Error().Err(err).Msg("games couldn't be fetch") + http.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError) + return + } + + JSON(w, games, 200) +} diff --git a/server/app/game.go b/server/app/game.go new file mode 100644 index 0000000..fd20183 --- /dev/null +++ b/server/app/game.go @@ -0,0 +1,23 @@ +package app + +import ( + "database/sql" + + "git.ctrlz.es/mgdelacroix/craban/model" +) + +func (a *App) CreateGame(name string, userID int) (*model.Game, error) { + return a.Store.Game().Create(name, userID) +} + +func (a *App) AddMember(gameID, userID int, role string) (*model.GameMember, error) { + return a.Store.Game().AddMember(gameID, userID, role) +} + +func (a *App) ListGamesForUser(userID int) ([]*model.Game, error) { + games, err := a.Store.Game().ListForUser(userID) + if err == sql.ErrNoRows { + return []*model.Game{}, nil + } + return games, err +} diff --git a/server/services/store/game.go b/server/services/store/game.go index fbb6541..9294dd0 100644 --- a/server/services/store/game.go +++ b/server/services/store/game.go @@ -189,3 +189,7 @@ func (gs *GameStore) AddMember(gameID, userID int, role string) (*model.GameMemb return gs.GetMember(gameID, userID) } + +func (gs *GameStore) ListForUser(userID int) ([]*model.Game, error) { + return gs.getGamesByCondition(sq.Eq{"user_id": userID}) +} diff --git a/server/web/web.go b/server/web/web.go index 5dbadb7..5bf7c6a 100644 --- a/server/web/web.go +++ b/server/web/web.go @@ -38,7 +38,9 @@ func (w *WebServer) RegisterRoutes(api *api.API) { apiRouter := r.PathPrefix("/api").Subrouter() apiRouter.HandleFunc("/login", api.Login).Methods("POST") - apiRouter.HandleFunc("/user", api.Secured(api.CreateUser)).Methods("POST") + apiRouter.HandleFunc("/users", api.Secured(api.CreateUser)).Methods("POST") + apiRouter.HandleFunc("/games", api.Secured(api.CreateGame)).Methods("POST") + apiRouter.HandleFunc("/games", api.Secured(api.ListGames)).Methods("GET") staticFSSub, _ := fs.Sub(staticFS, "static") staticFSHandler := StaticFSHandler{http.FileServer(http.FS(staticFSSub))}