/
tx_play_dessert.go
93 lines (78 loc) · 2.4 KB
/
tx_play_dessert.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
package db
import (
"context"
"fmt"
"log"
)
type PlayDessertTxParams struct {
PlayerGameID int64
DessertName string
Cards []Card
SpecialCardUsed bool
Score int32
}
// Handles the database transactions related to playing a dessert
func (store *SQLStore) PlayDessertTx(ctx context.Context, arg PlayDessertTxParams) (PlayerGame, error) {
var updatedPlayerGame PlayerGame
err := store.execTx(ctx, func(q *Queries) error {
var err error
// Record each card played and remove from hand
for _, card := range arg.Cards {
err = q.RecordPlayedCard(ctx, RecordPlayedCardParams{
PlayerGameID: arg.PlayerGameID,
CardID: card.CardID,
})
if err != nil {
return fmt.Errorf("error recording card played: %w", err)
}
err = q.RemoveCardFromPlayerHand(ctx, RemoveCardFromPlayerHandParams{
PlayerGameID: arg.PlayerGameID,
CardID: card.CardID,
})
if err != nil {
return fmt.Errorf("error removing card from hand: %w", err)
}
}
// Get the DessertID
dessert, err := q.GetDessertByName(ctx, arg.DessertName)
if err != nil {
return fmt.Errorf("error fetching dessert: %w", err)
}
// Record the Dessert being played
err = q.RecordDessertPlayed(ctx, RecordDessertPlayedParams{
PlayerGameID: arg.PlayerGameID,
DessertID: dessert.DessertID,
})
if err != nil {
return fmt.Errorf("error recording dessert played: %w", err)
}
// Update dessert played status
err = q.UpdateDessertPlayedStatus(ctx, arg.PlayerGameID)
if err != nil {
log.Printf("Error updating dessert played status: %v", err)
}
// Get Player's current game info to access their current score
currPlayer, err := q.GetPlayerGame(ctx, arg.PlayerGameID)
if err != nil {
return fmt.Errorf("error getting player's previous score: %w", err)
}
//Update player's score
updatedPlayerGame, err = q.UpdatePlayerScore(ctx, UpdatePlayerScoreParams{
PlayerGameID: arg.PlayerGameID,
PlayerScore: currPlayer.PlayerScore + arg.Score,
})
if err != nil {
return fmt.Errorf("error updating player's score: %w", err)
}
// Set Dessert Played for this turn to true
err = q.UpdateDessertPlayedStatus(ctx, arg.PlayerGameID)
if err != nil {
return fmt.Errorf("error updating player's dessert played status: %w", err)
}
return nil
})
if err != nil {
log.Printf("error with tx in RegisterTx: %v", err)
}
return updatedPlayerGame, err
}