@pkcprotocol/pkc-js 0.0.34 → 0.0.36
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 +18 -0
- package/dist/browser/community/remote-community.d.ts +3 -3
- package/dist/browser/community/remote-community.js.map +1 -1
- package/dist/browser/generated-version.d.ts +1 -1
- package/dist/browser/generated-version.js +1 -1
- package/dist/browser/helia/helia-for-pkc.js +30 -12
- package/dist/browser/helia/helia-for-pkc.js.map +1 -1
- package/dist/browser/helia/util.js +142 -42
- package/dist/browser/helia/util.js.map +1 -1
- package/dist/browser/pkc/pkc.js +3 -3
- package/dist/browser/pkc/pkc.js.map +1 -1
- package/dist/browser/runtime/browser/community/local-community.d.ts +2 -0
- package/dist/browser/runtime/browser/community/local-community.js +6 -0
- package/dist/browser/runtime/browser/community/local-community.js.map +1 -1
- package/dist/browser/runtime/node/community/db-handler.js +6 -4
- package/dist/browser/runtime/node/community/db-handler.js.map +1 -1
- package/dist/browser/runtime/node/community/local-community/challenges.d.ts +26 -0
- package/dist/browser/runtime/node/community/local-community/challenges.js +519 -0
- package/dist/browser/runtime/node/community/local-community/challenges.js.map +1 -0
- package/dist/browser/runtime/node/community/local-community/cleanup.d.ts +9 -0
- package/dist/browser/runtime/node/community/local-community/cleanup.js +165 -0
- package/dist/browser/runtime/node/community/local-community/cleanup.js.map +1 -0
- package/dist/browser/runtime/node/community/local-community/comment-updates.d.ts +11 -0
- package/dist/browser/runtime/node/community/local-community/comment-updates.js +218 -0
- package/dist/browser/runtime/node/community/local-community/comment-updates.js.map +1 -0
- package/dist/browser/runtime/node/community/local-community/db-state.d.ts +15 -0
- package/dist/browser/runtime/node/community/local-community/db-state.js +323 -0
- package/dist/browser/runtime/node/community/local-community/db-state.js.map +1 -0
- package/dist/browser/runtime/node/community/local-community/defaults.d.ts +12 -0
- package/dist/browser/runtime/node/community/local-community/defaults.js +29 -0
- package/dist/browser/runtime/node/community/local-community/defaults.js.map +1 -0
- package/dist/browser/runtime/node/community/local-community/editing.d.ts +10 -0
- package/dist/browser/runtime/node/community/local-community/editing.js +188 -0
- package/dist/browser/runtime/node/community/local-community/editing.js.map +1 -0
- package/dist/browser/runtime/node/community/local-community/ipns-publishing.d.ts +12 -0
- package/dist/browser/runtime/node/community/local-community/ipns-publishing.js +340 -0
- package/dist/browser/runtime/node/community/local-community/ipns-publishing.js.map +1 -0
- package/dist/browser/runtime/node/community/local-community/lifecycle.d.ts +11 -0
- package/dist/browser/runtime/node/community/local-community/lifecycle.js +428 -0
- package/dist/browser/runtime/node/community/local-community/lifecycle.js.map +1 -0
- package/dist/browser/runtime/node/community/local-community/publication-store.d.ts +100 -0
- package/dist/browser/runtime/node/community/local-community/publication-store.js +395 -0
- package/dist/browser/runtime/node/community/local-community/publication-store.js.map +1 -0
- package/dist/browser/runtime/node/community/local-community/publication-validation.d.ts +9 -0
- package/dist/browser/runtime/node/community/local-community/publication-validation.js +493 -0
- package/dist/browser/runtime/node/community/local-community/publication-validation.js.map +1 -0
- package/dist/browser/runtime/node/community/local-community/pubsub.d.ts +3 -0
- package/dist/browser/runtime/node/community/local-community/pubsub.js +43 -0
- package/dist/browser/runtime/node/community/local-community/pubsub.js.map +1 -0
- package/dist/browser/runtime/node/community/local-community/registry.d.ts +3 -0
- package/dist/browser/runtime/node/community/local-community/registry.js +4 -0
- package/dist/browser/runtime/node/community/local-community/registry.js.map +1 -0
- package/dist/browser/runtime/node/community/local-community.d.ts +68 -105
- package/dist/browser/runtime/node/community/local-community.js +127 -2927
- package/dist/browser/runtime/node/community/local-community.js.map +1 -1
- package/dist/browser/test/test-util.js +0 -1
- package/dist/browser/test/test-util.js.map +1 -1
- package/dist/node/community/remote-community.d.ts +3 -3
- package/dist/node/community/remote-community.js.map +1 -1
- package/dist/node/generated-version.d.ts +1 -1
- package/dist/node/generated-version.js +1 -1
- package/dist/node/helia/helia-for-pkc.js +30 -12
- package/dist/node/helia/helia-for-pkc.js.map +1 -1
- package/dist/node/helia/util.js +142 -42
- package/dist/node/helia/util.js.map +1 -1
- package/dist/node/pkc/pkc.js +3 -3
- package/dist/node/pkc/pkc.js.map +1 -1
- package/dist/node/runtime/browser/community/local-community.d.ts +2 -0
- package/dist/node/runtime/browser/community/local-community.js +6 -0
- package/dist/node/runtime/browser/community/local-community.js.map +1 -1
- package/dist/node/runtime/node/community/db-handler.js +6 -4
- package/dist/node/runtime/node/community/db-handler.js.map +1 -1
- package/dist/node/runtime/node/community/local-community/challenges.d.ts +26 -0
- package/dist/node/runtime/node/community/local-community/challenges.js +519 -0
- package/dist/node/runtime/node/community/local-community/challenges.js.map +1 -0
- package/dist/node/runtime/node/community/local-community/cleanup.d.ts +9 -0
- package/dist/node/runtime/node/community/local-community/cleanup.js +165 -0
- package/dist/node/runtime/node/community/local-community/cleanup.js.map +1 -0
- package/dist/node/runtime/node/community/local-community/comment-updates.d.ts +11 -0
- package/dist/node/runtime/node/community/local-community/comment-updates.js +218 -0
- package/dist/node/runtime/node/community/local-community/comment-updates.js.map +1 -0
- package/dist/node/runtime/node/community/local-community/db-state.d.ts +15 -0
- package/dist/node/runtime/node/community/local-community/db-state.js +323 -0
- package/dist/node/runtime/node/community/local-community/db-state.js.map +1 -0
- package/dist/node/runtime/node/community/local-community/defaults.d.ts +12 -0
- package/dist/node/runtime/node/community/local-community/defaults.js +29 -0
- package/dist/node/runtime/node/community/local-community/defaults.js.map +1 -0
- package/dist/node/runtime/node/community/local-community/editing.d.ts +10 -0
- package/dist/node/runtime/node/community/local-community/editing.js +188 -0
- package/dist/node/runtime/node/community/local-community/editing.js.map +1 -0
- package/dist/node/runtime/node/community/local-community/ipns-publishing.d.ts +12 -0
- package/dist/node/runtime/node/community/local-community/ipns-publishing.js +340 -0
- package/dist/node/runtime/node/community/local-community/ipns-publishing.js.map +1 -0
- package/dist/node/runtime/node/community/local-community/lifecycle.d.ts +11 -0
- package/dist/node/runtime/node/community/local-community/lifecycle.js +428 -0
- package/dist/node/runtime/node/community/local-community/lifecycle.js.map +1 -0
- package/dist/node/runtime/node/community/local-community/publication-store.d.ts +100 -0
- package/dist/node/runtime/node/community/local-community/publication-store.js +395 -0
- package/dist/node/runtime/node/community/local-community/publication-store.js.map +1 -0
- package/dist/node/runtime/node/community/local-community/publication-validation.d.ts +9 -0
- package/dist/node/runtime/node/community/local-community/publication-validation.js +493 -0
- package/dist/node/runtime/node/community/local-community/publication-validation.js.map +1 -0
- package/dist/node/runtime/node/community/local-community/pubsub.d.ts +3 -0
- package/dist/node/runtime/node/community/local-community/pubsub.js +43 -0
- package/dist/node/runtime/node/community/local-community/pubsub.js.map +1 -0
- package/dist/node/runtime/node/community/local-community/registry.d.ts +3 -0
- package/dist/node/runtime/node/community/local-community/registry.js +4 -0
- package/dist/node/runtime/node/community/local-community/registry.js.map +1 -0
- package/dist/node/runtime/node/community/local-community.d.ts +68 -105
- package/dist/node/runtime/node/community/local-community.js +127 -2927
- package/dist/node/runtime/node/community/local-community.js.map +1 -1
- package/dist/node/test/test-util.js +0 -1
- package/dist/node/test/test-util.js.map +1 -1
- package/package.json +3 -2
|
@@ -0,0 +1,395 @@
|
|
|
1
|
+
import Logger from "../../../../logger.js";
|
|
2
|
+
import * as remeda from "remeda";
|
|
3
|
+
import { default as lodashDeepMerge } from "lodash.merge";
|
|
4
|
+
import { stringify as deterministicStringify } from "safe-stable-stringify";
|
|
5
|
+
import { calculateIpfsCidV0, isStringDomain, retryKuboIpfsAddAndProvide, timestamp } from "../../../../util.js";
|
|
6
|
+
import { PKCError } from "../../../../pkc-error.js";
|
|
7
|
+
import { signComment, signCommentEdit } from "../../../../signer/signatures.js";
|
|
8
|
+
import { getPKCAddressFromPublicKey } from "../../../../signer/util.js";
|
|
9
|
+
import { cleanWireAuthor, getAuthorNameFromWire } from "../../../../publications/publication-author.js";
|
|
10
|
+
import { getThumbnailPropsOfLink } from "../../util.js";
|
|
11
|
+
import { CommentEditPubsubMessagePublicationSchema, CommentEditPubsubMessagePublicationWithFlexibleAuthorSchema } from "../../../../publications/comment-edit/schema.js";
|
|
12
|
+
import { CommentIpfsSchema, CommentPubsubMessagePublicationSchema } from "../../../../publications/comment/schema.js";
|
|
13
|
+
import { CommentModerationPubsubMessagePublicationSchema } from "../../../../publications/comment-moderation/schema.js";
|
|
14
|
+
import { VotePubsubMessagePublicationSchema } from "../../../../publications/vote/schema.js";
|
|
15
|
+
import { addAllCidsUnderPurgedCommentToBeRemoved, rmUnneededMfsPaths } from "./cleanup.js";
|
|
16
|
+
import { isPublicationAuthorPartOfRoles } from "./publication-validation.js";
|
|
17
|
+
export function isPublicationReply(publication) {
|
|
18
|
+
return Boolean(publication.parentCid);
|
|
19
|
+
}
|
|
20
|
+
export function isPublicationPost(publication) {
|
|
21
|
+
return !publication.parentCid;
|
|
22
|
+
}
|
|
23
|
+
export async function calculateLinkProps(community, link) {
|
|
24
|
+
if (!link || !community.settings?.fetchThumbnailUrls)
|
|
25
|
+
return undefined;
|
|
26
|
+
return getThumbnailPropsOfLink(link, community, community.settings.fetchThumbnailUrlsProxyUrl);
|
|
27
|
+
}
|
|
28
|
+
export async function calculateLatestPostProps(community) {
|
|
29
|
+
community._dbHandler.createTransaction();
|
|
30
|
+
const previousCid = community._dbHandler.queryLatestPostCid()?.cid;
|
|
31
|
+
community._dbHandler.commitTransaction();
|
|
32
|
+
return { depth: 0, previousCid };
|
|
33
|
+
}
|
|
34
|
+
export async function calculateReplyProps(community, comment) {
|
|
35
|
+
if (!comment.parentCid)
|
|
36
|
+
throw Error("Reply has to have parentCid");
|
|
37
|
+
community._dbHandler.createTransaction();
|
|
38
|
+
const commentsUnderParent = community._dbHandler.queryCommentsUnderComment(comment.parentCid);
|
|
39
|
+
const parent = community._dbHandler.queryComment(comment.parentCid);
|
|
40
|
+
community._dbHandler.commitTransaction();
|
|
41
|
+
if (!parent)
|
|
42
|
+
throw Error("Failed to find parent of reply");
|
|
43
|
+
return {
|
|
44
|
+
depth: parent.depth + 1,
|
|
45
|
+
postCid: parent.postCid,
|
|
46
|
+
previousCid: commentsUnderParent[0]?.cid
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
export async function resolveAliasPrivateKeyForCommentPublication(community, opts) {
|
|
50
|
+
if (opts.mode === "per-post") {
|
|
51
|
+
// For a new post (no postCid yet), always generate a fresh alias; once stored the postCid will be used for reuse.
|
|
52
|
+
if (opts.postCid) {
|
|
53
|
+
const existing = community._dbHandler.queryPseudonymityAliasForPost(opts.originalAuthorPublicKey, opts.postCid);
|
|
54
|
+
if (existing?.aliasPrivateKey)
|
|
55
|
+
return existing.aliasPrivateKey;
|
|
56
|
+
}
|
|
57
|
+
return (await community._pkc.createSigner()).privateKey;
|
|
58
|
+
}
|
|
59
|
+
else if (opts.mode === "per-reply") {
|
|
60
|
+
const signer = await community._pkc.createSigner();
|
|
61
|
+
return signer.privateKey;
|
|
62
|
+
}
|
|
63
|
+
else if (opts.mode === "per-author") {
|
|
64
|
+
const existing = community._dbHandler.queryPseudonymityAliasForAuthor(opts.originalAuthorPublicKey);
|
|
65
|
+
if (existing?.aliasPrivateKey)
|
|
66
|
+
return existing.aliasPrivateKey;
|
|
67
|
+
const signer = await community._pkc.createSigner();
|
|
68
|
+
return signer.privateKey;
|
|
69
|
+
}
|
|
70
|
+
else
|
|
71
|
+
throw Error(`Unsupported pseudonymityMode (${opts.mode})`);
|
|
72
|
+
}
|
|
73
|
+
export async function prepareCommentWithAnonymity(community, originalComment) {
|
|
74
|
+
const mode = community.features?.pseudonymityMode;
|
|
75
|
+
if (!mode)
|
|
76
|
+
return { publication: originalComment };
|
|
77
|
+
// Mods (owner, admin, moderator) are never pseudonymized
|
|
78
|
+
const isAuthorMod = await isPublicationAuthorPartOfRoles(community, originalComment, ["owner", "admin", "moderator"]);
|
|
79
|
+
if (isAuthorMod)
|
|
80
|
+
return { publication: originalComment };
|
|
81
|
+
const originalAuthorPublicKey = originalComment.signature.publicKey;
|
|
82
|
+
const postCid = originalComment.postCid;
|
|
83
|
+
const aliasPrivateKey = await resolveAliasPrivateKeyForCommentPublication(community, {
|
|
84
|
+
mode,
|
|
85
|
+
originalAuthorPublicKey,
|
|
86
|
+
postCid
|
|
87
|
+
});
|
|
88
|
+
const aliasSigner = await community._pkc.createSigner({ privateKey: aliasPrivateKey, type: "ed25519" });
|
|
89
|
+
const displayName = originalComment.author?.displayName;
|
|
90
|
+
const sanitizedAuthor = cleanWireAuthor(displayName !== undefined ? { displayName } : undefined);
|
|
91
|
+
const anonymizedComment = remeda.clone(originalComment);
|
|
92
|
+
if (sanitizedAuthor !== undefined) {
|
|
93
|
+
anonymizedComment.author = sanitizedAuthor;
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
delete anonymizedComment.author;
|
|
97
|
+
}
|
|
98
|
+
anonymizedComment.signature = await signComment({
|
|
99
|
+
comment: { ...anonymizedComment, signer: aliasSigner, communityAddress: community.address },
|
|
100
|
+
pkc: community._pkc
|
|
101
|
+
});
|
|
102
|
+
return {
|
|
103
|
+
publication: anonymizedComment,
|
|
104
|
+
anonymity: {
|
|
105
|
+
aliasPrivateKey,
|
|
106
|
+
originalAuthorPublicKey,
|
|
107
|
+
mode,
|
|
108
|
+
originalComment
|
|
109
|
+
}
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
export async function prepareCommentEditWithAlias(community, originalEdit) {
|
|
113
|
+
const aliasSignerOfComment = community._dbHandler.queryPseudonymityAliasByCommentCid(originalEdit.commentCid);
|
|
114
|
+
if (!aliasSignerOfComment)
|
|
115
|
+
return originalEdit;
|
|
116
|
+
const aliasSigner = await community._pkc.createSigner({
|
|
117
|
+
privateKey: aliasSignerOfComment.aliasPrivateKey,
|
|
118
|
+
type: "ed25519"
|
|
119
|
+
});
|
|
120
|
+
const commentEditSignedByAlias = remeda.clone(originalEdit);
|
|
121
|
+
delete commentEditSignedByAlias.author;
|
|
122
|
+
commentEditSignedByAlias.signature = await signCommentEdit({
|
|
123
|
+
edit: { ...commentEditSignedByAlias, signer: aliasSigner, communityAddress: community.address },
|
|
124
|
+
pkc: community._pkc
|
|
125
|
+
});
|
|
126
|
+
return commentEditSignedByAlias;
|
|
127
|
+
}
|
|
128
|
+
export async function storeCommentEdit(community, commentEditRaw, challengeRequestId) {
|
|
129
|
+
const log = Logger("pkc-js:local-community:storeCommentEdit");
|
|
130
|
+
const strippedOutEditPublication = CommentEditPubsubMessagePublicationWithFlexibleAuthorSchema.strip().parse(commentEditRaw); // we strip out here so we don't store any extra props in commentedits table
|
|
131
|
+
strippedOutEditPublication.author = cleanWireAuthor(strippedOutEditPublication.author); // strip runtime-only author fields (address, publicKey, etc.)
|
|
132
|
+
// Normalize to new wire format: ensure communityPublicKey/communityName for DB columns
|
|
133
|
+
if (!strippedOutEditPublication.communityPublicKey)
|
|
134
|
+
strippedOutEditPublication.communityPublicKey = community.signer.address;
|
|
135
|
+
if (!strippedOutEditPublication.communityName && isStringDomain(community.address))
|
|
136
|
+
strippedOutEditPublication.communityName = community.address;
|
|
137
|
+
const commentToBeEdited = community._dbHandler.queryComment(commentEditRaw.commentCid); // We assume commentToBeEdited to be defined because we already tested for its existence above
|
|
138
|
+
if (!commentToBeEdited)
|
|
139
|
+
throw Error("The comment to edit doesn't exist"); // unlikely error to happen, but always a good idea to verify
|
|
140
|
+
const editSignedByOriginalAuthor = commentEditRaw.signature.publicKey === commentToBeEdited.signature.publicKey;
|
|
141
|
+
const authorSignerAddress = await getPKCAddressFromPublicKey(commentEditRaw.signature.publicKey);
|
|
142
|
+
const editTableRow = {
|
|
143
|
+
...strippedOutEditPublication,
|
|
144
|
+
isAuthorEdit: editSignedByOriginalAuthor,
|
|
145
|
+
authorSignerAddress,
|
|
146
|
+
insertedAt: timestamp()
|
|
147
|
+
};
|
|
148
|
+
const extraPropsInEdit = remeda
|
|
149
|
+
.difference(remeda.keys.strict(commentEditRaw), remeda.keys.strict(CommentEditPubsubMessagePublicationSchema.shape))
|
|
150
|
+
.filter((key) => key !== "communityAddress"); // communityAddress is excluded because it's been converted to communityPublicKey/communityName above
|
|
151
|
+
if (extraPropsInEdit.length > 0) {
|
|
152
|
+
log("Found extra props on CommentEdit", extraPropsInEdit, "Will be adding them to extraProps column");
|
|
153
|
+
editTableRow.extraProps = remeda.pick(commentEditRaw, extraPropsInEdit);
|
|
154
|
+
}
|
|
155
|
+
const isEditDuplicate = community._dbHandler.hasCommentEditWithSignatureEncoded(editTableRow.signature.signature);
|
|
156
|
+
if (isEditDuplicate) {
|
|
157
|
+
throw new PKCError("ERR_DUPLICATE_COMMENT_EDIT", { editTableRow });
|
|
158
|
+
}
|
|
159
|
+
community._dbHandler.insertCommentEdits([editTableRow]);
|
|
160
|
+
// If author is deleting a pending or disapproved comment, purge it immediately from the database
|
|
161
|
+
if (commentEditRaw.deleted === true) {
|
|
162
|
+
const isPending = commentToBeEdited.pendingApproval;
|
|
163
|
+
const disapprovalResult = community._dbHandler._queryIsCommentApproved(commentToBeEdited);
|
|
164
|
+
const isDisapproved = disapprovalResult && !disapprovalResult.approved;
|
|
165
|
+
if (isPending || isDisapproved) {
|
|
166
|
+
log("Author deleted a pending/disapproved comment, purging immediately", commentEditRaw.commentCid);
|
|
167
|
+
community._dbHandler.purgeComment(commentEditRaw.commentCid);
|
|
168
|
+
community._communityUpdateTrigger = true;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
export async function storeCommentModeration(community, commentModRaw, challengeRequestId) {
|
|
173
|
+
const log = Logger("pkc-js:local-community:storeCommentModeration");
|
|
174
|
+
const strippedOutModPublication = CommentModerationPubsubMessagePublicationSchema.strip().parse(commentModRaw); // we strip out here so we don't store any extra props in commentedits table
|
|
175
|
+
strippedOutModPublication.author = cleanWireAuthor(strippedOutModPublication.author); // strip runtime-only author fields (address, publicKey, etc.)
|
|
176
|
+
// Normalize to new wire format: ensure communityPublicKey/communityName for DB columns
|
|
177
|
+
if (!strippedOutModPublication.communityPublicKey)
|
|
178
|
+
strippedOutModPublication.communityPublicKey = community.signer.address;
|
|
179
|
+
if (!strippedOutModPublication.communityName && isStringDomain(community.address))
|
|
180
|
+
strippedOutModPublication.communityName = community.address;
|
|
181
|
+
const commentToBeEdited = community._dbHandler.queryComment(commentModRaw.commentCid); // We assume commentToBeEdited to be defined because we already tested for its existence above
|
|
182
|
+
if (!commentToBeEdited)
|
|
183
|
+
throw Error("The comment to edit doesn't exist"); // unlikely error to happen, but always a good idea to verify
|
|
184
|
+
const modSignerAddress = await getPKCAddressFromPublicKey(commentModRaw.signature.publicKey);
|
|
185
|
+
// Determine the target author signer address and domain if this moderation affects the author (ban/flair)
|
|
186
|
+
let targetAuthorSignerAddress;
|
|
187
|
+
let targetAuthorDomain;
|
|
188
|
+
if (strippedOutModPublication.commentModeration.author) {
|
|
189
|
+
// Check if the comment was published with pseudonymity - if so, get the original author address/domain
|
|
190
|
+
const aliasInfo = community._dbHandler.queryPseudonymityAliasByCommentCid(commentModRaw.commentCid);
|
|
191
|
+
if (aliasInfo) {
|
|
192
|
+
targetAuthorSignerAddress = await getPKCAddressFromPublicKey(aliasInfo.originalAuthorPublicKey);
|
|
193
|
+
targetAuthorDomain = aliasInfo.originalAuthorName || undefined;
|
|
194
|
+
}
|
|
195
|
+
else {
|
|
196
|
+
targetAuthorSignerAddress = commentToBeEdited.authorSignerAddress;
|
|
197
|
+
targetAuthorDomain = getAuthorNameFromWire(commentToBeEdited.author);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
const modTableRow = {
|
|
201
|
+
...strippedOutModPublication,
|
|
202
|
+
modSignerAddress,
|
|
203
|
+
insertedAt: timestamp(),
|
|
204
|
+
targetAuthorSignerAddress,
|
|
205
|
+
targetAuthorDomain
|
|
206
|
+
};
|
|
207
|
+
const isCommentModDuplicate = community._dbHandler.hasCommentModerationWithSignatureEncoded(modTableRow.signature.signature);
|
|
208
|
+
if (isCommentModDuplicate) {
|
|
209
|
+
throw new PKCError("ERR_DUPLICATE_COMMENT_MODERATION", { modTableRow });
|
|
210
|
+
}
|
|
211
|
+
const extraPropsInMod = remeda
|
|
212
|
+
.difference(remeda.keys.strict(commentModRaw), remeda.keys.strict(CommentModerationPubsubMessagePublicationSchema.shape))
|
|
213
|
+
.filter((key) => key !== "communityAddress"); // communityAddress is excluded because it's been converted to communityPublicKey/communityName above
|
|
214
|
+
if (extraPropsInMod.length > 0) {
|
|
215
|
+
log("Found extra props on CommentModeration", extraPropsInMod, "Will be adding them to extraProps column");
|
|
216
|
+
modTableRow.extraProps = remeda.pick(commentModRaw, extraPropsInMod);
|
|
217
|
+
}
|
|
218
|
+
if (modTableRow.commentModeration.purged) {
|
|
219
|
+
log("commentModeration.purged=true, and therefore will delete the post/comment and all its reply tree from the db as well as unpin the cids from ipfs", "comment cid is", modTableRow.commentCid);
|
|
220
|
+
const commentToPurge = community._dbHandler.queryComment(modTableRow.commentCid);
|
|
221
|
+
if (!commentToPurge)
|
|
222
|
+
throw Error("Comment to purge not found");
|
|
223
|
+
const purgedTableRows = community._dbHandler.purgeComment(modTableRow.commentCid);
|
|
224
|
+
for (const purgedTableRow of purgedTableRows)
|
|
225
|
+
await addAllCidsUnderPurgedCommentToBeRemoved(community, purgedTableRow);
|
|
226
|
+
log("Purged comment", modTableRow.commentCid, "and its comment and comment update children", "out of DB and IPFS");
|
|
227
|
+
await rmUnneededMfsPaths(community); // not sure if needed here
|
|
228
|
+
if (community.updateCid) {
|
|
229
|
+
// need to remove any update cids with reference to purged comment
|
|
230
|
+
community._blocksToRm.push(community.updateCid);
|
|
231
|
+
community._cidsToUnPin.add(community.updateCid);
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
else if ("approved" in modTableRow.commentModeration) {
|
|
235
|
+
if (modTableRow.commentModeration.approved) {
|
|
236
|
+
log("commentModeration.approved=true, and therefore move comment from pending approval and add it to IPFS", "comment cid is", modTableRow.commentCid);
|
|
237
|
+
await community._addCommentRowToIPFS(commentToBeEdited, Logger("pkc-js:local-community:storeCommentModeration:_addCommentRowToIPFS"));
|
|
238
|
+
community._dbHandler.approvePendingComment({ cid: modTableRow.commentCid });
|
|
239
|
+
}
|
|
240
|
+
else {
|
|
241
|
+
const shouldPurgeDisapprovedComment = Object.keys(modTableRow.commentModeration).length === 1; // no other props were included, if so purge the comment
|
|
242
|
+
log("commentModeration.approved=false, and therefore this comment will be removed entirely from DB", "should we purge this comment? = ", shouldPurgeDisapprovedComment, "comment cid is", modTableRow.commentCid);
|
|
243
|
+
if (shouldPurgeDisapprovedComment)
|
|
244
|
+
community._dbHandler.purgeComment(modTableRow.commentCid);
|
|
245
|
+
else
|
|
246
|
+
community._dbHandler.removeCommentFromPendingApproval({ cid: modTableRow.commentCid });
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
community._dbHandler.insertCommentModerations([modTableRow]);
|
|
250
|
+
community._communityUpdateTrigger = true;
|
|
251
|
+
log("Inserted comment moderation", "of comment", modTableRow.commentCid, "into db", "with props", modTableRow);
|
|
252
|
+
}
|
|
253
|
+
export async function storeVote(community, newVoteProps, challengeRequestId) {
|
|
254
|
+
const log = Logger("pkc-js:local-community:storeVote");
|
|
255
|
+
const authorSignerAddress = await getPKCAddressFromPublicKey(newVoteProps.signature.publicKey);
|
|
256
|
+
community._dbHandler.deleteVote(authorSignerAddress, newVoteProps.commentCid);
|
|
257
|
+
const voteTableRow = {
|
|
258
|
+
...remeda.pick(newVoteProps, ["vote", "commentCid", "protocolVersion", "timestamp"]),
|
|
259
|
+
authorSignerAddress,
|
|
260
|
+
insertedAt: timestamp()
|
|
261
|
+
};
|
|
262
|
+
const extraPropsInVote = remeda.difference(remeda.keys.strict(newVoteProps), remeda.keys.strict(VotePubsubMessagePublicationSchema.shape));
|
|
263
|
+
if (extraPropsInVote.length > 0) {
|
|
264
|
+
log("Found extra props on Vote", extraPropsInVote, "Will be adding them to extraProps column");
|
|
265
|
+
voteTableRow.extraProps = remeda.pick(newVoteProps, extraPropsInVote);
|
|
266
|
+
}
|
|
267
|
+
community._dbHandler.insertVotes([voteTableRow]);
|
|
268
|
+
log("Inserted vote", "of comment", voteTableRow.commentCid, "into db", "with props", voteTableRow);
|
|
269
|
+
return undefined;
|
|
270
|
+
}
|
|
271
|
+
export async function storeCommunityEditPublication(community, editProps, challengeRequestId) {
|
|
272
|
+
const log = Logger("pkc-js:local-community:storeCommunityEdit");
|
|
273
|
+
const authorSignerAddress = await getPKCAddressFromPublicKey(editProps.signature.publicKey);
|
|
274
|
+
const authorIdentity = getAuthorNameFromWire(editProps.author) || authorSignerAddress;
|
|
275
|
+
log("Received community edit", editProps.communityEdit, "from author", authorIdentity, "with signer address", authorSignerAddress, "Will be using these props to edit the community props");
|
|
276
|
+
const propsAfterEdit = remeda.pick(community, remeda.keys.strict(editProps.communityEdit));
|
|
277
|
+
log("Current props from community edit (not edited yet)", propsAfterEdit);
|
|
278
|
+
lodashDeepMerge(propsAfterEdit, editProps.communityEdit);
|
|
279
|
+
await community.edit(propsAfterEdit);
|
|
280
|
+
return undefined;
|
|
281
|
+
}
|
|
282
|
+
export async function storeComment(community, opts) {
|
|
283
|
+
const { commentPubsub, pendingApproval, pseudonymityMode, originalCommentSignatureEncoded } = opts;
|
|
284
|
+
const log = Logger("pkc-js:local-community:handleChallengeExchange:storeComment");
|
|
285
|
+
const commentIpfs = {
|
|
286
|
+
...commentPubsub,
|
|
287
|
+
...(await calculateLinkProps(community, commentPubsub.link)),
|
|
288
|
+
...(isPublicationPost(commentPubsub) && (await calculateLatestPostProps(community))),
|
|
289
|
+
...(isPublicationReply(commentPubsub) && (await calculateReplyProps(community, commentPubsub))),
|
|
290
|
+
...(pseudonymityMode ? { pseudonymityMode } : {})
|
|
291
|
+
};
|
|
292
|
+
// Normalize to new wire format: ensure communityPublicKey/communityName, remove old communityAddress
|
|
293
|
+
commentIpfs.communityPublicKey = community.signer.address;
|
|
294
|
+
if (isStringDomain(community.address))
|
|
295
|
+
commentIpfs.communityName = community.address;
|
|
296
|
+
delete commentIpfs.communityAddress;
|
|
297
|
+
// Strip runtime-only author fields (nameResolved, address, publicKey, etc.) before IPFS storage
|
|
298
|
+
commentIpfs.author = cleanWireAuthor(commentIpfs.author);
|
|
299
|
+
const ipfsClient = community._clientsManager.getDefaultKuboRpcClient();
|
|
300
|
+
const file = pendingApproval
|
|
301
|
+
? undefined
|
|
302
|
+
: await retryKuboIpfsAddAndProvide({
|
|
303
|
+
ipfsClient: ipfsClient._client,
|
|
304
|
+
log,
|
|
305
|
+
content: deterministicStringify(commentIpfs),
|
|
306
|
+
addOptions: { pin: true },
|
|
307
|
+
provideOptions: { recursive: true },
|
|
308
|
+
provideInBackground: false
|
|
309
|
+
});
|
|
310
|
+
const commentCid = file?.path || (await calculateIpfsCidV0(deterministicStringify(commentIpfs)));
|
|
311
|
+
const postCid = commentIpfs.postCid || commentCid; // if postCid is not defined, then we're adding a post to IPFS, so its own cid is the postCid
|
|
312
|
+
const authorSignerAddress = await getPKCAddressFromPublicKey(commentPubsub.signature.publicKey);
|
|
313
|
+
const strippedOutCommentIpfs = CommentIpfsSchema.strip().parse(commentIpfs); // remove unknown props
|
|
314
|
+
strippedOutCommentIpfs.author = cleanWireAuthor(strippedOutCommentIpfs.author); // strip runtime-only author fields (address, publicKey, etc.)
|
|
315
|
+
const signaturesToCheck = Array.from(new Set([commentPubsub.signature.signature, originalCommentSignatureEncoded].filter((sig) => typeof sig === "string")));
|
|
316
|
+
const isCommentDuplicate = signaturesToCheck.some((signatureEncoded) => community._dbHandler.hasCommentWithSignatureEncoded(signatureEncoded));
|
|
317
|
+
if (isCommentDuplicate) {
|
|
318
|
+
community._cidsToUnPin.add(commentCid);
|
|
319
|
+
throw new PKCError("ERR_DUPLICATE_COMMENT", { file, commentIpfs, commentPubsub });
|
|
320
|
+
}
|
|
321
|
+
const commentRow = {
|
|
322
|
+
...strippedOutCommentIpfs,
|
|
323
|
+
cid: commentCid,
|
|
324
|
+
postCid,
|
|
325
|
+
authorSignerAddress,
|
|
326
|
+
insertedAt: timestamp(),
|
|
327
|
+
pendingApproval
|
|
328
|
+
};
|
|
329
|
+
const unknownProps = remeda
|
|
330
|
+
.difference(remeda.keys.strict(commentPubsub), remeda.keys.strict(CommentPubsubMessagePublicationSchema.shape))
|
|
331
|
+
.filter((key) => key !== "communityAddress"); // communityAddress is excluded because it's been converted to communityPublicKey/communityName above
|
|
332
|
+
if (unknownProps.length > 0) {
|
|
333
|
+
log("Found extra props on Comment", unknownProps, "Will be adding them to extraProps column");
|
|
334
|
+
commentRow.extraProps = remeda.pick(commentPubsub, unknownProps);
|
|
335
|
+
}
|
|
336
|
+
if (originalCommentSignatureEncoded)
|
|
337
|
+
commentRow.originalCommentSignatureEncoded = originalCommentSignatureEncoded;
|
|
338
|
+
// we may need to query comment and verify its signature
|
|
339
|
+
community._dbHandler.createTransaction();
|
|
340
|
+
try {
|
|
341
|
+
if (!pendingApproval) {
|
|
342
|
+
const { number, postNumber } = community._dbHandler.getNextCommentNumbers(commentRow.depth);
|
|
343
|
+
commentRow.number = number;
|
|
344
|
+
if (typeof postNumber === "number")
|
|
345
|
+
commentRow.postNumber = postNumber;
|
|
346
|
+
}
|
|
347
|
+
community._dbHandler.insertComments([commentRow]);
|
|
348
|
+
if (typeof community.settings?.maxPendingApprovalCount === "number")
|
|
349
|
+
community._dbHandler.removeOldestPendingCommentIfWeHitMaxPendingCount(community.settings.maxPendingApprovalCount);
|
|
350
|
+
community._dbHandler.commitTransaction();
|
|
351
|
+
}
|
|
352
|
+
catch (e) {
|
|
353
|
+
community._dbHandler.rollbackTransaction();
|
|
354
|
+
throw e;
|
|
355
|
+
}
|
|
356
|
+
log("Inserted comment", commentRow.cid, "into db", "with props", commentRow);
|
|
357
|
+
return { comment: commentIpfs, cid: commentCid };
|
|
358
|
+
}
|
|
359
|
+
export async function storePublication(community, request, pendingApproval) {
|
|
360
|
+
if (request.vote)
|
|
361
|
+
return storeVote(community, request.vote, request.challengeRequestId);
|
|
362
|
+
else if (request.commentEdit) {
|
|
363
|
+
const commentEditWithAlias = await prepareCommentEditWithAlias(community, request.commentEdit);
|
|
364
|
+
return storeCommentEdit(community, commentEditWithAlias, request.challengeRequestId);
|
|
365
|
+
}
|
|
366
|
+
else if (request.commentModeration)
|
|
367
|
+
return storeCommentModeration(community, request.commentModeration, request.challengeRequestId);
|
|
368
|
+
else if (request.comment) {
|
|
369
|
+
const originalCommentSignatureEncoded = request.comment.signature.signature;
|
|
370
|
+
const { publication, anonymity } = await prepareCommentWithAnonymity(community, request.comment);
|
|
371
|
+
const storedComment = await storeComment(community, {
|
|
372
|
+
commentPubsub: publication,
|
|
373
|
+
pendingApproval,
|
|
374
|
+
pseudonymityMode: anonymity?.mode,
|
|
375
|
+
originalCommentSignatureEncoded: anonymity ? originalCommentSignatureEncoded : undefined
|
|
376
|
+
});
|
|
377
|
+
if (anonymity)
|
|
378
|
+
community._dbHandler.insertPseudonymityAliases([
|
|
379
|
+
{
|
|
380
|
+
commentCid: storedComment.cid,
|
|
381
|
+
aliasPrivateKey: anonymity.aliasPrivateKey,
|
|
382
|
+
originalAuthorPublicKey: anonymity.originalAuthorPublicKey,
|
|
383
|
+
originalAuthorName: getAuthorNameFromWire(anonymity.originalComment.author) || null,
|
|
384
|
+
mode: anonymity.mode,
|
|
385
|
+
insertedAt: timestamp()
|
|
386
|
+
}
|
|
387
|
+
]);
|
|
388
|
+
return storedComment;
|
|
389
|
+
}
|
|
390
|
+
else if (request.communityEdit)
|
|
391
|
+
return storeCommunityEditPublication(community, request.communityEdit, request.challengeRequestId);
|
|
392
|
+
else
|
|
393
|
+
throw Error("Don't know how to store this publication" + request);
|
|
394
|
+
}
|
|
395
|
+
//# sourceMappingURL=publication-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"publication-store.js","sourceRoot":"","sources":["../../../../../../src/runtime/node/community/local-community/publication-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { messages } from "../../../../errors.js";
|
|
2
|
+
import type { CommentModerationPubsubMessagePublication } from "../../../../publications/comment-moderation/types.js";
|
|
3
|
+
import type { CommunityRoleNameUnion, Flair } from "../../../../community/types.js";
|
|
4
|
+
import type { DecryptedChallengeRequestMessageType, PublicationFromDecryptedChallengeRequest, PublicationWithCommunityAuthorFromDecryptedChallengeRequest } from "../../../../pubsub-messages/types.js";
|
|
5
|
+
import type { LocalCommunity } from "../local-community.js";
|
|
6
|
+
export declare function isFlairInAllowedList(flair: Flair, allowedFlairs: Flair[]): boolean;
|
|
7
|
+
export declare function isPublicationAuthorPartOfRoles(community: LocalCommunity, publication: Pick<CommentModerationPubsubMessagePublication, "author" | "signature">, rolesToCheckAgainst: CommunityRoleNameUnion[]): Promise<boolean>;
|
|
8
|
+
export declare function respondWithErrorIfSignatureOfPublicationIsInvalid(community: LocalCommunity, request: DecryptedChallengeRequestMessageType): Promise<void>;
|
|
9
|
+
export declare function checkPublicationValidity(community: LocalCommunity, request: DecryptedChallengeRequestMessageType, publication: PublicationFromDecryptedChallengeRequest, authorCommunity?: PublicationWithCommunityAuthorFromDecryptedChallengeRequest["author"]["community"]): Promise<messages | undefined>;
|