fizzy-cli 0.4.0 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/CHANGELOG.md +42 -0
  2. package/cmd/board_create.go +15 -16
  3. package/cmd/board_create_test.go +0 -17
  4. package/cmd/card_create.go +24 -25
  5. package/cmd/card_create_test.go +20 -40
  6. package/cmd/card_update.go +30 -21
  7. package/cmd/card_update_test.go +28 -24
  8. package/cmd/column_create.go +11 -12
  9. package/cmd/column_create_test.go +3 -21
  10. package/cmd/comment.go +14 -0
  11. package/cmd/comment_create.go +51 -0
  12. package/cmd/comment_create_test.go +129 -0
  13. package/cmd/comment_delete.go +46 -0
  14. package/cmd/comment_delete_test.go +92 -0
  15. package/cmd/comment_list.go +51 -0
  16. package/cmd/comment_list_test.go +132 -0
  17. package/cmd/comment_show.go +46 -0
  18. package/cmd/comment_show_test.go +104 -0
  19. package/cmd/comment_update.go +51 -0
  20. package/cmd/comment_update_test.go +130 -0
  21. package/cmd/reaction.go +13 -0
  22. package/cmd/reaction_create.go +46 -0
  23. package/cmd/reaction_create_test.go +113 -0
  24. package/cmd/reaction_delete.go +46 -0
  25. package/cmd/reaction_delete_test.go +92 -0
  26. package/cmd/reaction_list.go +51 -0
  27. package/cmd/reaction_list_test.go +125 -0
  28. package/cmd/step.go +14 -0
  29. package/cmd/step_create.go +53 -0
  30. package/cmd/step_create_test.go +171 -0
  31. package/cmd/step_delete.go +46 -0
  32. package/cmd/step_delete_test.go +92 -0
  33. package/cmd/step_update.go +66 -0
  34. package/cmd/step_update_test.go +190 -0
  35. package/internal/api/boards.go +59 -0
  36. package/internal/api/cards.go +288 -0
  37. package/internal/api/client.go +5 -644
  38. package/internal/api/columns.go +50 -0
  39. package/internal/api/comments.go +99 -0
  40. package/internal/api/identity.go +24 -0
  41. package/internal/api/notifications.go +89 -0
  42. package/internal/api/reactions.go +61 -0
  43. package/internal/api/steps.go +93 -0
  44. package/internal/api/tags.go +24 -0
  45. package/internal/api/types.go +178 -0
  46. package/internal/ui/comment_list.go +25 -0
  47. package/internal/ui/reaction_list.go +14 -0
  48. package/package.json +1 -1
  49. package/IMPLEMENTATION_PLAN.md +0 -338
@@ -0,0 +1,288 @@
1
+ package api
2
+
3
+ import (
4
+ "context"
5
+ "fmt"
6
+ "net/http"
7
+ )
8
+
9
+ func (c *Client) GetCards(ctx context.Context, filters CardFilters) ([]Card, error) {
10
+ endpointURL := c.AccountBaseURL + "/cards"
11
+
12
+ req, err := c.newRequest(ctx, http.MethodGet, endpointURL, nil)
13
+ if err != nil {
14
+ return nil, fmt.Errorf("failed to create get cards request: %w", err)
15
+ }
16
+
17
+ if len(filters.BoardIDs) > 0 {
18
+ q := req.URL.Query()
19
+ for _, boardID := range filters.BoardIDs {
20
+ q.Add("board_ids[]", boardID)
21
+ }
22
+ req.URL.RawQuery = q.Encode()
23
+ }
24
+
25
+ var response []Card
26
+ _, err = c.decodeResponse(req, &response)
27
+ if err != nil {
28
+ return nil, err
29
+ }
30
+
31
+ return response, nil
32
+ }
33
+
34
+ func (c *Client) GetCard(ctx context.Context, cardNumber int) (*Card, error) {
35
+ endpointURL := fmt.Sprintf("%s/cards/%d", c.AccountBaseURL, cardNumber)
36
+
37
+ req, err := c.newRequest(ctx, http.MethodGet, endpointURL, nil)
38
+ if err != nil {
39
+ return nil, fmt.Errorf("failed to create get card by id request: %w", err)
40
+ }
41
+
42
+ var response Card
43
+ _, err = c.decodeResponse(req, &response)
44
+ if err != nil {
45
+ return nil, err
46
+ }
47
+
48
+ return &response, nil
49
+ }
50
+
51
+ func (c *Client) PostCards(ctx context.Context, payload CreateCardPayload) (bool, error) {
52
+ if c.BoardBaseURL == "" {
53
+ return false, fmt.Errorf("please select a board first with 'fizzy use --board <board_name>'")
54
+ }
55
+
56
+ endpointURL := c.BoardBaseURL + "/cards"
57
+
58
+ body := map[string]CreateCardPayload{"card": payload}
59
+
60
+ req, err := c.newRequest(ctx, http.MethodPost, endpointURL, body)
61
+ if err != nil {
62
+ return false, fmt.Errorf("failed to create card request: %w", err)
63
+ }
64
+
65
+ _, err = c.decodeResponse(req, nil, http.StatusCreated)
66
+ if err != nil {
67
+ return false, err
68
+ }
69
+
70
+ return true, nil
71
+ }
72
+
73
+ func (c *Client) PutCard(ctx context.Context, cardNumber int, payload UpdateCardPayload) (*Card, error) {
74
+ endpointURL := fmt.Sprintf("%s/cards/%d", c.AccountBaseURL, cardNumber)
75
+
76
+ body := map[string]UpdateCardPayload{"card": payload}
77
+
78
+ req, err := c.newRequest(ctx, http.MethodPut, endpointURL, body)
79
+ if err != nil {
80
+ return nil, fmt.Errorf("failed to create update card request: %w", err)
81
+ }
82
+
83
+ var response Card
84
+ _, err = c.decodeResponse(req, &response, http.StatusOK)
85
+ if err != nil {
86
+ return nil, err
87
+ }
88
+
89
+ return &response, nil
90
+ }
91
+
92
+ func (c *Client) DeleteCard(ctx context.Context, cardNumber int) (bool, error) {
93
+ endpointURL := fmt.Sprintf("%s/cards/%d", c.AccountBaseURL, cardNumber)
94
+
95
+ req, err := c.newRequest(ctx, http.MethodDelete, endpointURL, nil)
96
+ if err != nil {
97
+ return false, fmt.Errorf("failed to create delete card request: %w", err)
98
+ }
99
+
100
+ _, err = c.decodeResponse(req, nil, http.StatusNoContent)
101
+ if err != nil {
102
+ return false, err
103
+ }
104
+
105
+ return true, nil
106
+ }
107
+
108
+ func (c *Client) PostCardsClosure(ctx context.Context, cardNumber int) (bool, error) {
109
+ endpointURL := fmt.Sprintf("%s/cards/%d/closure", c.AccountBaseURL, cardNumber)
110
+
111
+ req, err := c.newRequest(ctx, http.MethodPost, endpointURL, nil)
112
+ if err != nil {
113
+ return false, fmt.Errorf("failed to create closure card request: %w", err)
114
+ }
115
+
116
+ _, err = c.decodeResponse(req, nil, http.StatusNoContent)
117
+ if err != nil {
118
+ return false, err
119
+ }
120
+
121
+ return true, nil
122
+ }
123
+
124
+ func (c *Client) PostCardNotNow(ctx context.Context, cardNumber int) (bool, error) {
125
+ endpointURL := fmt.Sprintf("%s/cards/%d/not_now", c.AccountBaseURL, cardNumber)
126
+
127
+ req, err := c.newRequest(ctx, http.MethodPost, endpointURL, nil)
128
+ if err != nil {
129
+ return false, fmt.Errorf("failed to create post not now request: %w", err)
130
+ }
131
+
132
+ _, err = c.decodeResponse(req, nil, http.StatusNoContent)
133
+ if err != nil {
134
+ return false, err
135
+ }
136
+
137
+ return true, nil
138
+ }
139
+
140
+ func (c *Client) PostCardTriage(ctx context.Context, cardNumber int, columnID string) (bool, error) {
141
+ endpointURL := fmt.Sprintf("%s/cards/%d/triage", c.AccountBaseURL, cardNumber)
142
+
143
+ body := map[string]any{"column_id": columnID}
144
+
145
+ req, err := c.newRequest(ctx, http.MethodPost, endpointURL, body)
146
+ if err != nil {
147
+ return false, fmt.Errorf("failed to create post triage request: %w", err)
148
+ }
149
+
150
+ _, err = c.decodeResponse(req, nil, http.StatusNoContent)
151
+ if err != nil {
152
+ return false, err
153
+ }
154
+
155
+ return true, nil
156
+ }
157
+
158
+ func (c *Client) DeleteCardTriage(ctx context.Context, cardNumber int) (bool, error) {
159
+ endpointURL := fmt.Sprintf("%s/cards/%d/triage", c.AccountBaseURL, cardNumber)
160
+
161
+ req, err := c.newRequest(ctx, http.MethodDelete, endpointURL, nil)
162
+ if err != nil {
163
+ return false, fmt.Errorf("failed to create delete triage request: %w", err)
164
+ }
165
+
166
+ _, err = c.decodeResponse(req, nil, http.StatusNoContent)
167
+ if err != nil {
168
+ return false, err
169
+ }
170
+
171
+ return true, nil
172
+ }
173
+
174
+ func (c *Client) PostCardWatch(ctx context.Context, cardNumber int) (bool, error) {
175
+ endpointURL := fmt.Sprintf("%s/cards/%d/watch", c.AccountBaseURL, cardNumber)
176
+
177
+ req, err := c.newRequest(ctx, http.MethodPost, endpointURL, nil)
178
+ if err != nil {
179
+ return false, fmt.Errorf("failed to create post watch request: %w", err)
180
+ }
181
+
182
+ _, err = c.decodeResponse(req, nil, http.StatusNoContent)
183
+ if err != nil {
184
+ return false, err
185
+ }
186
+
187
+ return true, nil
188
+ }
189
+
190
+ func (c *Client) DeleteCardWatch(ctx context.Context, cardNumber int) (bool, error) {
191
+ endpointURL := fmt.Sprintf("%s/cards/%d/watch", c.AccountBaseURL, cardNumber)
192
+
193
+ req, err := c.newRequest(ctx, http.MethodDelete, endpointURL, nil)
194
+ if err != nil {
195
+ return false, fmt.Errorf("failed to create delete watch request: %w", err)
196
+ }
197
+
198
+ _, err = c.decodeResponse(req, nil, http.StatusNoContent)
199
+ if err != nil {
200
+ return false, err
201
+ }
202
+
203
+ return true, nil
204
+ }
205
+
206
+ func (c *Client) PostCardGoldenness(ctx context.Context, cardNumber int) (bool, error) {
207
+ endpointURL := fmt.Sprintf("%s/cards/%d/goldness", c.AccountBaseURL, cardNumber)
208
+
209
+ req, err := c.newRequest(ctx, http.MethodPost, endpointURL, nil)
210
+ if err != nil {
211
+ return false, fmt.Errorf("failed to create post goldness request: %w", err)
212
+ }
213
+
214
+ _, err = c.decodeResponse(req, nil, http.StatusNoContent)
215
+ if err != nil {
216
+ return false, err
217
+ }
218
+
219
+ return true, nil
220
+ }
221
+
222
+ func (c *Client) DeleteCardGoldenness(ctx context.Context, cardNumber int) (bool, error) {
223
+ endpointURL := fmt.Sprintf("%s/cards/%d/goldness", c.AccountBaseURL, cardNumber)
224
+
225
+ req, err := c.newRequest(ctx, http.MethodDelete, endpointURL, nil)
226
+ if err != nil {
227
+ return false, fmt.Errorf("failed to create delete goldness request: %w", err)
228
+ }
229
+
230
+ _, err = c.decodeResponse(req, nil, http.StatusNoContent)
231
+ if err != nil {
232
+ return false, err
233
+ }
234
+
235
+ return true, nil
236
+ }
237
+
238
+ func (c *Client) DeleteCardsClosure(ctx context.Context, cardNumber int) (bool, error) {
239
+ endpointURL := fmt.Sprintf("%s/cards/%d/closure", c.AccountBaseURL, cardNumber)
240
+
241
+ req, err := c.newRequest(ctx, http.MethodDelete, endpointURL, nil)
242
+ if err != nil {
243
+ return false, fmt.Errorf("failed to create delete closure card request: %w", err)
244
+ }
245
+
246
+ _, err = c.decodeResponse(req, nil, http.StatusNoContent)
247
+ if err != nil {
248
+ return false, err
249
+ }
250
+
251
+ return true, nil
252
+ }
253
+
254
+ func (c *Client) PostCardAssignments(ctx context.Context, cardNumber int, userID string) (bool, error) {
255
+ endpointURL := fmt.Sprintf("%s/cards/%d/assignments", c.AccountBaseURL, cardNumber)
256
+
257
+ body := map[string]string{"assignee_id": userID}
258
+
259
+ req, err := c.newRequest(ctx, http.MethodPost, endpointURL, body)
260
+ if err != nil {
261
+ return false, fmt.Errorf("failed to create assignment request: %w", err)
262
+ }
263
+
264
+ _, err = c.decodeResponse(req, nil, http.StatusNoContent)
265
+ if err != nil {
266
+ return false, err
267
+ }
268
+
269
+ return true, nil
270
+ }
271
+
272
+ func (c *Client) PostCardTagging(ctx context.Context, cardNumber int, tagTitle string) (bool, error) {
273
+ endpointURL := fmt.Sprintf("%s/cards/%d/taggings", c.AccountBaseURL, cardNumber)
274
+
275
+ body := map[string]string{"tag_title": tagTitle}
276
+
277
+ req, err := c.newRequest(ctx, http.MethodPost, endpointURL, body)
278
+ if err != nil {
279
+ return false, fmt.Errorf("failed to create tagging request: %w", err)
280
+ }
281
+
282
+ _, err = c.decodeResponse(req, nil, http.StatusNoContent)
283
+ if err != nil {
284
+ return false, err
285
+ }
286
+
287
+ return true, nil
288
+ }