@igstack/app-catalog-backend-core 6.3.1-alpha-20261003051755 → 6.5.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/dist/db/syncAppCatalog.mjs +1 -0
- package/dist/db/syncAppCatalog.mjs.map +1 -1
- package/dist/generated/prisma/client.mjs.map +1 -1
- package/dist/generated/prisma/commonInputTypes.d.mts +72 -72
- package/dist/generated/prisma/commonInputTypes.d.mts.map +1 -1
- package/dist/generated/prisma/internal/class.d.mts +17 -5
- package/dist/generated/prisma/internal/class.d.mts.map +1 -1
- package/dist/generated/prisma/internal/class.mjs +4 -4
- package/dist/generated/prisma/internal/class.mjs.map +1 -1
- package/dist/generated/prisma/internal/prismaNamespace.d.mts +145 -51
- package/dist/generated/prisma/internal/prismaNamespace.d.mts.map +1 -1
- package/dist/generated/prisma/models/DbApprovalMethod.d.mts +30 -3
- package/dist/generated/prisma/models/DbApprovalMethod.d.mts.map +1 -1
- package/dist/generated/prisma/models/DbAsset.d.mts +2 -11
- package/dist/generated/prisma/models/DbAsset.d.mts.map +1 -1
- package/dist/generated/prisma/models/DbFeedback.d.mts +1565 -0
- package/dist/generated/prisma/models/DbFeedback.d.mts.map +1 -0
- package/dist/generated/prisma/models/DbFeedbackAttachment.d.mts +1431 -0
- package/dist/generated/prisma/models/DbFeedbackAttachment.d.mts.map +1 -0
- package/dist/generated/prisma/models/DbResource.d.mts +108 -60
- package/dist/generated/prisma/models/DbResource.d.mts.map +1 -1
- package/dist/generated/prisma/models/SourceReference.d.mts +1 -1
- package/dist/generated/prisma/models.d.mts +4 -3
- package/dist/index.d.mts +5 -3
- package/dist/index.mjs +5 -3
- package/dist/middleware/createAcMiddleware.mjs +2 -2
- package/dist/middleware/createAcMiddleware.mjs.map +1 -1
- package/dist/middleware/featureRegistry.mjs +3 -1
- package/dist/middleware/featureRegistry.mjs.map +1 -1
- package/dist/modules/appCatalog/service.d.mts.map +1 -1
- package/dist/modules/appCatalog/service.mjs +1 -0
- package/dist/modules/appCatalog/service.mjs.map +1 -1
- package/dist/modules/feedback/feedbackAttachmentController.d.mts +22 -0
- package/dist/modules/feedback/feedbackAttachmentController.d.mts.map +1 -0
- package/dist/modules/feedback/feedbackAttachmentController.mjs +192 -0
- package/dist/modules/feedback/feedbackAttachmentController.mjs.map +1 -0
- package/dist/modules/feedback/feedbackRouter.d.mts +54 -0
- package/dist/modules/feedback/feedbackRouter.d.mts.map +1 -0
- package/dist/modules/feedback/feedbackRouter.mjs +59 -0
- package/dist/modules/feedback/feedbackRouter.mjs.map +1 -0
- package/dist/modules/feedback/service.d.mts +42 -0
- package/dist/modules/feedback/service.d.mts.map +1 -0
- package/dist/modules/feedback/service.mjs +165 -0
- package/dist/modules/feedback/service.mjs.map +1 -0
- package/dist/modules/visitor/visitorIdentity.d.mts +86 -0
- package/dist/modules/visitor/visitorIdentity.d.mts.map +1 -0
- package/dist/modules/{comments → visitor}/visitorIdentity.mjs +53 -2
- package/dist/modules/visitor/visitorIdentity.mjs.map +1 -0
- package/dist/server/acTrpcContext.d.mts +8 -7
- package/dist/server/acTrpcContext.d.mts.map +1 -1
- package/dist/server/acTrpcContext.mjs +2 -2
- package/dist/server/acTrpcContext.mjs.map +1 -1
- package/dist/server/controller.d.mts +15 -8
- package/dist/server/controller.d.mts.map +1 -1
- package/dist/server/controller.mjs +2 -2
- package/dist/server/controller.mjs.map +1 -1
- package/dist/types/common/appCatalogTypes.d.mts +12 -0
- package/dist/types/common/appCatalogTypes.d.mts.map +1 -1
- package/dist/types/common/approvalMethodTypes.d.mts +12 -0
- package/dist/types/common/approvalMethodTypes.d.mts.map +1 -1
- package/package.json +5 -5
- package/prisma/migrations/20261004000000_feedback_replaces_comments/migration.sql +74 -0
- package/prisma/schema.prisma +84 -24
- package/src/__tests__/feedbackAttachmentUpload.test.ts +192 -0
- package/src/__tests__/{comments.test.ts → visitorIdentity.test.ts} +1 -1
- package/src/db/syncAppCatalog.ts +1 -0
- package/src/generated/prisma/browser.ts +22 -7
- package/src/generated/prisma/client.ts +22 -7
- package/src/generated/prisma/commonInputTypes.ts +85 -85
- package/src/generated/prisma/internal/class.ts +18 -8
- package/src/generated/prisma/internal/prismaNamespace.ts +143 -47
- package/src/generated/prisma/internal/prismaNamespaceBrowser.ts +24 -3
- package/src/generated/prisma/models/DbApprovalMethod.ts +29 -1
- package/src/generated/prisma/models/DbAsset.ts +0 -12
- package/src/generated/prisma/models/DbFeedback.ts +1814 -0
- package/src/generated/prisma/models/DbFeedbackAttachment.ts +1661 -0
- package/src/generated/prisma/models/DbResource.ts +107 -58
- package/src/generated/prisma/models.ts +2 -1
- package/src/index.ts +24 -4
- package/src/middleware/createAcMiddleware.ts +4 -3
- package/src/middleware/featureRegistry.ts +7 -0
- package/src/modules/appCatalog/service.ts +1 -0
- package/src/modules/feedback/feedbackAttachmentController.ts +248 -0
- package/src/modules/feedback/feedbackRouter.ts +102 -0
- package/src/modules/feedback/service.ts +295 -0
- package/src/modules/{comments → visitor}/visitorIdentity.ts +84 -0
- package/src/server/acTrpcContext.ts +9 -8
- package/src/server/controller.ts +2 -2
- package/src/types/common/appCatalogTypes.ts +12 -0
- package/src/types/common/approvalMethodTypes.ts +12 -0
- package/dist/generated/prisma/models/DbComment.d.mts +0 -1340
- package/dist/generated/prisma/models/DbComment.d.mts.map +0 -1
- package/dist/modules/comments/commentsRouter.d.mts +0 -47
- package/dist/modules/comments/commentsRouter.d.mts.map +0 -1
- package/dist/modules/comments/commentsRouter.mjs +0 -55
- package/dist/modules/comments/commentsRouter.mjs.map +0 -1
- package/dist/modules/comments/service.d.mts +0 -40
- package/dist/modules/comments/service.d.mts.map +0 -1
- package/dist/modules/comments/service.mjs +0 -88
- package/dist/modules/comments/service.mjs.map +0 -1
- package/dist/modules/comments/visitorIdentity.d.mts +0 -15
- package/dist/modules/comments/visitorIdentity.d.mts.map +0 -1
- package/dist/modules/comments/visitorIdentity.mjs.map +0 -1
- package/src/generated/prisma/models/DbComment.ts +0 -1561
- package/src/modules/comments/commentsRouter.ts +0 -85
- package/src/modules/comments/service.ts +0 -174
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"DbComment.d.mts","names":[],"sources":["../../../../src/generated/prisma/models/DbComment.ts"],"mappings":"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"}
|
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
import { AcTrpcContext } from "../../server/acTrpcContext.mjs";
|
|
2
|
-
import { CommentView } from "./service.mjs";
|
|
3
|
-
import * as _trpc_server0 from "@trpc/server";
|
|
4
|
-
|
|
5
|
-
//#region src/modules/comments/commentsRouter.d.ts
|
|
6
|
-
declare function createCommentsRouter(): _trpc_server0.TRPCBuiltRouter<{
|
|
7
|
-
ctx: AcTrpcContext;
|
|
8
|
-
meta: object;
|
|
9
|
-
errorShape: _trpc_server0.TRPCDefaultErrorShape;
|
|
10
|
-
transformer: false;
|
|
11
|
-
}, _trpc_server0.TRPCDecorateCreateRouterOptions<{
|
|
12
|
-
list: _trpc_server0.TRPCQueryProcedure<{
|
|
13
|
-
input: {
|
|
14
|
-
resourceSlug: string;
|
|
15
|
-
};
|
|
16
|
-
output: CommentView[];
|
|
17
|
-
meta: object;
|
|
18
|
-
}>;
|
|
19
|
-
add: _trpc_server0.TRPCMutationProcedure<{
|
|
20
|
-
input: {
|
|
21
|
-
resourceSlug: string;
|
|
22
|
-
body: string;
|
|
23
|
-
};
|
|
24
|
-
output: CommentView;
|
|
25
|
-
meta: object;
|
|
26
|
-
}>;
|
|
27
|
-
edit: _trpc_server0.TRPCMutationProcedure<{
|
|
28
|
-
input: {
|
|
29
|
-
id: string;
|
|
30
|
-
body: string;
|
|
31
|
-
};
|
|
32
|
-
output: CommentView;
|
|
33
|
-
meta: object;
|
|
34
|
-
}>;
|
|
35
|
-
remove: _trpc_server0.TRPCMutationProcedure<{
|
|
36
|
-
input: {
|
|
37
|
-
id: string;
|
|
38
|
-
};
|
|
39
|
-
output: {
|
|
40
|
-
id: string;
|
|
41
|
-
};
|
|
42
|
-
meta: object;
|
|
43
|
-
}>;
|
|
44
|
-
}>>;
|
|
45
|
-
//#endregion
|
|
46
|
-
export { createCommentsRouter };
|
|
47
|
-
//# sourceMappingURL=commentsRouter.d.mts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"commentsRouter.d.mts","names":[],"sources":["../../../src/modules/comments/commentsRouter.ts"],"mappings":";;;;;iBAoDgB,oBAAA,CAAA,iBAAoB,eAAA;OAAA,aAAA"}
|
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
import { publicProcedure, router } from "../../server/trpcSetup.mjs";
|
|
2
|
-
import { CommentError, MAX_BODY_LENGTH, addComment, deleteComment, editComment, listComments } from "./service.mjs";
|
|
3
|
-
import { TRPCError } from "@trpc/server";
|
|
4
|
-
import { z } from "zod";
|
|
5
|
-
|
|
6
|
-
//#region src/modules/comments/commentsRouter.ts
|
|
7
|
-
const bodyInput = z.string().min(1).max(MAX_BODY_LENGTH);
|
|
8
|
-
/**
|
|
9
|
-
* Writing needs a visitor token, and the token is issued on the request that reads
|
|
10
|
-
* the comment list — so by the time anyone can click Post, the cookie exists. A
|
|
11
|
-
* missing one here means cookies are blocked, which no error code describes well;
|
|
12
|
-
* PRECONDITION_FAILED at least separates it from a permission problem.
|
|
13
|
-
*/
|
|
14
|
-
function requireVisitor(visitor) {
|
|
15
|
-
if (!visitor) throw new TRPCError({
|
|
16
|
-
code: "PRECONDITION_FAILED",
|
|
17
|
-
message: "Commenting needs cookies enabled"
|
|
18
|
-
});
|
|
19
|
-
return visitor;
|
|
20
|
-
}
|
|
21
|
-
const REASON_CODES = {
|
|
22
|
-
"not-found": "NOT_FOUND",
|
|
23
|
-
"not-author": "FORBIDDEN",
|
|
24
|
-
"window-closed": "FORBIDDEN",
|
|
25
|
-
empty: "BAD_REQUEST"
|
|
26
|
-
};
|
|
27
|
-
async function mapErrors(work) {
|
|
28
|
-
try {
|
|
29
|
-
return await work();
|
|
30
|
-
} catch (error) {
|
|
31
|
-
if (error instanceof CommentError) throw new TRPCError({
|
|
32
|
-
code: REASON_CODES[error.reason],
|
|
33
|
-
message: error.message
|
|
34
|
-
});
|
|
35
|
-
throw error;
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
function createCommentsRouter() {
|
|
39
|
-
return router({
|
|
40
|
-
list: publicProcedure.input(z.object({ resourceSlug: z.string() })).query(({ input, ctx }) => listComments(input.resourceSlug, ctx.visitor)),
|
|
41
|
-
add: publicProcedure.input(z.object({
|
|
42
|
-
resourceSlug: z.string(),
|
|
43
|
-
body: bodyInput
|
|
44
|
-
})).mutation(({ input, ctx }) => mapErrors(() => addComment(input.resourceSlug, input.body, requireVisitor(ctx.visitor)))),
|
|
45
|
-
edit: publicProcedure.input(z.object({
|
|
46
|
-
id: z.string(),
|
|
47
|
-
body: bodyInput
|
|
48
|
-
})).mutation(({ input, ctx }) => mapErrors(() => editComment(input.id, input.body, requireVisitor(ctx.visitor)))),
|
|
49
|
-
remove: publicProcedure.input(z.object({ id: z.string() })).mutation(({ input, ctx }) => mapErrors(() => deleteComment(input.id, requireVisitor(ctx.visitor))))
|
|
50
|
-
});
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
//#endregion
|
|
54
|
-
export { createCommentsRouter };
|
|
55
|
-
//# sourceMappingURL=commentsRouter.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"commentsRouter.mjs","names":[],"sources":["../../../src/modules/comments/commentsRouter.ts"],"sourcesContent":["import { TRPCError } from '@trpc/server'\nimport { z } from 'zod'\nimport { publicProcedure, router } from '../../server/trpcSetup'\nimport type { Visitor } from './visitorIdentity'\nimport {\n CommentError,\n MAX_BODY_LENGTH,\n addComment,\n deleteComment,\n editComment,\n listComments,\n} from './service'\n\nconst bodyInput = z.string().min(1).max(MAX_BODY_LENGTH)\n\n/**\n * Writing needs a visitor token, and the token is issued on the request that reads\n * the comment list — so by the time anyone can click Post, the cookie exists. A\n * missing one here means cookies are blocked, which no error code describes well;\n * PRECONDITION_FAILED at least separates it from a permission problem.\n */\nfunction requireVisitor(visitor: Visitor | null): Visitor {\n if (!visitor) {\n throw new TRPCError({\n code: 'PRECONDITION_FAILED',\n message: 'Commenting needs cookies enabled',\n })\n }\n return visitor\n}\n\nconst REASON_CODES = {\n 'not-found': 'NOT_FOUND',\n 'not-author': 'FORBIDDEN',\n 'window-closed': 'FORBIDDEN',\n empty: 'BAD_REQUEST',\n} as const\n\nasync function mapErrors<T>(work: () => Promise<T>): Promise<T> {\n try {\n return await work()\n } catch (error) {\n if (error instanceof CommentError) {\n throw new TRPCError({\n code: REASON_CODES[error.reason],\n message: error.message,\n })\n }\n throw error\n }\n}\n\nexport function createCommentsRouter() {\n return router({\n list: publicProcedure\n .input(z.object({ resourceSlug: z.string() }))\n .query(({ input, ctx }) => listComments(input.resourceSlug, ctx.visitor)),\n\n add: publicProcedure\n .input(z.object({ resourceSlug: z.string(), body: bodyInput }))\n .mutation(({ input, ctx }) =>\n mapErrors(() =>\n addComment(\n input.resourceSlug,\n input.body,\n requireVisitor(ctx.visitor),\n ),\n ),\n ),\n\n edit: publicProcedure\n .input(z.object({ id: z.string(), body: bodyInput }))\n .mutation(({ input, ctx }) =>\n mapErrors(() =>\n editComment(input.id, input.body, requireVisitor(ctx.visitor)),\n ),\n ),\n\n remove: publicProcedure\n .input(z.object({ id: z.string() }))\n .mutation(({ input, ctx }) =>\n mapErrors(() => deleteComment(input.id, requireVisitor(ctx.visitor))),\n ),\n })\n}\n"],"mappings":";;;;;;AAaA,MAAM,YAAY,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC,IAAI,gBAAgB;;;;;;;AAQxD,SAAS,eAAe,SAAkC;AACxD,KAAI,CAAC,QACH,OAAM,IAAI,UAAU;EAClB,MAAM;EACN,SAAS;EACV,CAAC;AAEJ,QAAO;;AAGT,MAAM,eAAe;CACnB,aAAa;CACb,cAAc;CACd,iBAAiB;CACjB,OAAO;CACR;AAED,eAAe,UAAa,MAAoC;AAC9D,KAAI;AACF,SAAO,MAAM,MAAM;UACZ,OAAO;AACd,MAAI,iBAAiB,aACnB,OAAM,IAAI,UAAU;GAClB,MAAM,aAAa,MAAM;GACzB,SAAS,MAAM;GAChB,CAAC;AAEJ,QAAM;;;AAIV,SAAgB,uBAAuB;AACrC,QAAO,OAAO;EACZ,MAAM,gBACH,MAAM,EAAE,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,CAAC,CAAC,CAC7C,OAAO,EAAE,OAAO,UAAU,aAAa,MAAM,cAAc,IAAI,QAAQ,CAAC;EAE3E,KAAK,gBACF,MAAM,EAAE,OAAO;GAAE,cAAc,EAAE,QAAQ;GAAE,MAAM;GAAW,CAAC,CAAC,CAC9D,UAAU,EAAE,OAAO,UAClB,gBACE,WACE,MAAM,cACN,MAAM,MACN,eAAe,IAAI,QAAQ,CAC5B,CACF,CACF;EAEH,MAAM,gBACH,MAAM,EAAE,OAAO;GAAE,IAAI,EAAE,QAAQ;GAAE,MAAM;GAAW,CAAC,CAAC,CACpD,UAAU,EAAE,OAAO,UAClB,gBACE,YAAY,MAAM,IAAI,MAAM,MAAM,eAAe,IAAI,QAAQ,CAAC,CAC/D,CACF;EAEH,QAAQ,gBACL,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,CACnC,UAAU,EAAE,OAAO,UAClB,gBAAgB,cAAc,MAAM,IAAI,eAAe,IAAI,QAAQ,CAAC,CAAC,CACtE;EACJ,CAAC"}
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
//#region src/modules/comments/service.d.ts
|
|
2
|
-
/** How long an author may edit or delete their own comment. */
|
|
3
|
-
declare const EDIT_WINDOW_MS: number;
|
|
4
|
-
declare const MAX_BODY_LENGTH = 1000;
|
|
5
|
-
/**
|
|
6
|
-
* What a maintainer did with a comment. Null while nobody has looked at it.
|
|
7
|
-
*
|
|
8
|
-
* Mirrors the Prisma enum rather than importing it, so the view type stays
|
|
9
|
-
* usable on the client.
|
|
10
|
-
*/
|
|
11
|
-
type CommentStatus = 'applied' | 'acknowledged';
|
|
12
|
-
/** One comment as a client sees it. Never carries an author hash. */
|
|
13
|
-
interface CommentView {
|
|
14
|
-
id: string;
|
|
15
|
-
authorName: string;
|
|
16
|
-
body: string;
|
|
17
|
-
createdAt: string;
|
|
18
|
-
/** Null when the comment has never been edited. */
|
|
19
|
-
editedAt: string | null;
|
|
20
|
-
/**
|
|
21
|
-
* Null until a maintainer reviews the comment. `applied` is deliberately
|
|
22
|
-
* visible to everyone: it tells the next reader that comments reach a human
|
|
23
|
-
* and change the catalog.
|
|
24
|
-
*/
|
|
25
|
-
status: CommentStatus | null;
|
|
26
|
-
/** One answer from the maintainers, or null. */
|
|
27
|
-
reviewerReply: string | null;
|
|
28
|
-
/** Whether this browser wrote it — what makes Edit and Delete appear. */
|
|
29
|
-
isMine: boolean;
|
|
30
|
-
/**
|
|
31
|
-
* The absolute instant this browser's edit window closes, or null when it is not
|
|
32
|
-
* this browser's comment. Absolute rather than a remaining duration so a client
|
|
33
|
-
* with a skewed clock still hides the controls at the same moment the server
|
|
34
|
-
* starts refusing the edit.
|
|
35
|
-
*/
|
|
36
|
-
canEditUntil: string | null;
|
|
37
|
-
}
|
|
38
|
-
//#endregion
|
|
39
|
-
export { CommentView, EDIT_WINDOW_MS, MAX_BODY_LENGTH };
|
|
40
|
-
//# sourceMappingURL=service.d.mts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"service.d.mts","names":[],"sources":["../../../src/modules/comments/service.ts"],"mappings":";AAIA;AAAA,cAAa,cAAA;AAAA,cAEA,eAAA;;;AAAb;;;;KAQY,aAAA;AAAZ;AAAA,UAGiB,WAAA;EACf,EAAA;EACA,UAAA;EACA,IAAA;EACA,SAAA;EAJ0B;EAM1B,QAAA;EAMqB;;;;;EAArB,MAAA,EAAQ,aAAA;EAAR;EAEA,aAAA;EAAA;EAEA,MAAA;EAOA;;;;;;EAAA,YAAA;AAAA"}
|
|
@@ -1,88 +0,0 @@
|
|
|
1
|
-
import { getDbClient } from "../../db/client.mjs";
|
|
2
|
-
|
|
3
|
-
//#region src/modules/comments/service.ts
|
|
4
|
-
/** How long an author may edit or delete their own comment. */
|
|
5
|
-
const EDIT_WINDOW_MS = 3600 * 1e3;
|
|
6
|
-
const MAX_BODY_LENGTH = 1e3;
|
|
7
|
-
function toView(row, visitor) {
|
|
8
|
-
const isMine = !!visitor && row.authorHash === visitor.hash;
|
|
9
|
-
return {
|
|
10
|
-
id: row.id,
|
|
11
|
-
authorName: row.authorAlias,
|
|
12
|
-
body: row.body,
|
|
13
|
-
createdAt: row.createdAt.toISOString(),
|
|
14
|
-
editedAt: row.editedAt?.toISOString() ?? null,
|
|
15
|
-
status: row.status ?? null,
|
|
16
|
-
reviewerReply: row.reviewerReply ?? null,
|
|
17
|
-
isMine,
|
|
18
|
-
canEditUntil: isMine ? new Date(row.createdAt.getTime() + EDIT_WINDOW_MS).toISOString() : null
|
|
19
|
-
};
|
|
20
|
-
}
|
|
21
|
-
async function resourceIdForSlug(slug) {
|
|
22
|
-
return (await getDbClient().dbResource.findUnique({
|
|
23
|
-
where: { slug },
|
|
24
|
-
select: { id: true }
|
|
25
|
-
}))?.id ?? null;
|
|
26
|
-
}
|
|
27
|
-
/** Oldest first: a comment thread reads top to bottom. */
|
|
28
|
-
async function listComments(resourceSlug, visitor) {
|
|
29
|
-
const resourceId = await resourceIdForSlug(resourceSlug);
|
|
30
|
-
if (!resourceId) return [];
|
|
31
|
-
return (await getDbClient().dbComment.findMany({
|
|
32
|
-
where: { resourceId },
|
|
33
|
-
orderBy: { createdAt: "asc" }
|
|
34
|
-
})).map((row) => toView(row, visitor));
|
|
35
|
-
}
|
|
36
|
-
var CommentError = class extends Error {
|
|
37
|
-
constructor(reason, message) {
|
|
38
|
-
super(message);
|
|
39
|
-
this.reason = reason;
|
|
40
|
-
}
|
|
41
|
-
};
|
|
42
|
-
function normaliseBody(body) {
|
|
43
|
-
const trimmed = body.trim();
|
|
44
|
-
if (!trimmed) throw new CommentError("empty", "A comment cannot be empty");
|
|
45
|
-
return trimmed.slice(0, MAX_BODY_LENGTH);
|
|
46
|
-
}
|
|
47
|
-
async function addComment(resourceSlug, body, visitor) {
|
|
48
|
-
const resourceId = await resourceIdForSlug(resourceSlug);
|
|
49
|
-
if (!resourceId) throw new CommentError("not-found", `Unknown resource: ${resourceSlug}`);
|
|
50
|
-
return toView(await getDbClient().dbComment.create({ data: {
|
|
51
|
-
resourceId,
|
|
52
|
-
authorHash: visitor.hash,
|
|
53
|
-
authorAlias: visitor.alias,
|
|
54
|
-
body: normaliseBody(body)
|
|
55
|
-
} }), visitor);
|
|
56
|
-
}
|
|
57
|
-
/**
|
|
58
|
-
* Load a comment and check this visitor may still change it.
|
|
59
|
-
*
|
|
60
|
-
* The window is enforced here, not in the UI: the controls disappearing is a
|
|
61
|
-
* courtesy, and a request that arrives a second late must still be refused.
|
|
62
|
-
*/
|
|
63
|
-
async function loadOwn(id, visitor) {
|
|
64
|
-
const row = await getDbClient().dbComment.findUnique({ where: { id } });
|
|
65
|
-
if (!row) throw new CommentError("not-found", "Comment no longer exists");
|
|
66
|
-
if (row.authorHash !== visitor.hash) throw new CommentError("not-author", "Only the author can change a comment");
|
|
67
|
-
if (Date.now() > row.createdAt.getTime() + 36e5) throw new CommentError("window-closed", "A comment can only be changed in the first hour");
|
|
68
|
-
return row;
|
|
69
|
-
}
|
|
70
|
-
async function editComment(id, body, visitor) {
|
|
71
|
-
await loadOwn(id, visitor);
|
|
72
|
-
return toView(await getDbClient().dbComment.update({
|
|
73
|
-
where: { id },
|
|
74
|
-
data: {
|
|
75
|
-
body: normaliseBody(body),
|
|
76
|
-
editedAt: /* @__PURE__ */ new Date()
|
|
77
|
-
}
|
|
78
|
-
}), visitor);
|
|
79
|
-
}
|
|
80
|
-
async function deleteComment(id, visitor) {
|
|
81
|
-
await loadOwn(id, visitor);
|
|
82
|
-
await getDbClient().dbComment.delete({ where: { id } });
|
|
83
|
-
return { id };
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
//#endregion
|
|
87
|
-
export { CommentError, EDIT_WINDOW_MS, MAX_BODY_LENGTH, addComment, deleteComment, editComment, listComments };
|
|
88
|
-
//# sourceMappingURL=service.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"service.mjs","names":[],"sources":["../../../src/modules/comments/service.ts"],"sourcesContent":["import { getDbClient } from '../../db/client'\nimport type { Visitor } from './visitorIdentity'\n\n/** How long an author may edit or delete their own comment. */\nexport const EDIT_WINDOW_MS = 60 * 60 * 1000\n\nexport const MAX_BODY_LENGTH = 1000\n\n/**\n * What a maintainer did with a comment. Null while nobody has looked at it.\n *\n * Mirrors the Prisma enum rather than importing it, so the view type stays\n * usable on the client.\n */\nexport type CommentStatus = 'applied' | 'acknowledged'\n\n/** One comment as a client sees it. Never carries an author hash. */\nexport interface CommentView {\n id: string\n authorName: string\n body: string\n createdAt: string\n /** Null when the comment has never been edited. */\n editedAt: string | null\n /**\n * Null until a maintainer reviews the comment. `applied` is deliberately\n * visible to everyone: it tells the next reader that comments reach a human\n * and change the catalog.\n */\n status: CommentStatus | null\n /** One answer from the maintainers, or null. */\n reviewerReply: string | null\n /** Whether this browser wrote it — what makes Edit and Delete appear. */\n isMine: boolean\n /**\n * The absolute instant this browser's edit window closes, or null when it is not\n * this browser's comment. Absolute rather than a remaining duration so a client\n * with a skewed clock still hides the controls at the same moment the server\n * starts refusing the edit.\n */\n canEditUntil: string | null\n}\n\nfunction toView(\n row: {\n id: string\n authorHash: string\n authorAlias: string\n body: string\n editedAt: Date | null\n createdAt: Date\n status?: CommentStatus | null\n reviewerReply?: string | null\n },\n visitor: Visitor | null,\n): CommentView {\n const isMine = !!visitor && row.authorHash === visitor.hash\n return {\n id: row.id,\n authorName: row.authorAlias,\n body: row.body,\n createdAt: row.createdAt.toISOString(),\n editedAt: row.editedAt?.toISOString() ?? null,\n status: row.status ?? null,\n reviewerReply: row.reviewerReply ?? null,\n isMine,\n canEditUntil: isMine\n ? new Date(row.createdAt.getTime() + EDIT_WINDOW_MS).toISOString()\n : null,\n }\n}\n\nasync function resourceIdForSlug(slug: string): Promise<string | null> {\n const resource = await getDbClient().dbResource.findUnique({\n where: { slug },\n select: { id: true },\n })\n return resource?.id ?? null\n}\n\n/** Oldest first: a comment thread reads top to bottom. */\nexport async function listComments(\n resourceSlug: string,\n visitor: Visitor | null,\n): Promise<CommentView[]> {\n const resourceId = await resourceIdForSlug(resourceSlug)\n if (!resourceId) return []\n\n const rows = await getDbClient().dbComment.findMany({\n where: { resourceId },\n orderBy: { createdAt: 'asc' },\n })\n return rows.map((row) => toView(row, visitor))\n}\n\nexport class CommentError extends Error {\n constructor(\n readonly reason: 'not-found' | 'not-author' | 'window-closed' | 'empty',\n message: string,\n ) {\n super(message)\n }\n}\n\nfunction normaliseBody(body: string): string {\n const trimmed = body.trim()\n if (!trimmed) throw new CommentError('empty', 'A comment cannot be empty')\n return trimmed.slice(0, MAX_BODY_LENGTH)\n}\n\nexport async function addComment(\n resourceSlug: string,\n body: string,\n visitor: Visitor,\n): Promise<CommentView> {\n const resourceId = await resourceIdForSlug(resourceSlug)\n if (!resourceId) {\n throw new CommentError('not-found', `Unknown resource: ${resourceSlug}`)\n }\n\n const row = await getDbClient().dbComment.create({\n data: {\n resourceId,\n authorHash: visitor.hash,\n authorAlias: visitor.alias,\n body: normaliseBody(body),\n },\n })\n return toView(row, visitor)\n}\n\n/**\n * Load a comment and check this visitor may still change it.\n *\n * The window is enforced here, not in the UI: the controls disappearing is a\n * courtesy, and a request that arrives a second late must still be refused.\n */\nasync function loadOwn(id: string, visitor: Visitor) {\n const row = await getDbClient().dbComment.findUnique({ where: { id } })\n if (!row) throw new CommentError('not-found', 'Comment no longer exists')\n if (row.authorHash !== visitor.hash) {\n throw new CommentError('not-author', 'Only the author can change a comment')\n }\n if (Date.now() > row.createdAt.getTime() + EDIT_WINDOW_MS) {\n throw new CommentError(\n 'window-closed',\n 'A comment can only be changed in the first hour',\n )\n }\n return row\n}\n\nexport async function editComment(\n id: string,\n body: string,\n visitor: Visitor,\n): Promise<CommentView> {\n await loadOwn(id, visitor)\n\n const row = await getDbClient().dbComment.update({\n where: { id },\n data: { body: normaliseBody(body), editedAt: new Date() },\n })\n return toView(row, visitor)\n}\n\nexport async function deleteComment(\n id: string,\n visitor: Visitor,\n): Promise<{ id: string }> {\n await loadOwn(id, visitor)\n await getDbClient().dbComment.delete({ where: { id } })\n return { id }\n}\n"],"mappings":";;;;AAIA,MAAa,iBAAiB,OAAU;AAExC,MAAa,kBAAkB;AAqC/B,SAAS,OACP,KAUA,SACa;CACb,MAAM,SAAS,CAAC,CAAC,WAAW,IAAI,eAAe,QAAQ;AACvD,QAAO;EACL,IAAI,IAAI;EACR,YAAY,IAAI;EAChB,MAAM,IAAI;EACV,WAAW,IAAI,UAAU,aAAa;EACtC,UAAU,IAAI,UAAU,aAAa,IAAI;EACzC,QAAQ,IAAI,UAAU;EACtB,eAAe,IAAI,iBAAiB;EACpC;EACA,cAAc,SACV,IAAI,KAAK,IAAI,UAAU,SAAS,GAAG,eAAe,CAAC,aAAa,GAChE;EACL;;AAGH,eAAe,kBAAkB,MAAsC;AAKrE,SAJiB,MAAM,aAAa,CAAC,WAAW,WAAW;EACzD,OAAO,EAAE,MAAM;EACf,QAAQ,EAAE,IAAI,MAAM;EACrB,CAAC,GACe,MAAM;;;AAIzB,eAAsB,aACpB,cACA,SACwB;CACxB,MAAM,aAAa,MAAM,kBAAkB,aAAa;AACxD,KAAI,CAAC,WAAY,QAAO,EAAE;AAM1B,SAJa,MAAM,aAAa,CAAC,UAAU,SAAS;EAClD,OAAO,EAAE,YAAY;EACrB,SAAS,EAAE,WAAW,OAAO;EAC9B,CAAC,EACU,KAAK,QAAQ,OAAO,KAAK,QAAQ,CAAC;;AAGhD,IAAa,eAAb,cAAkC,MAAM;CACtC,YACE,AAAS,QACT,SACA;AACA,QAAM,QAAQ;EAHL;;;AAOb,SAAS,cAAc,MAAsB;CAC3C,MAAM,UAAU,KAAK,MAAM;AAC3B,KAAI,CAAC,QAAS,OAAM,IAAI,aAAa,SAAS,4BAA4B;AAC1E,QAAO,QAAQ,MAAM,GAAG,gBAAgB;;AAG1C,eAAsB,WACpB,cACA,MACA,SACsB;CACtB,MAAM,aAAa,MAAM,kBAAkB,aAAa;AACxD,KAAI,CAAC,WACH,OAAM,IAAI,aAAa,aAAa,qBAAqB,eAAe;AAW1E,QAAO,OARK,MAAM,aAAa,CAAC,UAAU,OAAO,EAC/C,MAAM;EACJ;EACA,YAAY,QAAQ;EACpB,aAAa,QAAQ;EACrB,MAAM,cAAc,KAAK;EAC1B,EACF,CAAC,EACiB,QAAQ;;;;;;;;AAS7B,eAAe,QAAQ,IAAY,SAAkB;CACnD,MAAM,MAAM,MAAM,aAAa,CAAC,UAAU,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AACvE,KAAI,CAAC,IAAK,OAAM,IAAI,aAAa,aAAa,2BAA2B;AACzE,KAAI,IAAI,eAAe,QAAQ,KAC7B,OAAM,IAAI,aAAa,cAAc,uCAAuC;AAE9E,KAAI,KAAK,KAAK,GAAG,IAAI,UAAU,SAAS,QACtC,OAAM,IAAI,aACR,iBACA,kDACD;AAEH,QAAO;;AAGT,eAAsB,YACpB,IACA,MACA,SACsB;AACtB,OAAM,QAAQ,IAAI,QAAQ;AAM1B,QAAO,OAJK,MAAM,aAAa,CAAC,UAAU,OAAO;EAC/C,OAAO,EAAE,IAAI;EACb,MAAM;GAAE,MAAM,cAAc,KAAK;GAAE,0BAAU,IAAI,MAAM;GAAE;EAC1D,CAAC,EACiB,QAAQ;;AAG7B,eAAsB,cACpB,IACA,SACyB;AACzB,OAAM,QAAQ,IAAI,QAAQ;AAC1B,OAAM,aAAa,CAAC,UAAU,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AACvD,QAAO,EAAE,IAAI"}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
//#region src/modules/comments/visitorIdentity.d.ts
|
|
2
|
-
/**
|
|
3
|
-
* Who the server thinks is commenting.
|
|
4
|
-
*
|
|
5
|
-
* The catalog is browsable without logging in, so there is no session to hang a
|
|
6
|
-
* comment on. `hash` is the only thing that authorises editing or deleting a
|
|
7
|
-
* comment later, and `alias` is the only name a reader ever sees.
|
|
8
|
-
*/
|
|
9
|
-
interface Visitor {
|
|
10
|
-
hash: string;
|
|
11
|
-
alias: string;
|
|
12
|
-
}
|
|
13
|
-
//#endregion
|
|
14
|
-
export { Visitor };
|
|
15
|
-
//# sourceMappingURL=visitorIdentity.d.mts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"visitorIdentity.d.mts","names":[],"sources":["../../../src/modules/comments/visitorIdentity.ts"],"mappings":";;;;;;;;UAeiB,OAAA;EACf,IAAA;EACA,KAAA;AAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"visitorIdentity.mjs","names":[],"sources":["../../../src/modules/comments/visitorIdentity.ts"],"sourcesContent":["import { createHash, randomUUID } from 'node:crypto'\nimport { getCookie } from '../../utils/cookies'\n\n/** Opaque per-browser token. httpOnly, so page scripts cannot read or forge it. */\nexport const VISITOR_COOKIE = 'ac_cid'\n\nconst ONE_YEAR_MS = 365 * 24 * 60 * 60 * 1000\n\n/**\n * Who the server thinks is commenting.\n *\n * The catalog is browsable without logging in, so there is no session to hang a\n * comment on. `hash` is the only thing that authorises editing or deleting a\n * comment later, and `alias` is the only name a reader ever sees.\n */\nexport interface Visitor {\n hash: string\n alias: string\n}\n\nconst ADJECTIVES = [\n 'Ancient',\n 'Brave',\n 'Calm',\n 'Clever',\n 'Curious',\n 'Eager',\n 'Gentle',\n 'Happy',\n 'Honest',\n 'Humble',\n 'Jolly',\n 'Keen',\n 'Kind',\n 'Lively',\n 'Loyal',\n 'Merry',\n 'Mighty',\n 'Modest',\n 'Noble',\n 'Patient',\n 'Polite',\n 'Proud',\n 'Quiet',\n 'Rapid',\n 'Silent',\n 'Smooth',\n 'Steady',\n 'Subtle',\n 'Sunny',\n 'Swift',\n 'Tidy',\n 'Witty',\n]\n\nconst ANIMALS = [\n 'Badger',\n 'Beaver',\n 'Bison',\n 'Crane',\n 'Dolphin',\n 'Falcon',\n 'Ferret',\n 'Finch',\n 'Fox',\n 'Gecko',\n 'Heron',\n 'Ibex',\n 'Jackal',\n 'Kestrel',\n 'Lemur',\n 'Lynx',\n 'Magpie',\n 'Marten',\n 'Mole',\n 'Narwhal',\n 'Ocelot',\n 'Osprey',\n 'Otter',\n 'Panda',\n 'Puffin',\n 'Raven',\n 'Seal',\n 'Shrew',\n 'Stoat',\n 'Tapir',\n 'Vole',\n 'Walrus',\n]\n\n/**\n * A stable, readable name for a visitor hash, e.g. \"Curious Ferret\".\n *\n * Deterministic, so the same browser keeps the same name across comments — but it\n * is derived once and stored on the row, because widening these lists later would\n * otherwise rename every comment ever written.\n */\nexport function aliasForHash(hash: string): string {\n // Two independent slices of the hash, so the two words vary independently.\n const adjective =\n ADJECTIVES[parseInt(hash.slice(0, 8), 16) % ADJECTIVES.length]\n const animal = ANIMALS[parseInt(hash.slice(8, 16), 16) % ANIMALS.length]\n return `${adjective} ${animal}`\n}\n\nfunction hashToken(token: string): string {\n return createHash('sha256').update(token).digest('hex')\n}\n\n/**\n * Read the visitor token, issuing one when this browser has none yet.\n *\n * Called on every tRPC request rather than only when commenting: the cookie has to\n * already exist by the time someone clicks Post, and issuing it on the read that\n * renders the comment list is the one moment we know a page is open.\n *\n * `res` is absent on internally-created contexts (see createAcMiddleware), and\n * those never comment — they get an identity derived from the token they carry, if\n * any, and cannot be issued a new one.\n */\nexport function resolveVisitor(\n req: { headers: { cookie?: string } },\n res?: {\n cookie: (\n name: string,\n value: string,\n options: Record<string, unknown>,\n ) => unknown\n },\n): Visitor | null {\n let token = getCookie(req, VISITOR_COOKIE)\n\n if (!token) {\n if (!res) return null\n token = randomUUID()\n res.cookie(VISITOR_COOKIE, token, {\n httpOnly: true,\n sameSite: 'lax',\n path: '/',\n maxAge: ONE_YEAR_MS,\n })\n }\n\n const hash = hashToken(token)\n return { hash, alias: aliasForHash(hash) }\n}\n"],"mappings":";;;;;AAIA,MAAa,iBAAiB;AAE9B,MAAM,cAAc,MAAM,KAAK,KAAK,KAAK;AAczC,MAAM,aAAa;CACjB;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD;AAED,MAAM,UAAU;CACd;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD;;;;;;;;AASD,SAAgB,aAAa,MAAsB;AAKjD,QAAO,GAFL,WAAW,SAAS,KAAK,MAAM,GAAG,EAAE,EAAE,GAAG,GAAG,WAAW,QAErC,GADL,QAAQ,SAAS,KAAK,MAAM,GAAG,GAAG,EAAE,GAAG,GAAG,QAAQ;;AAInE,SAAS,UAAU,OAAuB;AACxC,QAAO,WAAW,SAAS,CAAC,OAAO,MAAM,CAAC,OAAO,MAAM;;;;;;;;;;;;;AAczD,SAAgB,eACd,KACA,KAOgB;CAChB,IAAI,QAAQ,UAAU,KAAK,eAAe;AAE1C,KAAI,CAAC,OAAO;AACV,MAAI,CAAC,IAAK,QAAO;AACjB,UAAQ,YAAY;AACpB,MAAI,OAAO,gBAAgB,OAAO;GAChC,UAAU;GACV,UAAU;GACV,MAAM;GACN,QAAQ;GACT,CAAC;;CAGJ,MAAM,OAAO,UAAU,MAAM;AAC7B,QAAO;EAAE;EAAM,OAAO,aAAa,KAAK;EAAE"}
|