diff --git a/src/activitypub/contexts.js b/src/activitypub/contexts.js index 7ca954e097..0748e42ece 100644 --- a/src/activitypub/contexts.js +++ b/src/activitypub/contexts.js @@ -58,8 +58,20 @@ Contexts.getItems = async (uid, id, options) => { options.root = true; } - activitypub.helpers.log(`[activitypub/context] Retrieving context ${id}`); - let { type, items, orderedItems, first, next } = await activitypub.get('uid', uid, id); + // Page object instead of id + let object; + if (!id && options.object) { + object = options.object; + } else { + activitypub.helpers.log(`[activitypub/context] Retrieving context/page ${id}`); + try { + object = await activitypub.get('uid', uid, id); + } catch (e) { + return false; + } + } + let { type, items, orderedItems, first, next } = object; + if (!activitypub._constants.acceptable.contextTypes.has(type)) { return false; } @@ -87,14 +99,18 @@ Contexts.getItems = async (uid, id, options) => { if (next) { activitypub.helpers.log('[activitypub/context] Fetching next page...'); + const isUrl = activitypub.helpers.isUri(next); Array - .from(await Contexts.getItems(uid, next, { + .from(await Contexts.getItems(uid, isUrl && next, { ...options, root: false, + object: !isUrl && next, })) .forEach((item) => { chain.add(item); }); + + return chain; } // Handle special case where originating object is not actually part of the context collection diff --git a/src/activitypub/notes.js b/src/activitypub/notes.js index c8d3d87545..5ab12b733e 100644 --- a/src/activitypub/notes.js +++ b/src/activitypub/notes.js @@ -71,7 +71,7 @@ Notes.assert = async (uid, input, options = { skipChecks: false }) => { } // Reorder chain items by timestamp - // chain = chain.sort((a, b) => a.timestamp - b.timestamp); + chain = chain.sort((a, b) => a.timestamp - b.timestamp); const mainPost = chain[0]; let { pid: mainPid, tid, uid: authorId, timestamp, name, content, sourceContent, _activitypub } = mainPost;