mirror of
https://github.com/NodeBB/NodeBB.git
synced 2025-11-01 19:46:01 +01:00
fix: #13374, updates to posts.edit to handle remote content updates better
This commit is contained in:
@@ -95,6 +95,7 @@ inbox.update = async (req) => {
|
|||||||
switch (true) {
|
switch (true) {
|
||||||
case isNote: {
|
case isNote: {
|
||||||
const postData = await activitypub.mocks.post(object);
|
const postData = await activitypub.mocks.post(object);
|
||||||
|
postData.tags = await activitypub.notes._normalizeTags(postData._activitypub.tag, postData.cid);
|
||||||
await posts.edit(postData);
|
await posts.edit(postData);
|
||||||
const isDeleted = await posts.getPostField(object.id, 'deleted');
|
const isDeleted = await posts.getPostField(object.id, 'deleted');
|
||||||
if (isDeleted) {
|
if (isDeleted) {
|
||||||
|
|||||||
@@ -355,12 +355,13 @@ Mocks.post = async (objects) => {
|
|||||||
uid,
|
uid,
|
||||||
pid,
|
pid,
|
||||||
// tid, --> purposely omitted
|
// tid, --> purposely omitted
|
||||||
name,
|
|
||||||
content,
|
content,
|
||||||
sourceContent,
|
sourceContent,
|
||||||
timestamp,
|
timestamp,
|
||||||
toPid,
|
toPid,
|
||||||
|
|
||||||
|
title: name, // used in post.edit
|
||||||
|
|
||||||
edited,
|
edited,
|
||||||
editor: edited ? uid : undefined,
|
editor: edited ? uid : undefined,
|
||||||
_activitypub: { to, cc, audience, attachment, tag, url, image },
|
_activitypub: { to, cc, audience, attachment, tag, url, image },
|
||||||
|
|||||||
@@ -27,6 +27,24 @@ async function unlock(value) {
|
|||||||
await db.deleteObjectField('locks', value);
|
await db.deleteObjectField('locks', value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Notes._normalizeTags = async (tag, cid) => {
|
||||||
|
const systemTags = (meta.config.systemTags || '').split(',');
|
||||||
|
const maxTags = await categories.getCategoryField(cid, 'maxTags');
|
||||||
|
const tags = (tag || [])
|
||||||
|
.map((tag) => {
|
||||||
|
tag.name = tag.name.startsWith('#') ? tag.name.slice(1) : tag.name;
|
||||||
|
return tag;
|
||||||
|
})
|
||||||
|
.filter(o => o.type === 'Hashtag' && !systemTags.includes(o.name))
|
||||||
|
.map(t => t.name);
|
||||||
|
|
||||||
|
if (tags.length > maxTags) {
|
||||||
|
tags.length = maxTags;
|
||||||
|
}
|
||||||
|
|
||||||
|
return tags;
|
||||||
|
};
|
||||||
|
|
||||||
Notes.assert = async (uid, input, options = { skipChecks: false }) => {
|
Notes.assert = async (uid, input, options = { skipChecks: false }) => {
|
||||||
/**
|
/**
|
||||||
* Given the id or object of any as:Note, either retrieves the full context (if resolvable),
|
* Given the id or object of any as:Note, either retrieves the full context (if resolvable),
|
||||||
@@ -166,22 +184,9 @@ Notes.assert = async (uid, input, options = { skipChecks: false }) => {
|
|||||||
const count = unprocessed.length;
|
const count = unprocessed.length;
|
||||||
activitypub.helpers.log(`[notes/assert] ${count} new note(s) found.`);
|
activitypub.helpers.log(`[notes/assert] ${count} new note(s) found.`);
|
||||||
|
|
||||||
let tags;
|
|
||||||
if (!hasTid) {
|
if (!hasTid) {
|
||||||
const { to, cc, attachment } = mainPost._activitypub;
|
const { to, cc, attachment } = mainPost._activitypub;
|
||||||
const systemTags = (meta.config.systemTags || '').split(',');
|
const tags = Notes._normalizeTags(mainPost._activitypub.tag || []);
|
||||||
const maxTags = await categories.getCategoryField(cid, 'maxTags');
|
|
||||||
tags = (mainPost._activitypub.tag || [])
|
|
||||||
.map((tag) => {
|
|
||||||
tag.name = tag.name.startsWith('#') ? tag.name.slice(1) : tag.name;
|
|
||||||
return tag;
|
|
||||||
})
|
|
||||||
.filter(o => o.type === 'Hashtag' && !systemTags.includes(o.name))
|
|
||||||
.map(t => t.name);
|
|
||||||
|
|
||||||
if (tags.length > maxTags) {
|
|
||||||
tags.length = maxTags;
|
|
||||||
}
|
|
||||||
|
|
||||||
await Promise.all([
|
await Promise.all([
|
||||||
topics.post({
|
topics.post({
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ module.exports = function (Posts) {
|
|||||||
await scheduledTopicCheck(data, topicData);
|
await scheduledTopicCheck(data, topicData);
|
||||||
|
|
||||||
data.content = data.content === null ? postData.content : data.content;
|
data.content = data.content === null ? postData.content : data.content;
|
||||||
const oldContent = postData.content; // for diffing purposes
|
const oldContent = postData.sourceContent || postData.content; // for diffing purposes
|
||||||
const editPostData = getEditPostData(data, topicData, postData);
|
const editPostData = getEditPostData(data, topicData, postData);
|
||||||
|
|
||||||
if (data.handle) {
|
if (data.handle) {
|
||||||
@@ -55,7 +55,7 @@ module.exports = function (Posts) {
|
|||||||
]);
|
]);
|
||||||
|
|
||||||
await Posts.setPostFields(data.pid, result.post);
|
await Posts.setPostFields(data.pid, result.post);
|
||||||
const contentChanged = data.content !== oldContent ||
|
const contentChanged = ((data.sourceContent || data.content) !== oldContent) ||
|
||||||
topic.renamed ||
|
topic.renamed ||
|
||||||
topic.tagsupdated;
|
topic.tagsupdated;
|
||||||
|
|
||||||
@@ -194,6 +194,7 @@ module.exports = function (Posts) {
|
|||||||
function getEditPostData(data, topicData, postData) {
|
function getEditPostData(data, topicData, postData) {
|
||||||
const editPostData = {
|
const editPostData = {
|
||||||
content: data.content,
|
content: data.content,
|
||||||
|
sourceContent: data.sourceContent,
|
||||||
editor: data.uid,
|
editor: data.uid,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user