From c7ea2056484ccdcb2aecdda9bd240bf3148886f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C3=ABl=20Giovanni=20Jules?= Date: Sun, 15 May 2022 15:35:27 +0400 Subject: [PATCH] feat: can now specify composition when creating deck --- docs/docs.go | 10 ++++++++++ docs/swagger.json | 10 ++++++++++ docs/swagger.yaml | 7 +++++++ http/handler.go | 20 +++++++++++++++++--- 4 files changed, 44 insertions(+), 3 deletions(-) diff --git a/docs/docs.go b/docs/docs.go index 11aa522..eac763b 100644 --- a/docs/docs.go +++ b/docs/docs.go @@ -64,6 +64,16 @@ const docTemplate = `{ "description": "list of codes", "name": "codes", "in": "query" + }, + { + "type": "array", + "items": { + "type": "string" + }, + "example": "french, uno", + "description": "composition of deck", + "name": "comp", + "in": "query" } ], "responses": { diff --git a/docs/swagger.json b/docs/swagger.json index 33c6892..3badaf3 100644 --- a/docs/swagger.json +++ b/docs/swagger.json @@ -55,6 +55,16 @@ "description": "list of codes", "name": "codes", "in": "query" + }, + { + "type": "array", + "items": { + "type": "string" + }, + "example": "french, uno", + "description": "composition of deck", + "name": "comp", + "in": "query" } ], "responses": { diff --git a/docs/swagger.yaml b/docs/swagger.yaml index a2c0dd8..3461df3 100644 --- a/docs/swagger.yaml +++ b/docs/swagger.yaml @@ -110,6 +110,13 @@ paths: type: string name: codes type: array + - description: composition of deck + example: french, uno + in: query + items: + type: string + name: comp + type: array produces: - application/json responses: diff --git a/http/handler.go b/http/handler.go index ba82711..caa6659 100644 --- a/http/handler.go +++ b/http/handler.go @@ -6,6 +6,8 @@ import ( "strconv" "github.com/gin-gonic/gin" + "github.com/mgjules/deckr/card" + "github.com/mgjules/deckr/composition" "github.com/mgjules/deckr/deck" "github.com/mgjules/deckr/docs" "github.com/mgjules/deckr/repo/inmemory" @@ -53,18 +55,30 @@ func (Server) handleSwagger() gin.HandlerFunc { // @Description creates a new full or partial deck of cards given an optional list of codes // @Tags deck // @Produce json -// @Param codes query []string false "list of codes" example(AS, 2C, 3D, 4H, 5S) +// @Param codes query []string false "list of codes" example(AS, 2C, 3D, 4H, 5S) +// @Param comp query []string false "composition of deck" example(french, uno) // @Success 201 {object} http.DeckClosed // @Failure 400 {object} http.Error // @Failure 500 {object} http.Error // @Router /decks [post] func (s *Server) handleCreateDeck() gin.HandlerFunc { return func(c *gin.Context) { - cc := c.QueryArray("codes") + comp := c.Query("comp") + codes := c.QueryArray("codes") - d, err := deck.New(deck.WithCodes(cc...)) + d, err := deck.New(deck.WithComposition(comp), deck.WithCodes(codes...)) if err != nil { s.log.Errorf("new deck: %v", err) + + if errors.Is(err, composition.ErrUnknownComposition) || + errors.Is(err, card.ErrInvalidCode) || + errors.Is(err, card.ErrInvalidRank) || + errors.Is(err, card.ErrInvalidSuit) { + c.AbortWithStatusJSON(http.StatusBadRequest, Error{err.Error()}) + + return + } + c.AbortWithStatusJSON(http.StatusInternalServerError, Error{err.Error()}) return