リモート投稿にリモートでされたリアクションが表示されるように (#5817)

* 第3インスタンスへのLikeも受け入れるように

* リアクション済みだったらエラーにせずに置き換えるように

* Likeを第3インスタンスにdeliverするように

* fix

* fix

* 同じリアクションがすでにされていたら何もしない

* リモートから自身の投稿へリアクションした場合にエラーにならないように
This commit is contained in:
MeiMei
2020-02-04 08:26:00 +09:00
committed by GitHub
parent f640da911b
commit b7a4f286b0
4 changed files with 50 additions and 48 deletions

View File

@@ -1,23 +1,16 @@
import { IRemoteUser } from '../../../models/entities/user';
import { ILike } from '../type';
import { ILike, getApId } from '../type';
import create from '../../../services/note/reaction/create';
import { Notes } from '../../../models';
import { apLogger } from '../logger';
import { fetchNote } from '../models/note';
export default async (actor: IRemoteUser, activity: ILike) => {
const id = typeof activity.object == 'string' ? activity.object : activity.object.id;
if (id == null) throw new Error('missing id');
const targetUri = getApId(activity.object);
// Transform:
// https://misskey.ex/notes/xxxx to
// xxxx
const noteId = id.split('/').pop();
const note = await fetchNote(targetUri);
if (!note) return `skip: target note not found ${targetUri}`;
const note = await Notes.findOne(noteId);
if (note == null) {
apLogger.warn(`Like activity recivied, but no such note: ${id}`, { id });
return;
}
if (actor.id === note.userId) return `skip: cannot react to my note`;
await create(actor, note, activity._misskey_reaction || activity.content || activity.name);
return `ok`;
};

View File

@@ -1,21 +1,17 @@
import { IRemoteUser } from '../../../../models/entities/user';
import { ILike } from '../../type';
import { ILike, getApId } from '../../type';
import deleteReaction from '../../../../services/note/reaction/delete';
import { Notes } from '../../../../models';
import { fetchNote } from '../../models/note';
/**
* Process Undo.Like activity
*/
export default async (actor: IRemoteUser, activity: ILike): Promise<void> => {
const id = typeof activity.object == 'string' ? activity.object : activity.object.id;
if (id == null) throw new Error('missing id');
export default async (actor: IRemoteUser, activity: ILike) => {
const targetUri = getApId(activity.object);
const noteId = id.split('/').pop();
const note = await Notes.findOne(noteId);
if (note == null) {
throw new Error('note not found');
}
const note = await fetchNote(targetUri);
if (!note) return `skip: target note not found ${targetUri}`;
await deleteReaction(actor, note);
return `ok`;
};