convex-feedback 0.2.0-beta.8 → 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.
- package/README.md +398 -7
- package/dist/.tsbuildinfo +1 -1
- package/dist/client/api.d.ts +49 -9
- package/dist/client/api.d.ts.map +1 -1
- package/dist/client/config.d.ts +1 -3
- package/dist/client/config.d.ts.map +1 -1
- package/dist/client/config.js.map +1 -1
- package/dist/client/index.d.ts +707 -15
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +243 -12
- package/dist/client/index.js.map +1 -1
- package/dist/component/_generated/api.d.ts +2 -0
- package/dist/component/_generated/api.d.ts.map +1 -1
- package/dist/component/_generated/api.js.map +1 -1
- package/dist/component/_generated/component.d.ts +222 -4
- package/dist/component/_generated/component.d.ts.map +1 -1
- package/dist/component/admin.d.ts +5 -90
- package/dist/component/admin.d.ts.map +1 -1
- package/dist/component/admin.js +59 -29
- package/dist/component/admin.js.map +1 -1
- package/dist/component/comments.d.ts +107 -15
- package/dist/component/comments.d.ts.map +1 -1
- package/dist/component/comments.js +342 -28
- package/dist/component/comments.js.map +1 -1
- package/dist/component/crons.d.ts.map +1 -1
- package/dist/component/crons.js +4 -0
- package/dist/component/crons.js.map +1 -1
- package/dist/component/entries.d.ts +119 -91
- package/dist/component/entries.d.ts.map +1 -1
- package/dist/component/entries.js +348 -29
- package/dist/component/entries.js.map +1 -1
- package/dist/component/helpers.d.ts +32 -1
- package/dist/component/helpers.d.ts.map +1 -1
- package/dist/component/helpers.js +121 -4
- package/dist/component/helpers.js.map +1 -1
- package/dist/component/migrations.d.ts +24 -0
- package/dist/component/migrations.d.ts.map +1 -1
- package/dist/component/migrations.js +318 -0
- package/dist/component/migrations.js.map +1 -1
- package/dist/component/model.d.ts +455 -120
- package/dist/component/model.d.ts.map +1 -1
- package/dist/component/model.js +70 -2
- package/dist/component/model.js.map +1 -1
- package/dist/component/reactions.d.ts +37 -0
- package/dist/component/reactions.d.ts.map +1 -0
- package/dist/component/reactions.js +52 -0
- package/dist/component/reactions.js.map +1 -0
- package/dist/component/roadmap.d.ts +10 -46
- package/dist/component/roadmap.d.ts.map +1 -1
- package/dist/component/roadmap.js +239 -21
- package/dist/component/roadmap.js.map +1 -1
- package/dist/component/schema.d.ts +33 -5
- package/dist/component/schema.d.ts.map +1 -1
- package/dist/component/schema.js +40 -4
- package/dist/component/schema.js.map +1 -1
- package/dist/react/index.d.ts +26 -238
- package/dist/react/index.d.ts.map +1 -1
- package/dist/react/index.js +65 -2
- package/dist/react/index.js.map +1 -1
- package/dist/test.d.ts +23 -5
- package/dist/test.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/client/README.md +6 -1
- package/src/client/api.ts +89 -7
- package/src/client/config.ts +1 -3
- package/src/client/index.ts +1237 -34
- package/src/component/README.md +32 -4
- package/src/component/_generated/api.ts +2 -0
- package/src/component/_generated/component.ts +290 -8
- package/src/component/admin.ts +88 -30
- package/src/component/comments.ts +405 -26
- package/src/component/crons.ts +10 -0
- package/src/component/entries.ts +388 -27
- package/src/component/helpers.ts +163 -4
- package/src/component/migrations.ts +415 -0
- package/src/component/model.ts +381 -117
- package/src/component/reactions.ts +60 -0
- package/src/component/roadmap.ts +357 -35
- package/src/component/schema.ts +40 -4
- package/src/react/README.md +5 -0
- package/src/react/index.ts +90 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../src/component/model.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAG3C,eAAO,MAAM,kBAAkB,2RAI9B,CAAC;AAEF,eAAO,MAAM,oBAAoB,geAOhC,CAAC;AAEF,eAAO,MAAM,0BAA0B,sLAGtC,CAAC;AAEF,eAAO,MAAM,kBAAkB,oLAG9B,CAAC;AAEF,eAAO,MAAM,sBAAsB,mPAIlC,CAAC;AAEF,eAAO,MAAM,sBAAsB,2QAIlC,CAAC;AAEF,eAAO,MAAM,oBAAoB,uPAIhC,CAAC;AAEF,eAAO,MAAM,cAAc;;;;;;;IAGzB,iCAAiC;;gDAEjC,CAAC;AAEH;;;GAGG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE;IAClC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB,GAAG,OAAO,CAIV;AAED,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;qIAU/B,CAAC;AAEH,eAAO,MAAM,8BAA8B,kPAI1C,CAAC;AAEF,eAAO,MAAM,+BAA+B,uYAG3C,CAAC;AAEF,eAAO,MAAM,yBAAyB;;;;;;yFAGpC,CAAC;AAEH,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAY/B,sEAAsE;;;;;;;;;4SAGtE,CAAC;AAEH,eAAO,MAAM,sBAAsB
|
|
1
|
+
{"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../src/component/model.ts"],"names":[],"mappings":"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"}
|
package/dist/component/model.js
CHANGED
|
@@ -61,13 +61,81 @@ export const publicCommentValidator = v.object({
|
|
|
61
61
|
parentCommentId: v.optional(v.string()),
|
|
62
62
|
actorId: v.string(),
|
|
63
63
|
depth: v.number(),
|
|
64
|
-
body: v.
|
|
64
|
+
body: v.string(),
|
|
65
65
|
likeCount: v.number(),
|
|
66
66
|
replyCount: v.number(),
|
|
67
67
|
updatedAt: v.optional(v.number()),
|
|
68
|
-
deletedAt: v.optional(v.number()),
|
|
69
68
|
viewerHasLiked: v.boolean(),
|
|
70
69
|
});
|
|
70
|
+
/**
|
|
71
|
+
* Entry activity returned by actor-scoped queries.
|
|
72
|
+
*
|
|
73
|
+
* Unlike the ordinary public entry shape, activity entries do not contain
|
|
74
|
+
* viewer-relative reaction state. The actor is already the subject of the
|
|
75
|
+
* query.
|
|
76
|
+
*/
|
|
77
|
+
export const activityEntryValidator = v.object({
|
|
78
|
+
id: v.string(),
|
|
79
|
+
creationTime: v.number(),
|
|
80
|
+
actorId: v.string(),
|
|
81
|
+
kind: entryKindValidator,
|
|
82
|
+
status: entryStatusValidator,
|
|
83
|
+
title: v.string(),
|
|
84
|
+
body: v.string(),
|
|
85
|
+
upvoteCount: v.number(),
|
|
86
|
+
commentCount: v.number(),
|
|
87
|
+
updatedAt: v.optional(v.number()),
|
|
88
|
+
});
|
|
89
|
+
/**
|
|
90
|
+
* Component-level activity entry shape with retained diagnostic and triage
|
|
91
|
+
* context. The host wrapper deliberately strips these optional fields from
|
|
92
|
+
* its normal actor-facing API.
|
|
93
|
+
*/
|
|
94
|
+
export const activityEntryWithContextValidator = activityEntryValidator.extend({
|
|
95
|
+
metadata: v.optional(feedbackMetadataValidator),
|
|
96
|
+
priority: v.optional(entryPriorityValidator),
|
|
97
|
+
roadmap: v.optional(roadmapItemValidator),
|
|
98
|
+
});
|
|
99
|
+
/** Comment activity with the basic entry context needed by an activity UI. */
|
|
100
|
+
export const activityCommentValidator = v.object({
|
|
101
|
+
id: v.string(),
|
|
102
|
+
creationTime: v.number(),
|
|
103
|
+
entryId: v.string(),
|
|
104
|
+
entryTitle: v.string(),
|
|
105
|
+
parentCommentId: v.optional(v.string()),
|
|
106
|
+
actorId: v.string(),
|
|
107
|
+
depth: v.number(),
|
|
108
|
+
body: v.string(),
|
|
109
|
+
likeCount: v.number(),
|
|
110
|
+
replyCount: v.number(),
|
|
111
|
+
updatedAt: v.optional(v.number()),
|
|
112
|
+
});
|
|
113
|
+
/** Resolved target context for an entry-upvote activity record. */
|
|
114
|
+
export const entryReactionTargetValidator = v.object({
|
|
115
|
+
id: v.string(),
|
|
116
|
+
title: v.string(),
|
|
117
|
+
kind: entryKindValidator,
|
|
118
|
+
status: entryStatusValidator,
|
|
119
|
+
});
|
|
120
|
+
/** Resolved target context for a comment-like activity record. */
|
|
121
|
+
export const commentReactionTargetValidator = v.object({
|
|
122
|
+
id: v.string(),
|
|
123
|
+
body: v.string(),
|
|
124
|
+
entryId: v.string(),
|
|
125
|
+
entryTitle: v.string(),
|
|
126
|
+
});
|
|
127
|
+
/** A reaction activity record with a live, resolved target. */
|
|
128
|
+
export const feedbackReactionValidator = v.union(v.object({
|
|
129
|
+
type: v.literal("entry_upvote"),
|
|
130
|
+
id: v.string(),
|
|
131
|
+
creationTime: v.number(),
|
|
132
|
+
entry: entryReactionTargetValidator,
|
|
133
|
+
}), v.object({
|
|
134
|
+
type: v.literal("comment_like"),
|
|
135
|
+
id: v.string(),
|
|
136
|
+
creationTime: v.number(),
|
|
137
|
+
comment: commentReactionTargetValidator,
|
|
138
|
+
}));
|
|
71
139
|
export const similarEntriesValidator = v.object({
|
|
72
140
|
exact: v.array(publicEntryValidator),
|
|
73
141
|
similar: v.array(publicEntryValidator),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model.js","sourceRoot":"","sources":["../../src/component/model.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"model.js","sourceRoot":"","sources":["../../src/component/model.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* List reactions created by a known actor. Target documents are loaded once
|
|
3
|
+
* by the stream mapper and reused by serialization. Reactions whose target or
|
|
4
|
+
* owning entry is missing or pending deletion are omitted.
|
|
5
|
+
*/
|
|
6
|
+
export declare const listByActor: import("convex/server").RegisteredQuery<"public", {
|
|
7
|
+
actorId: string;
|
|
8
|
+
paginationOpts: {
|
|
9
|
+
id?: number;
|
|
10
|
+
endCursor?: string | null;
|
|
11
|
+
maximumRowsRead?: number;
|
|
12
|
+
maximumBytesRead?: number;
|
|
13
|
+
numItems: number;
|
|
14
|
+
cursor: string | null;
|
|
15
|
+
};
|
|
16
|
+
}, Promise<import("convex/server").PaginationResult<{
|
|
17
|
+
type: "entry_upvote";
|
|
18
|
+
id: string;
|
|
19
|
+
creationTime: number;
|
|
20
|
+
entry: {
|
|
21
|
+
id: string;
|
|
22
|
+
title: string;
|
|
23
|
+
status: "open" | "under_review" | "planned" | "in_progress" | "completed" | "closed";
|
|
24
|
+
kind: "feedback" | "feature_request" | "bug_report";
|
|
25
|
+
};
|
|
26
|
+
} | {
|
|
27
|
+
type: "comment_like";
|
|
28
|
+
id: string;
|
|
29
|
+
creationTime: number;
|
|
30
|
+
comment: {
|
|
31
|
+
id: string;
|
|
32
|
+
body: string;
|
|
33
|
+
entryId: string;
|
|
34
|
+
entryTitle: string;
|
|
35
|
+
};
|
|
36
|
+
}>>>;
|
|
37
|
+
//# sourceMappingURL=reactions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reactions.d.ts","sourceRoot":"","sources":["../../src/component/reactions.ts"],"names":[],"mappings":"AAgBA;;;;GAIG;AACH,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAsCtB,CAAC"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { stream } from "convex-helpers/server/stream";
|
|
2
|
+
import { paginationOptsValidator, paginationResultValidator, } from "convex/server";
|
|
3
|
+
import { v } from "convex/values";
|
|
4
|
+
import { assertActorId, commentIsLive, serializeActivityReaction, } from "./helpers.js";
|
|
5
|
+
import { feedbackReactionValidator } from "./model.js";
|
|
6
|
+
import { query } from "./_generated/server.js";
|
|
7
|
+
import schema from "./schema.js";
|
|
8
|
+
/**
|
|
9
|
+
* List reactions created by a known actor. Target documents are loaded once
|
|
10
|
+
* by the stream mapper and reused by serialization. Reactions whose target or
|
|
11
|
+
* owning entry is missing or pending deletion are omitted.
|
|
12
|
+
*/
|
|
13
|
+
export const listByActor = query({
|
|
14
|
+
args: {
|
|
15
|
+
paginationOpts: paginationOptsValidator,
|
|
16
|
+
actorId: v.string(),
|
|
17
|
+
},
|
|
18
|
+
returns: paginationResultValidator(feedbackReactionValidator),
|
|
19
|
+
handler: async (ctx, args) => {
|
|
20
|
+
assertActorId(args.actorId);
|
|
21
|
+
const result = await stream(ctx.db, schema)
|
|
22
|
+
.query("reactions")
|
|
23
|
+
.withIndex("by_actor", (q) => q.eq("actorId", args.actorId))
|
|
24
|
+
.order("desc")
|
|
25
|
+
.map(async (reaction) => {
|
|
26
|
+
if (reaction.entryId !== undefined) {
|
|
27
|
+
const entry = await ctx.db.get("entries", reaction.entryId);
|
|
28
|
+
if (entry === null || entry.deletingAt !== undefined)
|
|
29
|
+
return null;
|
|
30
|
+
return serializeActivityReaction(reaction, { type: "entry", entry });
|
|
31
|
+
}
|
|
32
|
+
if (reaction.commentId !== undefined) {
|
|
33
|
+
const comment = await ctx.db.get("comments", reaction.commentId);
|
|
34
|
+
if (comment === null || !(await commentIsLive(ctx, comment))) {
|
|
35
|
+
return null;
|
|
36
|
+
}
|
|
37
|
+
const entry = await ctx.db.get("entries", comment.entryId);
|
|
38
|
+
if (entry === null || entry.deletingAt !== undefined)
|
|
39
|
+
return null;
|
|
40
|
+
return serializeActivityReaction(reaction, {
|
|
41
|
+
type: "comment",
|
|
42
|
+
comment,
|
|
43
|
+
entry,
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
return null;
|
|
47
|
+
})
|
|
48
|
+
.paginate(args.paginationOpts);
|
|
49
|
+
return result;
|
|
50
|
+
},
|
|
51
|
+
});
|
|
52
|
+
//# sourceMappingURL=reactions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reactions.js","sourceRoot":"","sources":["../../src/component/reactions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,8BAA8B,CAAC;AACtD,OAAO,EACL,uBAAuB,EACvB,yBAAyB,GAC1B,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,CAAC,EAAE,MAAM,eAAe,CAAC;AAElC,OAAO,EACL,aAAa,EACb,aAAa,EACb,yBAAyB,GAC1B,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AACvD,OAAO,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAC;AAC/C,OAAO,MAAM,MAAM,aAAa,CAAC;AAEjC;;;;GAIG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,KAAK,CAAC;IAC/B,IAAI,EAAE;QACJ,cAAc,EAAE,uBAAuB;QACvC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;KACpB;IACD,OAAO,EAAE,yBAAyB,CAAC,yBAAyB,CAAC;IAC7D,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QAC3B,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAE5B,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,CAAC;aACxC,KAAK,CAAC,WAAW,CAAC;aAClB,SAAS,CAAC,UAAU,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;aAC3D,KAAK,CAAC,MAAM,CAAC;aACb,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE;YACtB,IAAI,QAAQ,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;gBACnC,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,SAAS,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;gBAC5D,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,CAAC,UAAU,KAAK,SAAS;oBAAE,OAAO,IAAI,CAAC;gBAClE,OAAO,yBAAyB,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;YACvE,CAAC;YACD,IAAI,QAAQ,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;gBACrC,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,UAAU,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC;gBACjE,IAAI,OAAO,KAAK,IAAI,IAAI,CAAC,CAAC,MAAM,aAAa,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC;oBAC7D,OAAO,IAAI,CAAC;gBACd,CAAC;gBACD,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;gBAC3D,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,CAAC,UAAU,KAAK,SAAS;oBAAE,OAAO,IAAI,CAAC;gBAClE,OAAO,yBAAyB,CAAC,QAAQ,EAAE;oBACzC,IAAI,EAAE,SAAS;oBACf,OAAO;oBACP,KAAK;iBACN,CAAC,CAAC;YACL,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC,CAAC;aACD,QAAQ,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAEjC,OAAO,MAAM,CAAC;IAChB,CAAC;CACF,CAAC,CAAC"}
|
|
@@ -1,3 +1,9 @@
|
|
|
1
|
+
import { type PaginationResult } from "convex/server";
|
|
2
|
+
import { serializeRoadmapItem } from "./helpers.js";
|
|
3
|
+
type RoadmapItemPage = PaginationResult<ReturnType<typeof serializeRoadmapItem>>;
|
|
4
|
+
export declare const get: import("convex/server").RegisteredQuery<"public", {
|
|
5
|
+
roadmapId: import("convex/values").GenericId<"roadmap">;
|
|
6
|
+
}, Promise<import("./model.js").RoadmapItem | null>>;
|
|
1
7
|
export declare const list: import("convex/server").RegisteredQuery<"public", {
|
|
2
8
|
status?: "planned" | "in_progress" | "shipped" | undefined;
|
|
3
9
|
paginationOpts: {
|
|
@@ -8,37 +14,11 @@ export declare const list: import("convex/server").RegisteredQuery<"public", {
|
|
|
8
14
|
numItems: number;
|
|
9
15
|
cursor: string | null;
|
|
10
16
|
};
|
|
11
|
-
}, Promise<
|
|
12
|
-
page: {
|
|
13
|
-
description?: string | undefined;
|
|
14
|
-
id: string;
|
|
15
|
-
creationTime: number;
|
|
16
|
-
title: string;
|
|
17
|
-
status: "planned" | "in_progress" | "shipped";
|
|
18
|
-
position: number;
|
|
19
|
-
createdAt: number;
|
|
20
|
-
updatedAt: number;
|
|
21
|
-
feedbackCount: number;
|
|
22
|
-
}[];
|
|
23
|
-
isDone: boolean;
|
|
24
|
-
continueCursor: import("convex/server").Cursor;
|
|
25
|
-
splitCursor?: import("convex/server").Cursor | null;
|
|
26
|
-
pageStatus?: "SplitRecommended" | "SplitRequired" | null;
|
|
27
|
-
}>>;
|
|
17
|
+
}, Promise<RoadmapItemPage>>;
|
|
28
18
|
export declare const search: import("convex/server").RegisteredQuery<"public", {
|
|
29
19
|
searchQuery: string;
|
|
30
20
|
limit: number;
|
|
31
|
-
}, Promise<
|
|
32
|
-
description?: string | undefined;
|
|
33
|
-
id: string;
|
|
34
|
-
creationTime: number;
|
|
35
|
-
title: string;
|
|
36
|
-
status: "planned" | "in_progress" | "shipped";
|
|
37
|
-
position: number;
|
|
38
|
-
createdAt: number;
|
|
39
|
-
updatedAt: number;
|
|
40
|
-
feedbackCount: number;
|
|
41
|
-
}[]>>;
|
|
21
|
+
}, Promise<import("./model.js").RoadmapItem[]>>;
|
|
42
22
|
export declare const create: import("convex/server").RegisteredMutation<"public", {
|
|
43
23
|
description?: string | undefined;
|
|
44
24
|
title: string;
|
|
@@ -141,27 +121,11 @@ export declare const listFeedback: import("convex/server").RegisteredQuery<"publ
|
|
|
141
121
|
cursor: string | null;
|
|
142
122
|
};
|
|
143
123
|
}, Promise<{
|
|
144
|
-
page:
|
|
145
|
-
updatedAt?: number | undefined;
|
|
146
|
-
viewerIsAuthor?: boolean | undefined;
|
|
147
|
-
metadata?: {
|
|
148
|
-
standard?: Record<string, string | number | boolean> | undefined;
|
|
149
|
-
additional?: Record<string, string | number | boolean> | undefined;
|
|
150
|
-
} | undefined;
|
|
151
|
-
id: string;
|
|
152
|
-
creationTime: number;
|
|
153
|
-
title: string;
|
|
154
|
-
status: "open" | "under_review" | "planned" | "in_progress" | "completed" | "closed";
|
|
155
|
-
actorId: string;
|
|
156
|
-
kind: "feedback" | "feature_request" | "bug_report";
|
|
157
|
-
body: string;
|
|
158
|
-
upvoteCount: number;
|
|
159
|
-
commentCount: number;
|
|
160
|
-
viewerHasUpvoted: boolean;
|
|
161
|
-
}[];
|
|
124
|
+
page: import("./model.js").FeedbackEntry[];
|
|
162
125
|
isDone: boolean;
|
|
163
126
|
continueCursor: import("convex/server").Cursor;
|
|
164
127
|
splitCursor?: import("convex/server").Cursor | null;
|
|
165
128
|
pageStatus?: "SplitRecommended" | "SplitRequired" | null;
|
|
166
129
|
}>>;
|
|
130
|
+
export {};
|
|
167
131
|
//# sourceMappingURL=roadmap.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"roadmap.d.ts","sourceRoot":"","sources":["../../src/component/roadmap.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"roadmap.d.ts","sourceRoot":"","sources":["../../src/component/roadmap.ts"],"names":[],"mappings":"AACA,OAAO,EAGL,KAAK,gBAAgB,EACtB,MAAM,eAAe,CAAC;AAMvB,OAAO,EAGL,oBAAoB,EACrB,MAAM,cAAc,CAAC;AAqBtB,KAAK,eAAe,GAAG,gBAAgB,CACrC,UAAU,CAAC,OAAO,oBAAoB,CAAC,CACxC,CAAC;AAyZF,eAAO,MAAM,GAAG;;oDAed,CAAC;AAEH,eAAO,MAAM,IAAI;;;;;;;;;;4BAuBf,CAAC;AAEH,eAAO,MAAM,MAAM;;;+CAcjB,CAAC;AAuBH,eAAO,MAAM,MAAM;;;;;;;;;yDAYjB,CAAC;AAEH,eAAO,MAAM,MAAM;;;;;;;;;iBAwBjB,CAAC;AAEH,eAAO,MAAM,IAAI;;;;;;;;;;mBAyFf,CAAC;AAEH,eAAO,MAAM,cAAc;;;;;;;;;;;;;iBAgHzB,CAAC;AAEH,eAAO,MAAM,MAAM;;;;;;;iBAgBjB,CAAC;AAEH,eAAO,MAAM,WAAW;;;;;GAkCtB,CAAC;AAEH,eAAO,MAAM,eAAe;;iBAS1B,CAAC;AAyCH,eAAO,MAAM,cAAc;;;;;;;;iBAYzB,CAAC;AAEH,eAAO,MAAM,cAAc;;;;;;;;;;yDAezB,CAAC;AAEH,eAAO,MAAM,cAAc;;;;;;;iBAqBzB,CAAC;AAEH,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;GAwBvB,CAAC"}
|
|
@@ -10,6 +10,7 @@ const POSITION_STEP = 1_000_000;
|
|
|
10
10
|
const REBALANCE_GAP_THRESHOLD = 10;
|
|
11
11
|
const rebalanceBatchSize = 100;
|
|
12
12
|
const deletionBatchSize = 100;
|
|
13
|
+
const roadmapStatuses = ["planned", "in_progress", "shipped"];
|
|
13
14
|
function assertAdmin(actor) {
|
|
14
15
|
if (!actorIsAdmin(actor))
|
|
15
16
|
throw new ConvexError("Admin access is required.");
|
|
@@ -76,6 +77,233 @@ async function scheduleRebalance(ctx, status) {
|
|
|
76
77
|
offset: 0,
|
|
77
78
|
});
|
|
78
79
|
}
|
|
80
|
+
function newRoadmapListStreamState(generation = null) {
|
|
81
|
+
return { cursor: null, offset: 0, done: false, generation };
|
|
82
|
+
}
|
|
83
|
+
function initialRoadmapListCursor() {
|
|
84
|
+
return {
|
|
85
|
+
version: 1,
|
|
86
|
+
streams: roadmapStatuses.map(() => newRoadmapListStreamState()),
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
function isRecord(value) {
|
|
90
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
91
|
+
}
|
|
92
|
+
function isRoadmapListStreamState(value) {
|
|
93
|
+
if (!isRecord(value))
|
|
94
|
+
return false;
|
|
95
|
+
return ((value.cursor === null || typeof value.cursor === "string") &&
|
|
96
|
+
typeof value.offset === "number" &&
|
|
97
|
+
Number.isInteger(value.offset) &&
|
|
98
|
+
value.offset >= 0 &&
|
|
99
|
+
typeof value.done === "boolean" &&
|
|
100
|
+
(value.generation === null || typeof value.generation === "string"));
|
|
101
|
+
}
|
|
102
|
+
function decodeRoadmapListCursor(cursor) {
|
|
103
|
+
if (cursor === null)
|
|
104
|
+
return initialRoadmapListCursor();
|
|
105
|
+
let value;
|
|
106
|
+
try {
|
|
107
|
+
value = JSON.parse(cursor);
|
|
108
|
+
}
|
|
109
|
+
catch {
|
|
110
|
+
throw new ConvexError("InvalidCursor");
|
|
111
|
+
}
|
|
112
|
+
if (!isRecord(value) ||
|
|
113
|
+
value.version !== 1 ||
|
|
114
|
+
!Array.isArray(value.streams) ||
|
|
115
|
+
value.streams.length !== roadmapStatuses.length ||
|
|
116
|
+
!value.streams.every(isRoadmapListStreamState)) {
|
|
117
|
+
throw new ConvexError("InvalidCursor");
|
|
118
|
+
}
|
|
119
|
+
return {
|
|
120
|
+
version: 1,
|
|
121
|
+
streams: value.streams.map((stream) => ({ ...stream })),
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
function encodeRoadmapListCursor(cursor) {
|
|
125
|
+
return JSON.stringify(cursor);
|
|
126
|
+
}
|
|
127
|
+
async function paginateRoadmapStatus(ctx, db, status, paginationOpts) {
|
|
128
|
+
const state = await getRebalanceState(ctx, status);
|
|
129
|
+
const generation = state?.visibleGeneration ?? null;
|
|
130
|
+
const roadmapQuery = generation === null
|
|
131
|
+
? db
|
|
132
|
+
.query("roadmap")
|
|
133
|
+
.withIndex("by_status_deleting_at_position", (q) => q.eq("status", status).eq("deletingAt", undefined))
|
|
134
|
+
: db
|
|
135
|
+
.query("roadmap")
|
|
136
|
+
.withIndex("by_status_deleting_at_rebalance_id_position", (q) => q
|
|
137
|
+
.eq("status", status)
|
|
138
|
+
.eq("deletingAt", undefined)
|
|
139
|
+
.eq("rebalanceId", generation));
|
|
140
|
+
const result = await roadmapQuery.paginate(paginationOpts);
|
|
141
|
+
return {
|
|
142
|
+
...result,
|
|
143
|
+
generation,
|
|
144
|
+
page: result.page.map((item) => serializeRoadmapItem(item, generation === null ? undefined : item.rebalancePosition)),
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
function compareRoadmapItems(left, right) {
|
|
148
|
+
if (left.position !== right.position) {
|
|
149
|
+
return left.position - right.position;
|
|
150
|
+
}
|
|
151
|
+
if (left.creationTime !== right.creationTime) {
|
|
152
|
+
return left.creationTime - right.creationTime;
|
|
153
|
+
}
|
|
154
|
+
return left.id < right.id ? -1 : left.id > right.id ? 1 : 0;
|
|
155
|
+
}
|
|
156
|
+
function mergeRoadmapPages(pages, offsets, limit) {
|
|
157
|
+
const page = [];
|
|
158
|
+
while (page.length < limit) {
|
|
159
|
+
let selectedIndex = -1;
|
|
160
|
+
for (const [index, value] of pages.entries()) {
|
|
161
|
+
if (value === null)
|
|
162
|
+
continue;
|
|
163
|
+
const item = value.result.page[offsets[index]];
|
|
164
|
+
if (item === undefined)
|
|
165
|
+
continue;
|
|
166
|
+
const selected = selectedIndex < 0
|
|
167
|
+
? undefined
|
|
168
|
+
: pages[selectedIndex].result.page[offsets[selectedIndex]];
|
|
169
|
+
if (selected === undefined || compareRoadmapItems(item, selected) < 0) {
|
|
170
|
+
selectedIndex = index;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
if (selectedIndex < 0)
|
|
174
|
+
break;
|
|
175
|
+
page.push(pages[selectedIndex].result.page[offsets[selectedIndex]]);
|
|
176
|
+
offsets[selectedIndex] += 1;
|
|
177
|
+
}
|
|
178
|
+
return page;
|
|
179
|
+
}
|
|
180
|
+
async function paginateUnfilteredRoadmapRange(ctx, db, paginationOpts, startCursor, endCursor) {
|
|
181
|
+
const generations = await Promise.all(roadmapStatuses.map(async (status) => {
|
|
182
|
+
const state = await getRebalanceState(ctx, status);
|
|
183
|
+
return state?.visibleGeneration ?? null;
|
|
184
|
+
}));
|
|
185
|
+
if (startCursor.streams.some((stream, index) => stream.generation !== generations[index] ||
|
|
186
|
+
endCursor.streams[index].generation !== generations[index])) {
|
|
187
|
+
throw new ConvexError("InvalidCursor");
|
|
188
|
+
}
|
|
189
|
+
const pages = await Promise.all(roadmapStatuses.map(async (status, index) => {
|
|
190
|
+
const start = startCursor.streams[index];
|
|
191
|
+
const end = endCursor.streams[index];
|
|
192
|
+
if (start.generation !== end.generation) {
|
|
193
|
+
throw new ConvexError("InvalidCursor");
|
|
194
|
+
}
|
|
195
|
+
if (start.done)
|
|
196
|
+
return null;
|
|
197
|
+
if (start.cursor === end.cursor) {
|
|
198
|
+
if (end.offset <= start.offset)
|
|
199
|
+
return null;
|
|
200
|
+
const result = await paginateRoadmapStatus(ctx, db, status, {
|
|
201
|
+
cursor: start.cursor,
|
|
202
|
+
numItems: end.offset,
|
|
203
|
+
});
|
|
204
|
+
return { stream: start, result };
|
|
205
|
+
}
|
|
206
|
+
if (end.cursor === null) {
|
|
207
|
+
throw new ConvexError("InvalidCursor");
|
|
208
|
+
}
|
|
209
|
+
const result = await paginateRoadmapStatus(ctx, db, status, {
|
|
210
|
+
cursor: start.cursor,
|
|
211
|
+
endCursor: end.cursor,
|
|
212
|
+
numItems: paginationOpts.numItems,
|
|
213
|
+
});
|
|
214
|
+
return { stream: start, result };
|
|
215
|
+
}));
|
|
216
|
+
const offsets = pages.map((page) => page?.stream.offset ?? 0);
|
|
217
|
+
return {
|
|
218
|
+
page: mergeRoadmapPages(pages, offsets, Number.POSITIVE_INFINITY),
|
|
219
|
+
isDone: endCursor.streams.every((stream) => stream.done),
|
|
220
|
+
continueCursor: encodeRoadmapListCursor(endCursor),
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Unfiltered reads merge one stable stream per status. Each stream is pinned
|
|
225
|
+
* to the generation visible in the query snapshot, so promotion batches can
|
|
226
|
+
* never leak a mixture of live and replacement positions.
|
|
227
|
+
*/
|
|
228
|
+
async function paginateUnfilteredRoadmap(ctx, db, paginationOpts) {
|
|
229
|
+
const cursor = decodeRoadmapListCursor(paginationOpts.cursor);
|
|
230
|
+
if (paginationOpts.endCursor !== undefined &&
|
|
231
|
+
paginationOpts.endCursor !== null) {
|
|
232
|
+
return await paginateUnfilteredRoadmapRange(ctx, db, paginationOpts, cursor, decodeRoadmapListCursor(paginationOpts.endCursor));
|
|
233
|
+
}
|
|
234
|
+
const generations = await Promise.all(roadmapStatuses.map(async (status) => {
|
|
235
|
+
const state = await getRebalanceState(ctx, status);
|
|
236
|
+
return state?.visibleGeneration ?? null;
|
|
237
|
+
}));
|
|
238
|
+
const streams = cursor.streams.map((stream, index) => stream.generation === generations[index]
|
|
239
|
+
? stream
|
|
240
|
+
: newRoadmapListStreamState(generations[index]));
|
|
241
|
+
const pages = await Promise.all(roadmapStatuses.map(async (status, index) => {
|
|
242
|
+
const stream = streams[index];
|
|
243
|
+
if (stream.done)
|
|
244
|
+
return null;
|
|
245
|
+
const result = await paginateRoadmapStatus(ctx, db, status, {
|
|
246
|
+
...paginationOpts,
|
|
247
|
+
cursor: stream.cursor,
|
|
248
|
+
endCursor: undefined,
|
|
249
|
+
numItems: Math.max(paginationOpts.numItems, stream.offset + paginationOpts.numItems),
|
|
250
|
+
});
|
|
251
|
+
return { stream, result };
|
|
252
|
+
}));
|
|
253
|
+
const nextStreams = streams.map((stream) => ({ ...stream }));
|
|
254
|
+
const offsets = pages.map((page) => page?.stream.offset ?? 0);
|
|
255
|
+
const page = mergeRoadmapPages(pages, offsets, paginationOpts.numItems);
|
|
256
|
+
for (const [index, value] of pages.entries()) {
|
|
257
|
+
if (value === null)
|
|
258
|
+
continue;
|
|
259
|
+
const stream = nextStreams[index];
|
|
260
|
+
const result = value.result;
|
|
261
|
+
const consumed = offsets[index] - value.stream.offset;
|
|
262
|
+
const pageExhausted = offsets[index] >= result.page.length;
|
|
263
|
+
stream.generation = result.generation;
|
|
264
|
+
if (pageExhausted) {
|
|
265
|
+
stream.done = result.isDone;
|
|
266
|
+
if (result.isDone) {
|
|
267
|
+
// Keep the source page boundary even when the paginator uses "[]" as
|
|
268
|
+
// its terminal cursor, so a bound previous-page query can reproduce
|
|
269
|
+
// exactly the same range.
|
|
270
|
+
stream.cursor = value.stream.cursor;
|
|
271
|
+
stream.offset = result.page.length;
|
|
272
|
+
}
|
|
273
|
+
else {
|
|
274
|
+
stream.cursor = result.continueCursor;
|
|
275
|
+
stream.offset = 0;
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
else {
|
|
279
|
+
stream.done = false;
|
|
280
|
+
stream.cursor = value.stream.cursor;
|
|
281
|
+
stream.offset = value.stream.offset + consumed;
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
const nextCursor = {
|
|
285
|
+
version: 1,
|
|
286
|
+
streams: nextStreams,
|
|
287
|
+
};
|
|
288
|
+
return {
|
|
289
|
+
page,
|
|
290
|
+
isDone: nextStreams.every((stream) => stream.done),
|
|
291
|
+
continueCursor: encodeRoadmapListCursor(nextCursor),
|
|
292
|
+
};
|
|
293
|
+
}
|
|
294
|
+
export const get = query({
|
|
295
|
+
args: { roadmapId: v.id("roadmap") },
|
|
296
|
+
returns: v.union(roadmapItemValidator, v.null()),
|
|
297
|
+
handler: async (ctx, args) => {
|
|
298
|
+
const item = await ctx.db.get("roadmap", args.roadmapId);
|
|
299
|
+
if (item === null || item.deletingAt !== undefined)
|
|
300
|
+
return null;
|
|
301
|
+
const state = await getRebalanceState(ctx, item.status);
|
|
302
|
+
return serializeRoadmapItem(item, state?.visibleGeneration === undefined
|
|
303
|
+
? undefined
|
|
304
|
+
: item.rebalancePosition);
|
|
305
|
+
},
|
|
306
|
+
});
|
|
79
307
|
export const list = query({
|
|
80
308
|
args: {
|
|
81
309
|
paginationOpts: paginationOptsValidator,
|
|
@@ -85,27 +313,13 @@ export const list = query({
|
|
|
85
313
|
handler: async (ctx, args) => {
|
|
86
314
|
const db = paginator(ctx.db, schema);
|
|
87
315
|
const status = args.status;
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
.eq("deletingAt", undefined)
|
|
96
|
-
.eq("rebalanceId", visibleGeneration))
|
|
97
|
-
: status === undefined
|
|
98
|
-
? db
|
|
99
|
-
.query("roadmap")
|
|
100
|
-
.withIndex("by_deleting_at_and_position", (q) => q.eq("deletingAt", undefined))
|
|
101
|
-
: db
|
|
102
|
-
.query("roadmap")
|
|
103
|
-
.withIndex("by_status_deleting_at_position", (q) => q.eq("status", status).eq("deletingAt", undefined));
|
|
104
|
-
const result = await roadmapQuery.paginate(args.paginationOpts);
|
|
105
|
-
return {
|
|
106
|
-
...result,
|
|
107
|
-
page: result.page.map((item) => serializeRoadmapItem(item, visibleGeneration === undefined ? undefined : item.rebalancePosition)),
|
|
108
|
-
};
|
|
316
|
+
if (status === undefined) {
|
|
317
|
+
return await paginateUnfilteredRoadmap(ctx, db, args.paginationOpts);
|
|
318
|
+
}
|
|
319
|
+
const result = await paginateRoadmapStatus(ctx, db, status, args.paginationOpts);
|
|
320
|
+
const { generation: _generation, ...publicResult } = result;
|
|
321
|
+
void _generation;
|
|
322
|
+
return publicResult;
|
|
109
323
|
},
|
|
110
324
|
});
|
|
111
325
|
export const search = query({
|
|
@@ -442,6 +656,9 @@ async function attachFeedbackRecord(ctx, roadmapId, entryId) {
|
|
|
442
656
|
}
|
|
443
657
|
if (entry === null)
|
|
444
658
|
throw new ConvexError("Entry not found.");
|
|
659
|
+
if (entry.deletingAt !== undefined) {
|
|
660
|
+
throw new ConvexError("Entry is being deleted.");
|
|
661
|
+
}
|
|
445
662
|
if (entry.roadmapId === roadmapId)
|
|
446
663
|
return;
|
|
447
664
|
const now = Date.now();
|
|
@@ -529,6 +746,7 @@ export const listFeedback = query({
|
|
|
529
746
|
.query("entries")
|
|
530
747
|
.withIndex("by_roadmap_id", (q) => q.eq("roadmapId", args.roadmapId))
|
|
531
748
|
.order("desc")
|
|
749
|
+
.filterWith((entry) => Promise.resolve(entry.deletingAt === undefined))
|
|
532
750
|
.paginate(args.paginationOpts);
|
|
533
751
|
return {
|
|
534
752
|
...result,
|