convex-feedback 0.1.4 → 0.2.0-beta.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 (79) hide show
  1. package/README.md +87 -27
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/client/api.d.ts +80 -1
  4. package/dist/client/api.d.ts.map +1 -1
  5. package/dist/client/config.d.ts +1 -1
  6. package/dist/client/index.d.ts +9 -5
  7. package/dist/client/index.d.ts.map +1 -1
  8. package/dist/client/index.js +261 -8
  9. package/dist/client/index.js.map +1 -1
  10. package/dist/component/_generated/api.d.ts +8 -0
  11. package/dist/component/_generated/api.d.ts.map +1 -1
  12. package/dist/component/_generated/api.js.map +1 -1
  13. package/dist/component/_generated/component.d.ts +295 -5
  14. package/dist/component/_generated/component.d.ts.map +1 -1
  15. package/dist/component/admin.d.ts +130 -0
  16. package/dist/component/admin.d.ts.map +1 -0
  17. package/dist/component/admin.js +125 -0
  18. package/dist/component/admin.js.map +1 -0
  19. package/dist/component/comments.d.ts +7 -5
  20. package/dist/component/comments.d.ts.map +1 -1
  21. package/dist/component/comments.js +4 -3
  22. package/dist/component/comments.js.map +1 -1
  23. package/dist/component/crons.d.ts +3 -0
  24. package/dist/component/crons.d.ts.map +1 -0
  25. package/dist/component/crons.js +8 -0
  26. package/dist/component/crons.js.map +1 -0
  27. package/dist/component/entries.d.ts +29 -16
  28. package/dist/component/entries.d.ts.map +1 -1
  29. package/dist/component/entries.js +136 -12
  30. package/dist/component/entries.js.map +1 -1
  31. package/dist/component/helpers.d.ts +3 -1
  32. package/dist/component/helpers.d.ts.map +1 -1
  33. package/dist/component/helpers.js +28 -0
  34. package/dist/component/helpers.js.map +1 -1
  35. package/dist/component/migrations.d.ts +11 -0
  36. package/dist/component/migrations.d.ts.map +1 -0
  37. package/dist/component/migrations.js +35 -0
  38. package/dist/component/migrations.js.map +1 -0
  39. package/dist/component/model.d.ts +144 -24
  40. package/dist/component/model.d.ts.map +1 -1
  41. package/dist/component/model.js +34 -1
  42. package/dist/component/model.js.map +1 -1
  43. package/dist/component/roadmap.d.ts +166 -0
  44. package/dist/component/roadmap.d.ts.map +1 -0
  45. package/dist/component/roadmap.js +534 -0
  46. package/dist/component/roadmap.js.map +1 -0
  47. package/dist/component/schema.d.ts +67 -5
  48. package/dist/component/schema.d.ts.map +1 -1
  49. package/dist/component/schema.js +57 -2
  50. package/dist/component/schema.js.map +1 -1
  51. package/dist/component/tags.d.ts +58 -0
  52. package/dist/component/tags.d.ts.map +1 -0
  53. package/dist/component/tags.js +216 -0
  54. package/dist/component/tags.js.map +1 -0
  55. package/dist/react/index.d.ts +173 -12
  56. package/dist/react/index.d.ts.map +1 -1
  57. package/dist/react/index.js +78 -1
  58. package/dist/react/index.js.map +1 -1
  59. package/dist/test.d.ts +67 -5
  60. package/dist/test.d.ts.map +1 -1
  61. package/package.json +6 -2
  62. package/src/client/README.md +1 -1
  63. package/src/client/api.ts +183 -0
  64. package/src/client/config.ts +1 -1
  65. package/src/client/index.ts +340 -13
  66. package/src/component/README.md +3 -1
  67. package/src/component/_generated/api.ts +8 -0
  68. package/src/component/_generated/component.ts +373 -9
  69. package/src/component/admin.ts +180 -0
  70. package/src/component/comments.ts +5 -2
  71. package/src/component/crons.ts +16 -0
  72. package/src/component/entries.ts +175 -11
  73. package/src/component/helpers.ts +44 -1
  74. package/src/component/migrations.ts +44 -0
  75. package/src/component/model.ts +79 -4
  76. package/src/component/roadmap.ts +627 -0
  77. package/src/component/schema.ts +61 -1
  78. package/src/react/README.md +2 -2
  79. package/src/react/index.ts +152 -4
@@ -0,0 +1,534 @@
1
+ import { paginationOptsValidator, paginationResultValidator, } from "convex/server";
2
+ import { ConvexError, v } from "convex/values";
3
+ import { internal } from "./_generated/api.js";
4
+ import { internalMutation, mutation, query } from "./_generated/server.js";
5
+ import { normalizeRequiredText, serializeEntry, serializeRoadmapItem, } from "./helpers.js";
6
+ import { actorValidator, actorIsAdmin, publicEntryValidator, roadmapItemValidator, roadmapStatusValidator, } from "./model.js";
7
+ const POSITION_STEP = 1_000_000;
8
+ const REBALANCE_GAP_THRESHOLD = 10;
9
+ const rebalanceBatchSize = 100;
10
+ const deletionBatchSize = 100;
11
+ function assertAdmin(actor) {
12
+ if (!actorIsAdmin(actor))
13
+ throw new ConvexError("Admin access is required.");
14
+ }
15
+ function optionalDescription(value) {
16
+ const description = value?.trim();
17
+ if (description === undefined || description.length === 0)
18
+ return undefined;
19
+ if (description.length > 2_000) {
20
+ throw new ConvexError("Description must be 2000 characters or fewer.");
21
+ }
22
+ return description;
23
+ }
24
+ async function getRebalanceState(ctx, status) {
25
+ return await ctx.db
26
+ .query("roadmapRebalances")
27
+ .withIndex("by_status", (q) => q.eq("status", status))
28
+ .first();
29
+ }
30
+ async function resetRebalance(ctx, statuses) {
31
+ for (const status of new Set(statuses)) {
32
+ const state = await getRebalanceState(ctx, status);
33
+ if (state !== null &&
34
+ (state.activeGeneration !== undefined ||
35
+ state.visibleGeneration !== undefined)) {
36
+ await ctx.db.patch("roadmapRebalances", state._id, {
37
+ activeGeneration: undefined,
38
+ visibleGeneration: undefined,
39
+ });
40
+ }
41
+ }
42
+ }
43
+ async function assertNoRebalancePromotion(ctx, statuses) {
44
+ for (const status of new Set(statuses)) {
45
+ const state = await getRebalanceState(ctx, status);
46
+ if (state?.activeGeneration !== undefined &&
47
+ state.activeGeneration === state.visibleGeneration) {
48
+ throw new ConvexError("Roadmap is being rebalanced. Please retry.");
49
+ }
50
+ }
51
+ }
52
+ async function scheduleRebalance(ctx, status) {
53
+ const state = await getRebalanceState(ctx, status);
54
+ const generationNumber = (state?.nextGeneration ?? 0) + 1;
55
+ const rebalanceId = String(generationNumber);
56
+ if (state === null) {
57
+ await ctx.db.insert("roadmapRebalances", {
58
+ status,
59
+ nextGeneration: generationNumber,
60
+ activeGeneration: rebalanceId,
61
+ });
62
+ }
63
+ else {
64
+ await ctx.db.patch("roadmapRebalances", state._id, {
65
+ nextGeneration: generationNumber,
66
+ activeGeneration: rebalanceId,
67
+ });
68
+ }
69
+ await ctx.scheduler.runAfter(0, internal.roadmap.rebalanceBatch, {
70
+ status,
71
+ rebalanceId,
72
+ phase: "mark",
73
+ paginationOpts: { cursor: null, numItems: rebalanceBatchSize },
74
+ offset: 0,
75
+ });
76
+ }
77
+ export const list = query({
78
+ args: {
79
+ paginationOpts: paginationOptsValidator,
80
+ status: v.optional(roadmapStatusValidator),
81
+ },
82
+ returns: paginationResultValidator(roadmapItemValidator),
83
+ handler: async (ctx, args) => {
84
+ const status = args.status;
85
+ const state = status === undefined ? null : await getRebalanceState(ctx, status);
86
+ const visibleGeneration = state?.visibleGeneration;
87
+ const roadmapQuery = status !== undefined && visibleGeneration !== undefined
88
+ ? ctx.db
89
+ .query("roadmap")
90
+ .withIndex("by_status_deleting_at_rebalance_id_position", (q) => q
91
+ .eq("status", status)
92
+ .eq("deletingAt", undefined)
93
+ .eq("rebalanceId", visibleGeneration))
94
+ : status === undefined
95
+ ? ctx.db
96
+ .query("roadmap")
97
+ .withIndex("by_deleting_at_and_position", (q) => q.eq("deletingAt", undefined))
98
+ : ctx.db
99
+ .query("roadmap")
100
+ .withIndex("by_status_deleting_at_position", (q) => q.eq("status", status).eq("deletingAt", undefined));
101
+ const result = await roadmapQuery.paginate(args.paginationOpts);
102
+ return {
103
+ ...result,
104
+ page: result.page.map((item) => serializeRoadmapItem(item, visibleGeneration === undefined ? undefined : item.rebalancePosition)),
105
+ };
106
+ },
107
+ });
108
+ export const search = query({
109
+ args: { searchQuery: v.string(), limit: v.number() },
110
+ returns: v.array(roadmapItemValidator),
111
+ handler: async (ctx, args) => {
112
+ const searchQuery = args.searchQuery.trim();
113
+ if (searchQuery.length === 0 || args.limit <= 0)
114
+ return [];
115
+ const items = await ctx.db
116
+ .query("roadmap")
117
+ .withSearchIndex("search_title", (q) => q.search("title", searchQuery).eq("deletingAt", undefined))
118
+ .take(Math.min(Math.floor(args.limit), 50));
119
+ return items.map(serializeRoadmapItem);
120
+ },
121
+ });
122
+ async function createRoadmapRecord(ctx, args) {
123
+ await assertNoRebalancePromotion(ctx, [args.status]);
124
+ await resetRebalance(ctx, [args.status]);
125
+ const last = await ctx.db
126
+ .query("roadmap")
127
+ .withIndex("by_status_and_position", (q) => q.eq("status", args.status))
128
+ .order("desc")
129
+ .first();
130
+ const description = optionalDescription(args.description);
131
+ const now = Date.now();
132
+ return await ctx.db.insert("roadmap", {
133
+ title: normalizeRequiredText(args.title, "Roadmap title", 160),
134
+ ...(description === undefined ? {} : { description }),
135
+ status: args.status,
136
+ position: (last?.position ?? 0) + POSITION_STEP,
137
+ feedbackCount: 0,
138
+ createdAt: now,
139
+ updatedAt: now,
140
+ });
141
+ }
142
+ export const create = mutation({
143
+ args: {
144
+ actor: actorValidator,
145
+ title: v.string(),
146
+ description: v.optional(v.string()),
147
+ status: roadmapStatusValidator,
148
+ },
149
+ returns: v.id("roadmap"),
150
+ handler: async (ctx, args) => {
151
+ assertAdmin(args.actor);
152
+ return await createRoadmapRecord(ctx, args);
153
+ },
154
+ });
155
+ export const update = mutation({
156
+ args: {
157
+ actor: actorValidator,
158
+ roadmapId: v.id("roadmap"),
159
+ title: v.string(),
160
+ description: v.optional(v.string()),
161
+ },
162
+ returns: v.null(),
163
+ handler: async (ctx, args) => {
164
+ assertAdmin(args.actor);
165
+ const item = await ctx.db.get("roadmap", args.roadmapId);
166
+ if (item === null) {
167
+ throw new ConvexError("Roadmap item not found.");
168
+ }
169
+ if (item.deletingAt !== undefined) {
170
+ throw new ConvexError("Roadmap item is being deleted.");
171
+ }
172
+ await ctx.db.patch("roadmap", args.roadmapId, {
173
+ title: normalizeRequiredText(args.title, "Roadmap title", 160),
174
+ description: optionalDescription(args.description),
175
+ updatedAt: Date.now(),
176
+ });
177
+ return null;
178
+ },
179
+ });
180
+ export const move = mutation({
181
+ args: {
182
+ actor: actorValidator,
183
+ roadmapId: v.id("roadmap"),
184
+ status: roadmapStatusValidator,
185
+ previousItemId: v.optional(v.id("roadmap")),
186
+ nextItemId: v.optional(v.id("roadmap")),
187
+ },
188
+ returns: v.number(),
189
+ handler: async (ctx, args) => {
190
+ assertAdmin(args.actor);
191
+ const [item, previous, next] = await Promise.all([
192
+ ctx.db.get("roadmap", args.roadmapId),
193
+ args.previousItemId === undefined
194
+ ? null
195
+ : ctx.db.get("roadmap", args.previousItemId),
196
+ args.nextItemId === undefined
197
+ ? null
198
+ : ctx.db.get("roadmap", args.nextItemId),
199
+ ]);
200
+ if (item === null)
201
+ throw new ConvexError("Roadmap item not found.");
202
+ if (args.previousItemId === args.roadmapId ||
203
+ args.nextItemId === args.roadmapId) {
204
+ throw new ConvexError("Roadmap item cannot be its own neighbor.");
205
+ }
206
+ if (args.previousItemId !== undefined && previous === null) {
207
+ throw new ConvexError("Previous roadmap item not found.");
208
+ }
209
+ if (args.nextItemId !== undefined && next === null) {
210
+ throw new ConvexError("Next roadmap item not found.");
211
+ }
212
+ if (item.deletingAt !== undefined) {
213
+ throw new ConvexError("Roadmap item is being deleted.");
214
+ }
215
+ if (previous !== null && previous.status !== args.status) {
216
+ throw new ConvexError("Previous item is not in the target stage.");
217
+ }
218
+ if (next !== null && next.status !== args.status) {
219
+ throw new ConvexError("Next item is not in the target stage.");
220
+ }
221
+ if (previous !== null &&
222
+ next !== null &&
223
+ previous.position >= next.position) {
224
+ throw new ConvexError("Roadmap neighbors are out of order.");
225
+ }
226
+ await assertNoRebalancePromotion(ctx, [item.status, args.status]);
227
+ await resetRebalance(ctx, [item.status, args.status]);
228
+ const previousPosition = previous?.position;
229
+ const nextPosition = next?.position;
230
+ const shouldScheduleRebalance = previous !== null &&
231
+ next !== null &&
232
+ next.position - previous.position <= REBALANCE_GAP_THRESHOLD;
233
+ let position;
234
+ if (previousPosition !== undefined && nextPosition !== undefined) {
235
+ position = previousPosition + (nextPosition - previousPosition) / 2;
236
+ }
237
+ else if (previousPosition !== undefined) {
238
+ position = previousPosition + POSITION_STEP;
239
+ }
240
+ else if (nextPosition !== undefined) {
241
+ position = nextPosition - POSITION_STEP;
242
+ }
243
+ else {
244
+ const last = await ctx.db
245
+ .query("roadmap")
246
+ .withIndex("by_status_and_position", (q) => q.eq("status", args.status))
247
+ .order("desc")
248
+ .first();
249
+ position = (last?.position ?? 0) + POSITION_STEP;
250
+ }
251
+ await ctx.db.patch("roadmap", args.roadmapId, {
252
+ status: args.status,
253
+ position,
254
+ rebalanceId: undefined,
255
+ rebalanceRank: undefined,
256
+ rebalancePosition: undefined,
257
+ updatedAt: Date.now(),
258
+ });
259
+ if (shouldScheduleRebalance) {
260
+ await scheduleRebalance(ctx, args.status);
261
+ }
262
+ return position;
263
+ },
264
+ });
265
+ export const rebalanceBatch = internalMutation({
266
+ args: {
267
+ status: roadmapStatusValidator,
268
+ rebalanceId: v.string(),
269
+ phase: v.union(v.literal("mark"), v.literal("rewrite"), v.literal("promote")),
270
+ paginationOpts: paginationOptsValidator,
271
+ offset: v.number(),
272
+ },
273
+ returns: v.null(),
274
+ handler: async (ctx, args) => {
275
+ const state = await getRebalanceState(ctx, args.status);
276
+ if (state?.activeGeneration !== args.rebalanceId)
277
+ return null;
278
+ if (args.phase === "mark") {
279
+ const result = await ctx.db
280
+ .query("roadmap")
281
+ .withIndex("by_status_deleting_at_position", (q) => q.eq("status", args.status).eq("deletingAt", undefined))
282
+ .order("asc")
283
+ .paginate(args.paginationOpts);
284
+ for (const [index, item] of result.page.entries()) {
285
+ await ctx.db.patch("roadmap", item._id, {
286
+ rebalanceId: args.rebalanceId,
287
+ rebalanceRank: args.offset + index,
288
+ rebalancePosition: undefined,
289
+ });
290
+ }
291
+ if (result.isDone) {
292
+ await ctx.scheduler.runAfter(0, internal.roadmap.rebalanceBatch, {
293
+ status: args.status,
294
+ rebalanceId: args.rebalanceId,
295
+ phase: "rewrite",
296
+ paginationOpts: { cursor: null, numItems: rebalanceBatchSize },
297
+ offset: 0,
298
+ });
299
+ }
300
+ else {
301
+ await ctx.scheduler.runAfter(0, internal.roadmap.rebalanceBatch, {
302
+ status: args.status,
303
+ rebalanceId: args.rebalanceId,
304
+ phase: "mark",
305
+ paginationOpts: {
306
+ cursor: result.continueCursor,
307
+ numItems: rebalanceBatchSize,
308
+ },
309
+ offset: args.offset + result.page.length,
310
+ });
311
+ }
312
+ return null;
313
+ }
314
+ const result = await ctx.db
315
+ .query("roadmap")
316
+ .withIndex("by_status_rebalance_rank", (q) => q.eq("status", args.status).eq("rebalanceId", args.rebalanceId))
317
+ .order("asc")
318
+ .paginate(args.paginationOpts);
319
+ for (const [index, item] of result.page.entries()) {
320
+ const position = (args.offset + index + 1) * POSITION_STEP;
321
+ if (args.phase === "rewrite") {
322
+ await ctx.db.patch("roadmap", item._id, {
323
+ rebalancePosition: position,
324
+ });
325
+ }
326
+ else {
327
+ if (item.rebalancePosition === undefined) {
328
+ throw new ConvexError("Roadmap rebalance is incomplete.");
329
+ }
330
+ await ctx.db.patch("roadmap", item._id, {
331
+ position: item.rebalancePosition,
332
+ });
333
+ }
334
+ }
335
+ if (!result.isDone) {
336
+ await ctx.scheduler.runAfter(0, internal.roadmap.rebalanceBatch, {
337
+ status: args.status,
338
+ rebalanceId: args.rebalanceId,
339
+ phase: args.phase,
340
+ paginationOpts: {
341
+ cursor: result.continueCursor,
342
+ numItems: rebalanceBatchSize,
343
+ },
344
+ offset: args.offset + result.page.length,
345
+ });
346
+ }
347
+ else if (args.phase === "rewrite") {
348
+ await ctx.db.patch("roadmapRebalances", state._id, {
349
+ visibleGeneration: args.rebalanceId,
350
+ });
351
+ await ctx.scheduler.runAfter(0, internal.roadmap.rebalanceBatch, {
352
+ status: args.status,
353
+ rebalanceId: args.rebalanceId,
354
+ phase: "promote",
355
+ paginationOpts: { cursor: null, numItems: rebalanceBatchSize },
356
+ offset: 0,
357
+ });
358
+ }
359
+ else {
360
+ await ctx.db.patch("roadmapRebalances", state._id, {
361
+ activeGeneration: undefined,
362
+ visibleGeneration: undefined,
363
+ });
364
+ }
365
+ return null;
366
+ },
367
+ });
368
+ export const remove = mutation({
369
+ args: { actor: actorValidator, roadmapId: v.id("roadmap") },
370
+ returns: v.null(),
371
+ handler: async (ctx, args) => {
372
+ assertAdmin(args.actor);
373
+ const item = await ctx.db.get("roadmap", args.roadmapId);
374
+ if (item === null || item.deletingAt !== undefined)
375
+ return null;
376
+ await assertNoRebalancePromotion(ctx, [item.status]);
377
+ await resetRebalance(ctx, [item.status]);
378
+ await ctx.db.patch("roadmap", args.roadmapId, { deletingAt: Date.now() });
379
+ await ctx.scheduler.runAfter(0, internal.roadmap.removeBatch, {
380
+ roadmapId: args.roadmapId,
381
+ });
382
+ return null;
383
+ },
384
+ });
385
+ export const removeBatch = internalMutation({
386
+ args: { roadmapId: v.id("roadmap") },
387
+ returns: v.object({ processed: v.number(), hasMore: v.boolean() }),
388
+ handler: async (ctx, args) => {
389
+ const item = await ctx.db.get("roadmap", args.roadmapId);
390
+ if (item === null || item.deletingAt === undefined) {
391
+ return { processed: 0, hasMore: false };
392
+ }
393
+ const entries = await ctx.db
394
+ .query("entries")
395
+ .withIndex("by_roadmap_id", (q) => q.eq("roadmapId", args.roadmapId))
396
+ .take(deletionBatchSize);
397
+ const now = Date.now();
398
+ for (const entry of entries) {
399
+ await ctx.db.patch("entries", entry._id, {
400
+ roadmapId: undefined,
401
+ updatedAt: now,
402
+ });
403
+ }
404
+ const hasMore = entries.length === deletionBatchSize;
405
+ if (hasMore) {
406
+ await ctx.scheduler.runAfter(0, internal.roadmap.removeBatch, {
407
+ roadmapId: args.roadmapId,
408
+ });
409
+ }
410
+ else {
411
+ await ctx.scheduler.runAfter(0, internal.roadmap.finalizeRemoval, {
412
+ roadmapId: args.roadmapId,
413
+ });
414
+ }
415
+ return { processed: entries.length, hasMore };
416
+ },
417
+ });
418
+ export const finalizeRemoval = internalMutation({
419
+ args: { roadmapId: v.id("roadmap") },
420
+ returns: v.null(),
421
+ handler: async (ctx, args) => {
422
+ const item = await ctx.db.get("roadmap", args.roadmapId);
423
+ if (item === null || item.deletingAt === undefined)
424
+ return null;
425
+ await ctx.db.delete("roadmap", args.roadmapId);
426
+ return null;
427
+ },
428
+ });
429
+ async function attachFeedbackRecord(ctx, roadmapId, entryId) {
430
+ const [item, entry] = await Promise.all([
431
+ ctx.db.get("roadmap", roadmapId),
432
+ ctx.db.get("entries", entryId),
433
+ ]);
434
+ if (item === null)
435
+ throw new ConvexError("Roadmap item not found.");
436
+ if (item.deletingAt !== undefined) {
437
+ throw new ConvexError("Roadmap item is being deleted.");
438
+ }
439
+ if (entry === null)
440
+ throw new ConvexError("Entry not found.");
441
+ if (entry.roadmapId === roadmapId)
442
+ return;
443
+ const now = Date.now();
444
+ if (entry.roadmapId !== undefined) {
445
+ const previous = await ctx.db.get("roadmap", entry.roadmapId);
446
+ if (previous !== null) {
447
+ await ctx.db.patch("roadmap", previous._id, {
448
+ feedbackCount: Math.max(0, previous.feedbackCount - 1),
449
+ updatedAt: now,
450
+ });
451
+ }
452
+ }
453
+ await ctx.db.patch("entries", entryId, {
454
+ roadmapId,
455
+ updatedAt: now,
456
+ });
457
+ await ctx.db.patch("roadmap", roadmapId, {
458
+ feedbackCount: item.feedbackCount + 1,
459
+ updatedAt: now,
460
+ });
461
+ }
462
+ export const attachFeedback = mutation({
463
+ args: {
464
+ actor: actorValidator,
465
+ roadmapId: v.id("roadmap"),
466
+ entryId: v.id("entries"),
467
+ },
468
+ returns: v.null(),
469
+ handler: async (ctx, args) => {
470
+ assertAdmin(args.actor);
471
+ await attachFeedbackRecord(ctx, args.roadmapId, args.entryId);
472
+ return null;
473
+ },
474
+ });
475
+ export const createForEntry = mutation({
476
+ args: {
477
+ actor: actorValidator,
478
+ title: v.string(),
479
+ description: v.optional(v.string()),
480
+ status: roadmapStatusValidator,
481
+ entryId: v.id("entries"),
482
+ },
483
+ returns: v.id("roadmap"),
484
+ handler: async (ctx, args) => {
485
+ assertAdmin(args.actor);
486
+ const roadmapId = await createRoadmapRecord(ctx, args);
487
+ await attachFeedbackRecord(ctx, roadmapId, args.entryId);
488
+ return roadmapId;
489
+ },
490
+ });
491
+ export const detachFeedback = mutation({
492
+ args: { actor: actorValidator, entryId: v.id("entries") },
493
+ returns: v.null(),
494
+ handler: async (ctx, args) => {
495
+ assertAdmin(args.actor);
496
+ const entry = await ctx.db.get("entries", args.entryId);
497
+ if (entry === null)
498
+ throw new ConvexError("Entry not found.");
499
+ if (entry.roadmapId === undefined)
500
+ return null;
501
+ const item = await ctx.db.get("roadmap", entry.roadmapId);
502
+ await ctx.db.patch("entries", args.entryId, {
503
+ roadmapId: undefined,
504
+ updatedAt: Date.now(),
505
+ });
506
+ if (item !== null) {
507
+ await ctx.db.patch("roadmap", item._id, {
508
+ feedbackCount: Math.max(0, item.feedbackCount - 1),
509
+ updatedAt: Date.now(),
510
+ });
511
+ }
512
+ return null;
513
+ },
514
+ });
515
+ export const listFeedback = query({
516
+ args: {
517
+ paginationOpts: paginationOptsValidator,
518
+ roadmapId: v.id("roadmap"),
519
+ viewerActorId: v.optional(v.string()),
520
+ },
521
+ returns: paginationResultValidator(publicEntryValidator),
522
+ handler: async (ctx, args) => {
523
+ const result = await ctx.db
524
+ .query("entries")
525
+ .withIndex("by_roadmap_id", (q) => q.eq("roadmapId", args.roadmapId))
526
+ .order("desc")
527
+ .paginate(args.paginationOpts);
528
+ return {
529
+ ...result,
530
+ page: await Promise.all(result.page.map((entry) => serializeEntry(ctx, entry, args.viewerActorId))),
531
+ };
532
+ },
533
+ });
534
+ //# sourceMappingURL=roadmap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"roadmap.js","sourceRoot":"","sources":["../../src/component/roadmap.ts"],"names":[],"mappings":"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"}