forked from FoundKeyGang/FoundKey
perf: reduce query
This commit is contained in:
parent
e632806349
commit
449ea4b669
1 changed files with 29 additions and 22 deletions
|
@ -11,33 +11,40 @@ 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,
|
||||
});
|
||||
|
||||
if (exist) {
|
||||
if (exist.reaction !== reaction) {
|
||||
// 別のリアクションがすでにされていたら置き換える
|
||||
await deleteReaction(user, note);
|
||||
} else {
|
||||
// 同じリアクションがすでにされていたら何もしない
|
||||
return;
|
||||
}
|
||||
}
|
||||
let record;
|
||||
|
||||
// Create reaction
|
||||
const inserted = await NoteReactions.save({
|
||||
id: genId(),
|
||||
createdAt: new Date(),
|
||||
noteId: note.id,
|
||||
userId: user.id,
|
||||
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 (record.reaction !== reaction) {
|
||||
// 別のリアクションがすでにされていたら置き換える
|
||||
await deleteReaction(user, note);
|
||||
} else {
|
||||
// 同じリアクションがすでにされていたら何もしない
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
throw e;
|
||||
}
|
||||
}
|
||||
|
||||
// Increment reactions count
|
||||
const sql = `jsonb_set("reactions", '{${reaction}}', (COALESCE("reactions"->>'${reaction}', '0')::int + 1)::text::jsonb)`;
|
||||
|
@ -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);
|
||||
|
|
Loading…
Reference in a new issue