summaryrefslogtreecommitdiff
path: root/packages/backend
diff options
context:
space:
mode:
Diffstat (limited to 'packages/backend')
-rw-r--r--packages/backend/src/core/activitypub/models/ApNoteService.ts52
-rw-r--r--packages/backend/test/unit/activitypub.ts15
2 files changed, 47 insertions, 20 deletions
diff --git a/packages/backend/src/core/activitypub/models/ApNoteService.ts b/packages/backend/src/core/activitypub/models/ApNoteService.ts
index e107b9fe5a..41d1bc48a7 100644
--- a/packages/backend/src/core/activitypub/models/ApNoteService.ts
+++ b/packages/backend/src/core/activitypub/models/ApNoteService.ts
@@ -131,13 +131,13 @@ export class ApNoteService {
this.logger.debug(`Note fetched: ${JSON.stringify(note, null, 2)}`);
if (note.id && !checkHttps(note.id)) {
- throw new Error('unexpected shcema of note.id: ' + note.id);
+ throw new Error('unexpected schema of note.id: ' + note.id);
}
const url = getOneApHrefNullable(note.url);
if (url && !checkHttps(url)) {
- throw new Error('unexpected shcema of note url: ' + url);
+ throw new Error('unexpected schema of note url: ' + url);
}
this.logger.info(`Creating the Note: ${note.id}`);
@@ -271,24 +271,36 @@ export class ApNoteService {
const poll = await this.apQuestionService.extractPollFromQuestion(note, resolver).catch(() => undefined);
- return await this.noteCreateService.create(actor, {
- createdAt: note.published ? new Date(note.published) : null,
- files,
- reply,
- renote: quote,
- name: note.name,
- cw,
- text,
- localOnly: false,
- visibility,
- visibleUsers,
- apMentions,
- apHashtags,
- apEmojis,
- poll,
- uri: note.id,
- url: url,
- }, silent);
+ try {
+ return await this.noteCreateService.create(actor, {
+ createdAt: note.published ? new Date(note.published) : null,
+ files,
+ reply,
+ renote: quote,
+ name: note.name,
+ cw,
+ text,
+ localOnly: false,
+ visibility,
+ visibleUsers,
+ apMentions,
+ apHashtags,
+ apEmojis,
+ poll,
+ uri: note.id,
+ url: url,
+ }, silent);
+ } catch (err: any) {
+ if (err.name !== 'duplicated') {
+ throw err;
+ }
+ this.logger.info('The note is already inserted while creating itself, reading again');
+ const duplicate = await this.fetchNote(value);
+ if (!duplicate) {
+ throw new Error('The note creation failed with duplication error even when there is no duplication');
+ }
+ return duplicate;
+ }
}
/**
diff --git a/packages/backend/test/unit/activitypub.ts b/packages/backend/test/unit/activitypub.ts
index 378f02e8e3..73209523b5 100644
--- a/packages/backend/test/unit/activitypub.ts
+++ b/packages/backend/test/unit/activitypub.ts
@@ -259,6 +259,21 @@ describe('ActivityPub', () => {
assert.strictEqual(note.text, 'test test foo');
assert.strictEqual(note.uri, actor2Note.id);
});
+
+ test('Fetch a note that is a featured note of the attributed actor', async () => {
+ const actor = createRandomActor();
+ actor.featured = `${actor.id}/collections/featured`;
+
+ const featured = createRandomFeaturedCollection(actor, 5);
+ const firstNote = (featured.items as NonTransientIPost[])[0];
+
+ resolver.register(actor.id, actor);
+ resolver.register(actor.featured, featured);
+ resolver.register(firstNote.id, firstNote);
+
+ const note = await noteService.createNote(firstNote.id as string, resolver);
+ assert.strictEqual(note?.uri, firstNote.id);
+ });
});
describe('Images', () => {