Skip to content

Commit e0a88ce

Browse files
authored
Merge pull request #72 from BenMusch/benMuschol-deleteDeck
Add DeleteDeck API
2 parents 70cc319 + 62ac6b1 commit e0a88ce

File tree

7 files changed

+493
-196
lines changed

7 files changed

+493
-196
lines changed

api/rpc/wordvault/api.pb.go

Lines changed: 314 additions & 192 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

api/rpc/wordvault/wordvaultconnect/api.connect.go

Lines changed: 30 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

db/queries/cards.sql

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,14 @@ SET name = $2
2424
WHERE id = $1 AND user_id = $3
2525
RETURNING *;
2626

27+
-- name: CountCardsInDeck :one
28+
SELECT COUNT(*)
29+
FROM wordvault_cards
30+
WHERE COALESCE(deck_id, 0) = sqlc.arg(deck_id)::bigint AND user_id = sqlc.arg(user_id)::bigint;
31+
2732
-- name: DeleteDeck :exec
2833
DELETE FROM wordvault_decks
29-
WHERE id = $1;
34+
WHERE id = $1 AND user_id = $2;
3035

3136
-- name: GetNextScheduled :many
3237
SELECT alphagram, next_scheduled, fsrs_card, COALESCE(deck_id, 0) as deck_id

internal/stores/models/cards.sql.go

Lines changed: 26 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

internal/wordvault/server.go

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1344,6 +1344,41 @@ func (s *Server) EditDeck(ctx context.Context, req *connect.Request[pb.EditDeckR
13441344
}), nil
13451345
}
13461346

1347+
func (s *Server) DeleteDeck(ctx context.Context, req *connect.Request[pb.DeleteDeckRequest]) (
1348+
*connect.Response[pb.DeleteDeckResponse], error) {
1349+
1350+
user := auth.UserFromContext(ctx)
1351+
if user == nil {
1352+
return nil, unauthenticated("user not authenticated")
1353+
}
1354+
1355+
if req.Msg.Id == 0 {
1356+
return nil, invalidArgError("need a deck")
1357+
}
1358+
1359+
cardCount, err := s.Queries.CountCardsInDeck(ctx, models.CountCardsInDeckParams{
1360+
DeckID: req.Msg.Id,
1361+
UserID: int64(user.DBID),
1362+
})
1363+
if err != nil {
1364+
return nil, err
1365+
}
1366+
1367+
if cardCount > 0 {
1368+
return nil, invalidArgError("cannot delete deck with cards in it")
1369+
}
1370+
1371+
err = s.Queries.DeleteDeck(ctx, models.DeleteDeckParams{
1372+
ID: req.Msg.Id,
1373+
UserID: int64(user.DBID),
1374+
})
1375+
if err != nil {
1376+
return nil, err
1377+
}
1378+
1379+
return connect.NewResponse(&pb.DeleteDeckResponse{}), nil
1380+
}
1381+
13471382
// The fsrs library fuzzes only by day. It tends to ask questions at the same
13481383
// hour and minute that they were asked last. We want to add a little bit of a fuzz
13491384
// to allow for more randomness.

internal/wordvault/server_test.go

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2021,3 +2021,78 @@ func TestMoveCardsWithDecks(t *testing.T) {
20212021
}))
20222022
is.True(err != nil) // Should be error
20232023
}
2024+
2025+
func TestDeleteDeck(t *testing.T) {
2026+
is := is.New(t)
2027+
2028+
err := RecreateTestDB()
2029+
if err != nil {
2030+
panic(err)
2031+
}
2032+
ctx := ctxForTests()
2033+
2034+
dbPool, err := pgxpool.New(ctx, testDBURI(true))
2035+
is.NoErr(err)
2036+
defer dbPool.Close()
2037+
2038+
q := models.New(dbPool)
2039+
2040+
s := NewServer(DefaultConfig, dbPool, q, &searchserver.Server{Config: DefaultConfig})
2041+
2042+
deck1, err := s.AddDeck(ctx, connect.NewRequest(&pb.AddDeckRequest{
2043+
Name: "Empty Deck",
2044+
Lexicon: "NWL23",
2045+
}))
2046+
is.NoErr(err)
2047+
deck1ID := deck1.Msg.Deck.Id
2048+
2049+
deck2, err := s.AddDeck(ctx, connect.NewRequest(&pb.AddDeckRequest{
2050+
Name: "Deck With Cards",
2051+
Lexicon: "NWL23",
2052+
}))
2053+
is.NoErr(err)
2054+
deck2ID := deck2.Msg.Deck.Id
2055+
2056+
_, err = s.AddCards(ctx, connect.NewRequest(&pb.AddCardsRequest{
2057+
Lexicon: "NWL23",
2058+
Alphagrams: []string{"ADEEGMMO", "ADEEHMMO"},
2059+
DeckId: uint64(deck2ID),
2060+
}))
2061+
is.NoErr(err)
2062+
2063+
_, err = s.DeleteDeck(ctx, connect.NewRequest(&pb.DeleteDeckRequest{
2064+
Id: 0,
2065+
}))
2066+
is.True(err.Error() == "invalid_argument: need a deck")
2067+
2068+
_, err = s.DeleteDeck(ctx, connect.NewRequest(&pb.DeleteDeckRequest{
2069+
Id: deck2ID,
2070+
}))
2071+
is.True(err.Error() == "invalid_argument: cannot delete deck with cards in it")
2072+
2073+
_, err = s.DeleteDeck(ctx, connect.NewRequest(&pb.DeleteDeckRequest{
2074+
Id: deck1ID,
2075+
}))
2076+
is.NoErr(err)
2077+
2078+
decks, err := s.GetDecks(ctx, connect.NewRequest(&pb.GetDecksRequest{}))
2079+
is.NoErr(err)
2080+
is.Equal(len(decks.Msg.Decks), 1)
2081+
is.Equal(decks.Msg.Decks[0].Id, deck2ID)
2082+
2083+
_, err = s.DeleteFromDeck(ctx, connect.NewRequest(&pb.DeleteFromDeckRequest{
2084+
Lexicon: "NWL23",
2085+
AllQuestions: true,
2086+
DeckId: uint64(deck2ID),
2087+
}))
2088+
is.NoErr(err)
2089+
2090+
_, err = s.DeleteDeck(ctx, connect.NewRequest(&pb.DeleteDeckRequest{
2091+
Id: deck2ID,
2092+
}))
2093+
is.NoErr(err)
2094+
2095+
decks, err = s.GetDecks(ctx, connect.NewRequest(&pb.GetDecksRequest{}))
2096+
is.NoErr(err)
2097+
is.Equal(len(decks.Msg.Decks), 0)
2098+
}

rpc/wordvault/api.proto

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -246,6 +246,12 @@ message EditDeckResponse {
246246
Deck deck = 1;
247247
}
248248

249+
message DeleteDeckRequest {
250+
int64 id = 1;
251+
}
252+
253+
message DeleteDeckResponse {}
254+
249255
message EditFsrsParametersResponse {}
250256

251257
service WordVaultService {
@@ -296,4 +302,5 @@ service WordVaultService {
296302
rpc AddDeck(AddDeckRequest) returns (AddDeckResponse);
297303
rpc GetDecks(GetDecksRequest) returns (GetDecksResponse);
298304
rpc EditDeck(EditDeckRequest) returns (EditDeckResponse);
305+
rpc DeleteDeck(DeleteDeckRequest) returns (DeleteDeckResponse);
299306
}

0 commit comments

Comments
 (0)