convex-feedback 0.2.0-beta.9 → 0.2.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 (81) hide show
  1. package/README.md +398 -7
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/client/api.d.ts +49 -9
  4. package/dist/client/api.d.ts.map +1 -1
  5. package/dist/client/config.d.ts +1 -3
  6. package/dist/client/config.d.ts.map +1 -1
  7. package/dist/client/config.js.map +1 -1
  8. package/dist/client/index.d.ts +707 -15
  9. package/dist/client/index.d.ts.map +1 -1
  10. package/dist/client/index.js +243 -12
  11. package/dist/client/index.js.map +1 -1
  12. package/dist/component/_generated/api.d.ts +2 -0
  13. package/dist/component/_generated/api.d.ts.map +1 -1
  14. package/dist/component/_generated/api.js.map +1 -1
  15. package/dist/component/_generated/component.d.ts +222 -4
  16. package/dist/component/_generated/component.d.ts.map +1 -1
  17. package/dist/component/admin.d.ts +5 -90
  18. package/dist/component/admin.d.ts.map +1 -1
  19. package/dist/component/admin.js +59 -29
  20. package/dist/component/admin.js.map +1 -1
  21. package/dist/component/comments.d.ts +107 -15
  22. package/dist/component/comments.d.ts.map +1 -1
  23. package/dist/component/comments.js +342 -28
  24. package/dist/component/comments.js.map +1 -1
  25. package/dist/component/crons.d.ts.map +1 -1
  26. package/dist/component/crons.js +4 -0
  27. package/dist/component/crons.js.map +1 -1
  28. package/dist/component/entries.d.ts +119 -91
  29. package/dist/component/entries.d.ts.map +1 -1
  30. package/dist/component/entries.js +348 -29
  31. package/dist/component/entries.js.map +1 -1
  32. package/dist/component/helpers.d.ts +32 -1
  33. package/dist/component/helpers.d.ts.map +1 -1
  34. package/dist/component/helpers.js +121 -4
  35. package/dist/component/helpers.js.map +1 -1
  36. package/dist/component/migrations.d.ts +24 -0
  37. package/dist/component/migrations.d.ts.map +1 -1
  38. package/dist/component/migrations.js +318 -0
  39. package/dist/component/migrations.js.map +1 -1
  40. package/dist/component/model.d.ts +455 -120
  41. package/dist/component/model.d.ts.map +1 -1
  42. package/dist/component/model.js +70 -2
  43. package/dist/component/model.js.map +1 -1
  44. package/dist/component/reactions.d.ts +37 -0
  45. package/dist/component/reactions.d.ts.map +1 -0
  46. package/dist/component/reactions.js +52 -0
  47. package/dist/component/reactions.js.map +1 -0
  48. package/dist/component/roadmap.d.ts +10 -46
  49. package/dist/component/roadmap.d.ts.map +1 -1
  50. package/dist/component/roadmap.js +239 -21
  51. package/dist/component/roadmap.js.map +1 -1
  52. package/dist/component/schema.d.ts +33 -5
  53. package/dist/component/schema.d.ts.map +1 -1
  54. package/dist/component/schema.js +40 -4
  55. package/dist/component/schema.js.map +1 -1
  56. package/dist/react/index.d.ts +26 -238
  57. package/dist/react/index.d.ts.map +1 -1
  58. package/dist/react/index.js +65 -2
  59. package/dist/react/index.js.map +1 -1
  60. package/dist/test.d.ts +23 -5
  61. package/dist/test.d.ts.map +1 -1
  62. package/package.json +1 -1
  63. package/src/client/README.md +6 -1
  64. package/src/client/api.ts +89 -7
  65. package/src/client/config.ts +1 -3
  66. package/src/client/index.ts +1237 -34
  67. package/src/component/README.md +32 -4
  68. package/src/component/_generated/api.ts +2 -0
  69. package/src/component/_generated/component.ts +290 -8
  70. package/src/component/admin.ts +88 -30
  71. package/src/component/comments.ts +405 -26
  72. package/src/component/crons.ts +10 -0
  73. package/src/component/entries.ts +388 -27
  74. package/src/component/helpers.ts +163 -4
  75. package/src/component/migrations.ts +415 -0
  76. package/src/component/model.ts +381 -117
  77. package/src/component/reactions.ts +60 -0
  78. package/src/component/roadmap.ts +357 -35
  79. package/src/component/schema.ts +40 -4
  80. package/src/react/README.md +5 -0
  81. package/src/react/index.ts +90 -3
@@ -1,8 +1,71 @@
1
1
  import { v } from "convex/values";
2
2
  import { internal } from "./_generated/api.js";
3
3
  import { internalMutation } from "./_generated/server.js";
4
+ import { startCommentDeletion } from "./comments.js";
4
5
  import { entryStatusFilterForStatus } from "./model.js";
5
6
  const statusFilterMigrationBatchSize = 100;
7
+ const legacyCommentMigrationBatchSize = 25;
8
+ const legacyReactionMigrationBatchSize = 100;
9
+ async function scheduleLegacyCommentMigration(ctx, phase) {
10
+ await ctx.scheduler.runAfter(0, internal.migrations.cleanupLegacyComments, {
11
+ phase,
12
+ });
13
+ }
14
+ /**
15
+ * Validate a comment's parent chain without loading the same document twice.
16
+ * A missing parent or an entry mismatch makes the whole subtree legacy
17
+ * orphan data; a pending ancestor points the migration at the existing
18
+ * bounded subtree cleaner.
19
+ */
20
+ async function inspectCommentChain(ctx, comment, cache) {
21
+ let current = comment;
22
+ let remaining = Math.max(0, comment.depth) + 1;
23
+ while (remaining > 0) {
24
+ if (current.deletingAt !== undefined) {
25
+ return { kind: "pending", root: current };
26
+ }
27
+ if (current.deletedAt !== undefined) {
28
+ return { kind: "pending", root: current };
29
+ }
30
+ if (current.parentCommentId === undefined) {
31
+ return { kind: "valid" };
32
+ }
33
+ remaining -= 1;
34
+ const parentId = current.parentCommentId;
35
+ let parent = cache.get(parentId);
36
+ if (parent === undefined) {
37
+ parent = await ctx.db.get("comments", parentId);
38
+ cache.set(parentId, parent);
39
+ }
40
+ if (parent === null || parent.entryId !== comment.entryId) {
41
+ return { kind: "orphan" };
42
+ }
43
+ current = parent;
44
+ }
45
+ // A malformed cycle or an invalid depth is safer to remove than to leave
46
+ // permanently unreachable feedback data behind.
47
+ return { kind: "orphan" };
48
+ }
49
+ async function scheduleEntryCleanupOnce(ctx, entryId, scheduled) {
50
+ const key = String(entryId);
51
+ if (scheduled.has(key))
52
+ return;
53
+ scheduled.add(key);
54
+ await ctx.scheduler.runAfter(0, internal.entries.removeBatch, { entryId });
55
+ }
56
+ async function deleteLegacyReaction(ctx, reaction, comment, entry) {
57
+ await ctx.db.delete("reactions", reaction._id);
58
+ // Keep a surviving comment's denormalized count accurate when a malformed
59
+ // legacy reaction points at a missing entry but still names a live comment.
60
+ if (comment !== null &&
61
+ entry !== null &&
62
+ comment.deletingAt === undefined &&
63
+ comment.deletedAt === undefined) {
64
+ await ctx.db.patch("comments", comment._id, {
65
+ likeCount: Math.max(0, comment.likeCount - 1),
66
+ });
67
+ }
68
+ }
6
69
  /**
7
70
  * Backfills one bounded batch of legacy entries and schedules the next batch.
8
71
  *
@@ -32,4 +95,259 @@ export const backfillStatusFilter = internalMutation({
32
95
  return { updated: entries.length, hasMore };
33
96
  },
34
97
  });
98
+ /**
99
+ * Drain comments written by versions that used soft deletion. The migration
100
+ * is deliberately split into three bounded passes:
101
+ *
102
+ * 1. indexed legacy tombstones are marked for the current subtree cleaner;
103
+ * 2. an indexed comment sweep marks broken parent/entry references;
104
+ * 3. an indexed reaction sweep removes any remaining orphan reactions.
105
+ *
106
+ * Each pass schedules its continuation after committing the current batch.
107
+ * Re-running any phase is safe because migration markers and document deletes
108
+ * are idempotent, while the normal comment cleaner remains the single place
109
+ * that updates counters and removes descendants.
110
+ */
111
+ export const cleanupLegacyComments = internalMutation({
112
+ args: {
113
+ phase: v.optional(v.union(v.literal("tombstones"), v.literal("comments"), v.literal("reactions"))),
114
+ },
115
+ returns: v.object({
116
+ phase: v.union(v.literal("tombstones"), v.literal("comments"), v.literal("reactions")),
117
+ processed: v.number(),
118
+ hasMore: v.boolean(),
119
+ }),
120
+ handler: async (ctx, args) => {
121
+ const phase = args.phase ?? "tombstones";
122
+ if (phase === "tombstones") {
123
+ const tombstones = await ctx.db
124
+ .query("comments")
125
+ .withIndex("by_deleted_at", (q) => q.gte("deletedAt", 0))
126
+ .take(legacyCommentMigrationBatchSize);
127
+ const scheduledRoots = new Set();
128
+ for (const comment of tombstones) {
129
+ const rootId = comment.deletionRootId ?? comment._id;
130
+ const root = rootId === comment._id
131
+ ? comment
132
+ : await ctx.db.get("comments", rootId);
133
+ const deletionRoot = root ?? comment;
134
+ const key = String(deletionRoot._id);
135
+ if (scheduledRoots.has(key))
136
+ continue;
137
+ scheduledRoots.add(key);
138
+ await startCommentDeletion(ctx, deletionRoot, deletionRoot.deletedAt ?? deletionRoot.deletingAt ?? Date.now());
139
+ }
140
+ if (tombstones.length > 0) {
141
+ // Tombstone documents remain indexed until their scheduled cleaner
142
+ // finishes. Retry the same indexed pass so a short migration run also
143
+ // waits for those cleaners before moving to orphan discovery.
144
+ await scheduleLegacyCommentMigration(ctx, "tombstones");
145
+ return {
146
+ phase: "tombstones",
147
+ processed: tombstones.length,
148
+ hasMore: true,
149
+ };
150
+ }
151
+ const pendingComments = await ctx.db
152
+ .query("comments")
153
+ .withIndex("by_legacy_cleanup", (q) => q.eq("legacyCleanupAt", undefined))
154
+ .take(1);
155
+ if (pendingComments.length > 0) {
156
+ await scheduleLegacyCommentMigration(ctx, "comments");
157
+ return { phase: "comments", processed: 0, hasMore: true };
158
+ }
159
+ const pendingReactions = await ctx.db
160
+ .query("reactions")
161
+ .withIndex("by_legacy_cleanup", (q) => q.eq("legacyCleanupAt", undefined))
162
+ .take(1);
163
+ if (pendingReactions.length > 0) {
164
+ await scheduleLegacyCommentMigration(ctx, "reactions");
165
+ return { phase: "reactions", processed: 0, hasMore: true };
166
+ }
167
+ return { phase: "reactions", processed: 0, hasMore: false };
168
+ }
169
+ if (phase === "comments") {
170
+ const page = await ctx.db
171
+ .query("comments")
172
+ .withIndex("by_legacy_cleanup", (q) => q.eq("legacyCleanupAt", undefined))
173
+ .take(legacyCommentMigrationBatchSize);
174
+ const commentCache = new Map();
175
+ for (const comment of page) {
176
+ commentCache.set(String(comment._id), comment);
177
+ }
178
+ const entryCache = new Map();
179
+ const scheduledRoots = new Set();
180
+ const scheduledEntries = new Set();
181
+ const markRoot = async (comment, deletionToken) => {
182
+ const rootId = comment.deletionRootId ?? comment._id;
183
+ const root = rootId === comment._id
184
+ ? comment
185
+ : await ctx.db.get("comments", rootId);
186
+ const deletionRoot = root ?? comment;
187
+ const key = String(deletionRoot._id);
188
+ if (scheduledRoots.has(key))
189
+ return;
190
+ scheduledRoots.add(key);
191
+ await startCommentDeletion(ctx, deletionRoot, deletionToken ??
192
+ deletionRoot.deletedAt ??
193
+ deletionRoot.deletingAt ??
194
+ Date.now());
195
+ };
196
+ const getEntry = async (entryId) => {
197
+ const key = String(entryId);
198
+ const cached = entryCache.get(key);
199
+ if (cached !== undefined)
200
+ return cached;
201
+ const entry = await ctx.db.get("entries", entryId);
202
+ entryCache.set(key, entry);
203
+ return entry;
204
+ };
205
+ for (const comment of page) {
206
+ if (comment.deletedAt !== undefined ||
207
+ comment.deletingAt !== undefined) {
208
+ await markRoot(comment, comment.deletedAt ?? comment.deletingAt);
209
+ continue;
210
+ }
211
+ const entry = await getEntry(comment.entryId);
212
+ if (entry === null) {
213
+ await markRoot(comment);
214
+ continue;
215
+ }
216
+ if (entry.deletingAt !== undefined) {
217
+ await scheduleEntryCleanupOnce(ctx, entry._id, scheduledEntries);
218
+ continue;
219
+ }
220
+ const inspection = await inspectCommentChain(ctx, comment, commentCache);
221
+ if (inspection.kind === "orphan") {
222
+ await markRoot(comment);
223
+ }
224
+ else if (inspection.kind === "pending") {
225
+ await markRoot(inspection.root);
226
+ }
227
+ else {
228
+ await ctx.db.patch("comments", comment._id, {
229
+ legacyCleanupAt: Date.now(),
230
+ });
231
+ }
232
+ }
233
+ if (page.length === 0) {
234
+ await scheduleLegacyCommentMigration(ctx, "reactions");
235
+ }
236
+ else {
237
+ await scheduleLegacyCommentMigration(ctx, "comments");
238
+ }
239
+ const nextPhase = page.length === 0 ? "reactions" : "comments";
240
+ return {
241
+ phase: nextPhase,
242
+ processed: page.length,
243
+ hasMore: true,
244
+ };
245
+ }
246
+ const page = await ctx.db
247
+ .query("reactions")
248
+ .withIndex("by_legacy_cleanup", (q) => q.eq("legacyCleanupAt", undefined))
249
+ .take(legacyReactionMigrationBatchSize);
250
+ const commentCache = new Map();
251
+ const entryCache = new Map();
252
+ const scheduledRoots = new Set();
253
+ const scheduledEntries = new Set();
254
+ const getComment = async (commentId) => {
255
+ const key = String(commentId);
256
+ const cached = commentCache.get(key);
257
+ if (cached !== undefined)
258
+ return cached;
259
+ const comment = await ctx.db.get("comments", commentId);
260
+ commentCache.set(key, comment);
261
+ return comment;
262
+ };
263
+ const getEntry = async (entryId) => {
264
+ const key = String(entryId);
265
+ const cached = entryCache.get(key);
266
+ if (cached !== undefined)
267
+ return cached;
268
+ const entry = await ctx.db.get("entries", entryId);
269
+ entryCache.set(key, entry);
270
+ return entry;
271
+ };
272
+ const markRoot = async (comment) => {
273
+ const rootId = comment.deletionRootId ?? comment._id;
274
+ const root = rootId === comment._id ? comment : await ctx.db.get("comments", rootId);
275
+ const deletionRoot = root ?? comment;
276
+ const key = String(deletionRoot._id);
277
+ if (scheduledRoots.has(key))
278
+ return;
279
+ scheduledRoots.add(key);
280
+ await startCommentDeletion(ctx, deletionRoot, deletionRoot.deletedAt ?? deletionRoot.deletingAt ?? Date.now());
281
+ };
282
+ for (const reaction of page) {
283
+ let comment = null;
284
+ let owningEntry = null;
285
+ let removeReaction = false;
286
+ if (reaction.commentId !== undefined) {
287
+ comment = await getComment(reaction.commentId);
288
+ if (comment === null) {
289
+ removeReaction = true;
290
+ }
291
+ else {
292
+ owningEntry = await getEntry(comment.entryId);
293
+ if (owningEntry === null) {
294
+ removeReaction = true;
295
+ await markRoot(comment);
296
+ }
297
+ else if (owningEntry.deletingAt !== undefined) {
298
+ removeReaction = true;
299
+ await scheduleEntryCleanupOnce(ctx, owningEntry._id, scheduledEntries);
300
+ }
301
+ else {
302
+ const inspection = await inspectCommentChain(ctx, comment, commentCache);
303
+ if (inspection.kind === "orphan") {
304
+ removeReaction = true;
305
+ await markRoot(comment);
306
+ }
307
+ else if (inspection.kind === "pending") {
308
+ removeReaction = true;
309
+ await markRoot(inspection.root);
310
+ }
311
+ }
312
+ }
313
+ if (reaction.entryId !== undefined) {
314
+ const reactionEntry = await getEntry(reaction.entryId);
315
+ if (reactionEntry === null ||
316
+ (owningEntry !== null && reactionEntry._id !== owningEntry._id)) {
317
+ removeReaction = true;
318
+ }
319
+ }
320
+ }
321
+ else if (reaction.entryId !== undefined) {
322
+ const entry = await getEntry(reaction.entryId);
323
+ if (entry === null) {
324
+ removeReaction = true;
325
+ }
326
+ else if (entry.deletingAt !== undefined) {
327
+ removeReaction = true;
328
+ await scheduleEntryCleanupOnce(ctx, entry._id, scheduledEntries);
329
+ }
330
+ }
331
+ else {
332
+ removeReaction = true;
333
+ }
334
+ if (removeReaction) {
335
+ await deleteLegacyReaction(ctx, reaction, comment, owningEntry);
336
+ }
337
+ else {
338
+ await ctx.db.patch("reactions", reaction._id, {
339
+ legacyCleanupAt: Date.now(),
340
+ });
341
+ }
342
+ }
343
+ if (page.length > 0) {
344
+ await scheduleLegacyCommentMigration(ctx, "reactions");
345
+ }
346
+ return {
347
+ phase: "reactions",
348
+ processed: page.length,
349
+ hasMore: page.length > 0,
350
+ };
351
+ },
352
+ });
35
353
  //# sourceMappingURL=migrations.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"migrations.js","sourceRoot":"","sources":["../../src/component/migrations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,eAAe,CAAC;AAElC,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,0BAA0B,EAAE,MAAM,YAAY,CAAC;AAExD,MAAM,8BAA8B,GAAG,GAAG,CAAC;AAE3C;;;;;GAKG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,gBAAgB,CAAC;IACnD,IAAI,EAAE,EAAE;IACR,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC;QAChB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;QACnB,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE;KACrB,CAAC;IACF,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QACrB,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,EAAE;aACzB,KAAK,CAAC,SAAS,CAAC;aAChB,SAAS,CAAC,kBAAkB,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,cAAc,EAAE,SAAS,CAAC,CAAC;aACrE,IAAI,CAAC,8BAA8B,CAAC,CAAC;QAExC,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,MAAM,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,GAAG,EAAE;gBACvC,YAAY,EAAE,0BAA0B,CAAC,KAAK,CAAC,MAAM,CAAC;aACvD,CAAC,CAAC;QACL,CAAC;QAED,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,KAAK,8BAA8B,CAAC;QAClE,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,GAAG,CAAC,SAAS,CAAC,QAAQ,CAC1B,CAAC,EACD,QAAQ,CAAC,UAAU,CAAC,oBAAoB,EACxC,EAAE,CACH,CAAC;QACJ,CAAC;QAED,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC;IAC9C,CAAC;CACF,CAAC,CAAC"}
1
+ {"version":3,"file":"migrations.js","sourceRoot":"","sources":["../../src/component/migrations.ts"],"names":[],"mappings":"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"}