diff options
| author | MeiMei <30769358+mei23@users.noreply.github.com> | 2020-02-04 08:26:00 +0900 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-02-04 08:26:00 +0900 |
| commit | b7a4f286b02c8ebb376779569e5564f52496913e (patch) | |
| tree | e113d71516c362eabd7034b3503769d343ec3249 /src/services/note | |
| parent | Add Unicode 12.1 Emojis (#5825) (diff) | |
| download | sharkey-b7a4f286b02c8ebb376779569e5564f52496913e.tar.gz sharkey-b7a4f286b02c8ebb376779569e5564f52496913e.tar.bz2 sharkey-b7a4f286b02c8ebb376779569e5564f52496913e.zip | |
リモート投稿にリモートでされたリアクションが表示されるように (#5817)
* 第3インスタンスへのLikeも受け入れるように
* リアクション済みだったらエラーにせずに置き換えるように
* Likeを第3インスタンスにdeliverするように
* fix
* fix
* 同じリアクションがすでにされていたら何もしない
* リモートから自身の投稿へリアクションした場合にエラーにならないように
Diffstat (limited to 'src/services/note')
| -rw-r--r-- | src/services/note/reaction/create.ts | 42 | ||||
| -rw-r--r-- | src/services/note/reaction/delete.ts | 17 |
2 files changed, 36 insertions, 23 deletions
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 }; |