From 917e57d47536aec70c33ea63cb2f3868f21f8242 Mon Sep 17 00:00:00 2001
From: MeiMei <30769358+mei23@users.noreply.github.com>
Date: Tue, 11 May 2021 12:41:02 +0900
Subject: [PATCH] Fix #7431 (#7432)

* Fix #7431

* fix
---
 src/remote/activitypub/kernel/like.ts |  9 +++++++--
 src/services/note/reaction/create.ts  | 12 +++++++-----
 2 files changed, 14 insertions(+), 7 deletions(-)

diff --git a/src/remote/activitypub/kernel/like.ts b/src/remote/activitypub/kernel/like.ts
index a6f02a1f8f..6ba03e4a48 100644
--- a/src/remote/activitypub/kernel/like.ts
+++ b/src/remote/activitypub/kernel/like.ts
@@ -11,6 +11,11 @@ export default async (actor: IRemoteUser, activity: ILike) => {
 
 	await extractEmojis(activity.tag || [], actor.host).catch(() => null);
 
-	await create(actor, note, activity._misskey_reaction || activity.content || activity.name);
-	return `ok`;
+	return await create(actor, note, activity._misskey_reaction || activity.content || activity.name).catch(e => {
+		if (e.id === '51c42bb4-931a-456b-bff7-e5a8a70dd298') {
+			return 'skip: already reacted';
+		} else {
+			throw e;
+		}
+	}).then(() => 'ok');
 };
diff --git a/src/services/note/reaction/create.ts b/src/services/note/reaction/create.ts
index e2e7fc54ef..ce6ae08b30 100644
--- a/src/services/note/reaction/create.ts
+++ b/src/services/note/reaction/create.ts
@@ -13,12 +13,13 @@ import { createNotification } from '../../create-notification';
 import deleteReaction from './delete';
 import { isDuplicateKeyValueError } from '@/misc/is-duplicate-key-value-error';
 import { NoteReaction } from '../../../models/entities/note-reaction';
+import { IdentifiableError } from '@/misc/identifiable-error';
 
 export default async (user: { id: User['id']; host: User['host']; }, note: Note, reaction?: string) => {
 	// TODO: cache
 	reaction = await toDbReaction(reaction, user.host);
 
-	let record: NoteReaction = {
+	const record: NoteReaction = {
 		id: genId(),
 		createdAt: new Date(),
 		noteId: note.id,
@@ -31,17 +32,18 @@ export default async (user: { id: User['id']; host: User['host']; }, note: Note,
 		await NoteReactions.insert(record);
 	} catch (e) {
 		if (isDuplicateKeyValueError(e)) {
-			record = await NoteReactions.findOneOrFail({
+			const exists = await NoteReactions.findOneOrFail({
 				noteId: note.id,
 				userId: user.id,
 			});
 
-			if (record.reaction !== reaction) {
+			if (exists.reaction !== reaction) {
 				// 別のリアクションがすでにされていたら置き換える
 				await deleteReaction(user, note);
+				await NoteReactions.insert(record);
 			} else {
-				// 同じリアクションがすでにされていたら何もしない
-				return;
+				// 同じリアクションがすでにされていたらエラー
+				throw new IdentifiableError('51c42bb4-931a-456b-bff7-e5a8a70dd298');
 			}
 		} else {
 			throw e;