From b7a4f286b02c8ebb376779569e5564f52496913e Mon Sep 17 00:00:00 2001 From: MeiMei <30769358+mei23@users.noreply.github.com> Date: Tue, 4 Feb 2020 08:26:00 +0900 Subject: リモート投稿にリモートでされたリアクションが表示されるように (#5817) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 第3インスタンスへのLikeも受け入れるように * リアクション済みだったらエラーにせずに置き換えるように * Likeを第3インスタンスにdeliverするように * fix * fix * 同じリアクションがすでにされていたら何もしない * リモートから自身の投稿へリアクションした場合にエラーにならないように --- src/services/note/reaction/create.ts | 42 ++++++++++++++++++++++-------------- src/services/note/reaction/delete.ts | 17 +++++++++------ 2 files changed, 36 insertions(+), 23 deletions(-) (limited to 'src/services/note') diff --git a/src/services/note/reaction/create.ts b/src/services/note/reaction/create.ts index a09fbd9c2f..aee31813af 100644 --- a/src/services/note/reaction/create.ts +++ b/src/services/note/reaction/create.ts @@ -1,19 +1,18 @@ import { publishNoteStream } from '../../stream'; import watch from '../watch'; import renderLike from '../../../remote/activitypub/renderer/like'; -import { deliver } from '../../../queue'; +import DeliverManager from '../../../remote/activitypub/deliver-manager'; import { renderActivity } from '../../../remote/activitypub/renderer'; import { IdentifiableError } from '../../../misc/identifiable-error'; import { toDbReaction } from '../../../misc/reaction-lib'; -import { User } from '../../../models/entities/user'; +import { User, IRemoteUser } from '../../../models/entities/user'; import { Note } from '../../../models/entities/note'; import { NoteReactions, Users, NoteWatchings, Notes, UserProfiles } from '../../../models'; import { Not } from 'typeorm'; import { perUserReactionsChart } from '../../chart'; import { genId } from '../../../misc/gen-id'; -import { NoteReaction } from '../../../models/entities/note-reaction'; import { createNotification } from '../../create-notification'; -import { isDuplicateKeyValueError } from '../../../misc/is-duplicate-key-value-error'; +import deleteReaction from './delete'; export default async (user: User, note: Note, reaction?: string) => { // Myself @@ -23,6 +22,21 @@ export default async (user: User, note: Note, reaction?: string) => { reaction = await toDbReaction(reaction); + const exist = await NoteReactions.findOne({ + noteId: note.id, + userId: user.id, + }); + + if (exist) { + if (exist.reaction !== reaction) { + // 別のリアクションがすでにされていたら置き換える + await deleteReaction(user, note); + } else { + // 同じリアクションがすでにされていたら何もしない + return; + } + } + // Create reaction await NoteReactions.save({ id: genId(), @@ -30,13 +44,6 @@ export default async (user: User, note: Note, reaction?: string) => { noteId: note.id, userId: user.id, reaction - } as NoteReaction).catch(e => { - // duplicate key error - if (isDuplicateKeyValueError(e)) { - throw new IdentifiableError('51c42bb4-931a-456b-bff7-e5a8a70dd298', 'already reacted'); - } - - throw e; }); // Increment reactions count @@ -86,12 +93,15 @@ export default async (user: User, note: Note, reaction?: string) => { } //#region 配信 - // リアクターがローカルユーザーかつリアクション対象がリモートユーザーの投稿なら配送 - if (Users.isLocalUser(user) && note.userHost !== null) { + if (Users.isLocalUser(user) && !note.localOnly) { const content = renderActivity(renderLike(user, note, reaction)); - Users.findOne(note.userId).then(u => { - deliver(user, content, u!.inbox); - }); + const dm = new DeliverManager(user, content); + if (note.userHost !== null) { + const reactee = await Users.findOne(note.userId) + dm.addDirectRecipe(reactee as IRemoteUser); + } + dm.addFollowersRecipe(); + dm.execute(); } //#endregion }; diff --git a/src/services/note/reaction/delete.ts b/src/services/note/reaction/delete.ts index 6e9611ca5a..533c3b4062 100644 --- a/src/services/note/reaction/delete.ts +++ b/src/services/note/reaction/delete.ts @@ -2,9 +2,9 @@ import { publishNoteStream } from '../../stream'; import renderLike from '../../../remote/activitypub/renderer/like'; import renderUndo from '../../../remote/activitypub/renderer/undo'; import { renderActivity } from '../../../remote/activitypub/renderer'; -import { deliver } from '../../../queue'; +import DeliverManager from '../../../remote/activitypub/deliver-manager'; import { IdentifiableError } from '../../../misc/identifiable-error'; -import { User } from '../../../models/entities/user'; +import { User, IRemoteUser } from '../../../models/entities/user'; import { Note } from '../../../models/entities/note'; import { NoteReactions, Users, Notes } from '../../../models'; @@ -39,12 +39,15 @@ export default async (user: User, note: Note) => { }); //#region 配信 - // リアクターがローカルユーザーかつリアクション対象がリモートユーザーの投稿なら配送 - if (Users.isLocalUser(user) && (note.userHost !== null)) { + if (Users.isLocalUser(user) && !note.localOnly) { const content = renderActivity(renderUndo(renderLike(user, note, exist.reaction), user)); - Users.findOne(note.userId).then(u => { - deliver(user, content, u!.inbox); - }); + const dm = new DeliverManager(user, content); + if (note.userHost !== null) { + const reactee = await Users.findOne(note.userId) + dm.addDirectRecipe(reactee as IRemoteUser); + } + dm.addFollowersRecipe(); + dm.execute(); } //#endregion }; -- cgit v1.2.3-freya