Skip to content

Commit

Permalink
Merge pull request #13 from daithihearn/select-suit
Browse files Browse the repository at this point in the history
feat: select suit
  • Loading branch information
daithihearn authored Jan 18, 2024
2 parents 7d074a4 + 36dcd94 commit 8c7d52b
Show file tree
Hide file tree
Showing 10 changed files with 708 additions and 128 deletions.
1 change: 1 addition & 0 deletions cmd/api/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -130,6 +130,7 @@ func main() {
router.GET("/api/v1/game/:gameId", auth.EnsureValidTokenGin([]string{auth.ReadGame}), gameHandler.Get)
router.GET("/api/v1/game/:gameId/state", auth.EnsureValidTokenGin([]string{auth.ReadGame}), gameHandler.GetState)
router.PUT("/api/v1/game/:gameId/call", auth.EnsureValidTokenGin([]string{auth.WriteGame}), gameHandler.Call)
router.PUT("/api/v1/game/:gameId/suit", auth.EnsureValidTokenGin([]string{auth.WriteGame}), gameHandler.SelectSuit)
router.GET("/api/v1/game/all", auth.EnsureValidTokenGin([]string{auth.ReadGame}), gameHandler.GetAll)
router.PUT("/api/v1/game", auth.EnsureValidTokenGin([]string{auth.WriteAdmin}), gameHandler.Create)
router.DELETE("/api/v1/game/:gameId", auth.EnsureValidTokenGin([]string{auth.WriteAdmin}), gameHandler.Delete)
Expand Down
12 changes: 6 additions & 6 deletions pkg/game/deck-utils.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,16 +15,16 @@ func ShuffleCards(cards []CardName) []CardName {
return shuffled
}

func DealCards(cards []CardName, players []Player) ([]CardName, []Player) {
func DealCards(deck []CardName, numPlayers int) ([]CardName, [][]CardName) {
hands := make([][]CardName, numPlayers+1)
// Deal the cards
for i := 0; i < 5; i++ {
for j := 0; j < len(players); j++ {
players[j].Cards = append(players[j].Cards, cards[0])
cards = cards[1:]
for j := 0; j < numPlayers+1; j++ {
hands[j] = append(hands[j], deck[0])
deck = deck[1:]
}
}

return cards, players
return deck, hands
}

func NewDeck() []CardName {
Expand Down
124 changes: 62 additions & 62 deletions pkg/game/deck.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,12 @@ package game
type Suit string

const (
EMPTY Suit = "EMPTY"
CLUBS = "CLUBS"
DIAMONDS = "DIAMONDS"
HEARTS = "HEARTS"
SPADES = "SPADES"
WILD = "WILD"
Empty Suit = "EMPTY"
Clubs = "CLUBS"
Diamonds = "DIAMONDS"
Hearts = "HEARTS"
Spades = "SPADES"
Wild = "WILD"
)

type CardName string
Expand Down Expand Up @@ -73,7 +73,7 @@ const (

// Card represents a card with a value, coldValue, suit, and renegable status.
type Card struct {
NAME CardName
Name CardName
Value int
ColdValue int
Suit Suit
Expand All @@ -82,62 +82,62 @@ type Card struct {

// Define cards as constants.
var (
EmptyCard = Card{EMPTY_CARD, 0, 0, EMPTY, false}
TwoHearts = Card{NAME: TWO_HEARTS, Value: 2, ColdValue: 0, Suit: HEARTS, Renegable: false}
ThreeHearts = Card{THREE_HEARTS, 3, 0, HEARTS, false}
FourHearts = Card{FOUR_HEARTS, 4, 0, HEARTS, false}
SixHearts = Card{SIX_HEARTS, 6, 0, HEARTS, false}
SevenHearts = Card{SEVEN_HEARTS, 7, 0, HEARTS, false}
EightHearts = Card{EIGHT_HEARTS, 8, 0, HEARTS, false}
NineHearts = Card{NINE_HEARTS, 9, 0, HEARTS, false}
TenHearts = Card{TEN_HEARTS, 10, 0, HEARTS, false}
QueenHearts = Card{QUEEN_HEARTS, 12, 0, HEARTS, false}
KingHearts = Card{KING_HEARTS, 13, 0, HEARTS, false}
AceHearts = Card{ACE_HEARTS, 1, 0, HEARTS, false}
JackHearts = Card{JACK_HEARTS, 11, 0, HEARTS, true}
FiveHearts = Card{FIVE_HEARTS, 5, 0, HEARTS, true}
TwoDiamonds = Card{TWO_DIAMONDS, 2, 0, DIAMONDS, false}
ThreeDiamonds = Card{THREE_DIAMONDS, 3, 0, DIAMONDS, false}
FourDiamonds = Card{FOUR_DIAMONDS, 4, 0, DIAMONDS, false}
SixDiamonds = Card{SIX_DIAMONDS, 6, 0, DIAMONDS, false}
SevenDiamonds = Card{SEVEN_DIAMONDS, 7, 0, DIAMONDS, false}
EightDiamonds = Card{EIGHT_DIAMONDS, 8, 0, DIAMONDS, false}
NineDiamonds = Card{NINE_DIAMONDS, 9, 0, DIAMONDS, false}
TenDiamonds = Card{TEN_DIAMONDS, 10, 0, DIAMONDS, false}
QueenDiamonds = Card{QUEEN_DIAMONDS, 12, 0, DIAMONDS, false}
KingDiamonds = Card{KING_DIAMONDS, 13, 0, DIAMONDS, false}
AceDiamonds = Card{ACE_DIAMONDS, 1, 0, DIAMONDS, false}
JackDiamonds = Card{JACK_DIAMONDS, 11, 0, DIAMONDS, true}
FiveDiamonds = Card{FIVE_DIAMONDS, 5, 0, DIAMONDS, true}
TenClubs = Card{TEN_CLUBS, 10, 0, CLUBS, false}
NineClubs = Card{NINE_CLUBS, 9, 0, CLUBS, false}
EightClubs = Card{EIGHT_CLUBS, 8, 0, CLUBS, false}
SevenClubs = Card{SEVEN_CLUBS, 7, 0, CLUBS, false}
SixClubs = Card{SIX_CLUBS, 6, 0, CLUBS, false}
FourClubs = Card{FOUR_CLUBS, 4, 0, CLUBS, false}
ThreeClubs = Card{THREE_CLUBS, 3, 0, CLUBS, false}
TwoClubs = Card{TWO_CLUBS, 2, 0, CLUBS, false}
QueenClubs = Card{QUEEN_CLUBS, 12, 0, CLUBS, false}
KingClubs = Card{KING_CLUBS, 13, 0, CLUBS, false}
AceClubs = Card{ACE_CLUBS, 1, 0, CLUBS, false}
JackClubs = Card{JACK_CLUBS, 11, 0, CLUBS, true}
FiveClubs = Card{FIVE_CLUBS, 5, 0, CLUBS, true}
TenSpades = Card{TEN_SPADES, 10, 0, SPADES, false}
NineSpades = Card{NINE_SPADES, 9, 0, SPADES, false}
EightSpades = Card{EIGHT_SPADES, 8, 0, SPADES, false}
SevenSpades = Card{SEVEN_SPADES, 7, 0, SPADES, false}
SixSpades = Card{SIX_SPADES, 6, 0, SPADES, false}
FourSpades = Card{FOUR_SPADES, 4, 0, SPADES, false}
ThreeSpades = Card{THREE_SPADES, 3, 0, SPADES, false}
TwoSpades = Card{TWO_SPADES, 2, 0, SPADES, false}
QueenSpades = Card{QUEEN_SPADES, 12, 0, SPADES, false}
KingSpades = Card{KING_SPADES, 13, 0, SPADES, false}
AceSpades = Card{ACE_SPADES, 1, 0, SPADES, false}
JackSpades = Card{JACK_SPADES, 11, 0, SPADES, true}
FiveSpades = Card{FIVE_SPADES, 5, 0, SPADES, true}
Joker = Card{JOKER, 0, 0, WILD, true}
EmptyCard = Card{EMPTY_CARD, 0, 0, Empty, false}
TwoHearts = Card{Name: TWO_HEARTS, Value: 2, ColdValue: 0, Suit: Hearts, Renegable: false}
ThreeHearts = Card{THREE_HEARTS, 3, 0, Hearts, false}
FourHearts = Card{FOUR_HEARTS, 4, 0, Hearts, false}
SixHearts = Card{SIX_HEARTS, 6, 0, Hearts, false}
SevenHearts = Card{SEVEN_HEARTS, 7, 0, Hearts, false}
EightHearts = Card{EIGHT_HEARTS, 8, 0, Hearts, false}
NineHearts = Card{NINE_HEARTS, 9, 0, Hearts, false}
TenHearts = Card{TEN_HEARTS, 10, 0, Hearts, false}
QueenHearts = Card{QUEEN_HEARTS, 12, 0, Hearts, false}
KingHearts = Card{KING_HEARTS, 13, 0, Hearts, false}
AceHearts = Card{ACE_HEARTS, 1, 0, Hearts, false}
JackHearts = Card{JACK_HEARTS, 11, 0, Hearts, true}
FiveHearts = Card{FIVE_HEARTS, 5, 0, Hearts, true}
TwoDiamonds = Card{TWO_DIAMONDS, 2, 0, Diamonds, false}
ThreeDiamonds = Card{THREE_DIAMONDS, 3, 0, Diamonds, false}
FourDiamonds = Card{FOUR_DIAMONDS, 4, 0, Diamonds, false}
SixDiamonds = Card{SIX_DIAMONDS, 6, 0, Diamonds, false}
SevenDiamonds = Card{SEVEN_DIAMONDS, 7, 0, Diamonds, false}
EightDiamonds = Card{EIGHT_DIAMONDS, 8, 0, Diamonds, false}
NineDiamonds = Card{NINE_DIAMONDS, 9, 0, Diamonds, false}
TenDiamonds = Card{TEN_DIAMONDS, 10, 0, Diamonds, false}
QueenDiamonds = Card{QUEEN_DIAMONDS, 12, 0, Diamonds, false}
KingDiamonds = Card{KING_DIAMONDS, 13, 0, Diamonds, false}
AceDiamonds = Card{ACE_DIAMONDS, 1, 0, Diamonds, false}
JackDiamonds = Card{JACK_DIAMONDS, 11, 0, Diamonds, true}
FiveDiamonds = Card{FIVE_DIAMONDS, 5, 0, Diamonds, true}
TenClubs = Card{TEN_CLUBS, 10, 0, Clubs, false}
NineClubs = Card{NINE_CLUBS, 9, 0, Clubs, false}
EightClubs = Card{EIGHT_CLUBS, 8, 0, Clubs, false}
SevenClubs = Card{SEVEN_CLUBS, 7, 0, Clubs, false}
SixClubs = Card{SIX_CLUBS, 6, 0, Clubs, false}
FourClubs = Card{FOUR_CLUBS, 4, 0, Clubs, false}
ThreeClubs = Card{THREE_CLUBS, 3, 0, Clubs, false}
TwoClubs = Card{TWO_CLUBS, 2, 0, Clubs, false}
QueenClubs = Card{QUEEN_CLUBS, 12, 0, Clubs, false}
KingClubs = Card{KING_CLUBS, 13, 0, Clubs, false}
AceClubs = Card{ACE_CLUBS, 1, 0, Clubs, false}
JackClubs = Card{JACK_CLUBS, 11, 0, Clubs, true}
FiveClubs = Card{FIVE_CLUBS, 5, 0, Clubs, true}
TenSpades = Card{TEN_SPADES, 10, 0, Spades, false}
NineSpades = Card{NINE_SPADES, 9, 0, Spades, false}
EightSpades = Card{EIGHT_SPADES, 8, 0, Spades, false}
SevenSpades = Card{SEVEN_SPADES, 7, 0, Spades, false}
SixSpades = Card{SIX_SPADES, 6, 0, Spades, false}
FourSpades = Card{FOUR_SPADES, 4, 0, Spades, false}
ThreeSpades = Card{THREE_SPADES, 3, 0, Spades, false}
TwoSpades = Card{TWO_SPADES, 2, 0, Spades, false}
QueenSpades = Card{QUEEN_SPADES, 12, 0, Spades, false}
KingSpades = Card{KING_SPADES, 13, 0, Spades, false}
AceSpades = Card{ACE_SPADES, 1, 0, Spades, false}
JackSpades = Card{JACK_SPADES, 11, 0, Spades, true}
FiveSpades = Card{FIVE_SPADES, 5, 0, Spades, true}
Joker = Card{JOKER, 0, 0, Wild, true}
)

func (c Card) String() string {
return string(c.NAME)
return string(c.Name)
}
60 changes: 58 additions & 2 deletions pkg/game/game-handler.go
Original file line number Diff line number Diff line change
Expand Up @@ -224,7 +224,7 @@ func (h *Handler) Delete(c *gin.Context) {
// @Security Bearer
// @Param gameId path string true "Game ID"
// @Param call query int true "Call"
// @Success 200 {object} Game
// @Success 200 {object} State
// @Failure 400 {object} api.ErrorResponse
// @Failure 500 {object} api.ErrorResponse
// @Router /game/{gameId}/call [put]
Expand Down Expand Up @@ -261,6 +261,62 @@ func (h *Handler) Call(c *gin.Context) {
c.JSON(http.StatusInternalServerError, api.ErrorResponse{Message: err.Error()})
return
}
state, err := game.GetState(id)
if err != nil {
c.JSON(http.StatusInternalServerError, api.ErrorResponse{Message: err.Error()})
return
}
c.IndentedJSON(http.StatusOK, state)
}

c.IndentedJSON(http.StatusOK, game)
type SelectSuitRequest struct {
Suit Suit `json:"suit"`
Cards []CardName `json:"cards"`
}

// SelectSuit @Summary Select the suit
// @Description When in the Called state, the Goer can select the suit and what cards they want to keep from their hand and the dummy hand
// @Tags Game
// @ID select-suit
// @Produce json
// @Security Bearer
// @Param gameId path string true "Game ID"
// @Para body SelectSuitRequest true "Select Suit Request"
// @Success 200 {object} State
// @Failure 400 {object} api.ErrorResponse
// @Failure 500 {object} api.ErrorResponse
// @Router /game/{gameId}/suit [put]
func (h *Handler) SelectSuit(c *gin.Context) {
// Check the user is correctly authenticated
id, ok := auth.CheckValidated(c)
if !ok {
return
}

// Get the context from the request
ctx := c.Request.Context()

// Get the game ID from the request
gameId := c.Param("gameId")

// Get the request body
var req SelectSuitRequest
if err := c.ShouldBindJSON(&req); err != nil {
c.JSON(http.StatusBadRequest, api.ErrorResponse{Message: err.Error()})
return
}

// Select the suit
game, err := h.S.SelectSuit(ctx, gameId, id, req.Suit, req.Cards)

if err != nil {
c.JSON(http.StatusInternalServerError, api.ErrorResponse{Message: err.Error()})
return
}
state, err := game.GetState(id)
if err != nil {
c.JSON(http.StatusInternalServerError, api.ErrorResponse{Message: err.Error()})
return
}
c.IndentedJSON(http.StatusOK, state)
}
Loading

0 comments on commit 8c7d52b

Please sign in to comment.