summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorsyuilo <Syuilotan@yahoo.co.jp>2021-03-18 17:35:47 +0900
committersyuilo <Syuilotan@yahoo.co.jp>2021-03-18 17:35:47 +0900
commit449ea4b669252cff3dee0de0192ce4a353106444 (patch)
treebb773d28ebee5d7ce06e1faa8fefedabe48773d9 /src
parentMerge branch 'develop' of https://github.com/syuilo/misskey into develop (diff)
downloadsharkey-449ea4b669252cff3dee0de0192ce4a353106444.tar.gz
sharkey-449ea4b669252cff3dee0de0192ce4a353106444.tar.bz2
sharkey-449ea4b669252cff3dee0de0192ce4a353106444.zip
perf: reduce query
Diffstat (limited to 'src')
-rw-r--r--src/services/note/reaction/create.ts47
1 files changed, 27 insertions, 20 deletions
diff --git a/src/services/note/reaction/create.ts b/src/services/note/reaction/create.ts
index adc96ddc1f..8de9f53a17 100644
--- a/src/services/note/reaction/create.ts
+++ b/src/services/note/reaction/create.ts
@@ -11,34 +11,41 @@ import { perUserReactionsChart } from '../../chart';
import { genId } from '../../../misc/gen-id';
import { createNotification } from '../../create-notification';
import deleteReaction from './delete';
+import { isDuplicateKeyValueError } from '../../../misc/is-duplicate-key-value-error';
export default async (user: User, note: Note, reaction?: string) => {
reaction = await toDbReaction(reaction, user.host);
- const exist = await NoteReactions.findOne({
- noteId: note.id,
- userId: user.id,
- });
+ let record;
+
+ // Create reaction
+ try {
+ record = await NoteReactions.save({
+ id: genId(),
+ createdAt: new Date(),
+ noteId: note.id,
+ userId: user.id,
+ reaction
+ });
+ } catch (e) {
+ if (isDuplicateKeyValueError(e)) {
+ record = await NoteReactions.findOneOrFail({
+ noteId: note.id,
+ userId: user.id,
+ });
- if (exist) {
- if (exist.reaction !== reaction) {
- // 別のリアクションがすでにされていたら置き換える
- await deleteReaction(user, note);
+ if (record.reaction !== reaction) {
+ // 別のリアクションがすでにされていたら置き換える
+ await deleteReaction(user, note);
+ } else {
+ // 同じリアクションがすでにされていたら何もしない
+ return;
+ }
} else {
- // 同じリアクションがすでにされていたら何もしない
- return;
+ throw e;
}
}
- // Create reaction
- const inserted = await NoteReactions.save({
- id: genId(),
- createdAt: new Date(),
- noteId: note.id,
- userId: user.id,
- reaction
- });
-
// Increment reactions count
const sql = `jsonb_set("reactions", '{${reaction}}', (COALESCE("reactions"->>'${reaction}', '0')::int + 1)::text::jsonb)`;
await Notes.createQueryBuilder().update()
@@ -101,7 +108,7 @@ export default async (user: User, note: Note, reaction?: string) => {
//#region 配信
if (Users.isLocalUser(user) && !note.localOnly) {
- const content = renderActivity(await renderLike(inserted, note));
+ const content = renderActivity(await renderLike(record, note));
const dm = new DeliverManager(user, content);
if (note.userHost !== null) {
const reactee = await Users.findOne(note.userId);