From d64dc458999afdc0bfd5f662a583bd1a0f6eebb3 Mon Sep 17 00:00:00 2001 From: MeiMei <30769358+mei23@users.noreply.github.com> Date: Mon, 29 Oct 2018 20:32:42 +0900 Subject: User blocking (Following part) (#3035) * block wip * UndoBlock * UnBlock * wip * follow * UI * fix --- src/services/following/create.ts | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) (limited to 'src/services/following/create.ts') diff --git a/src/services/following/create.ts b/src/services/following/create.ts index 87d13c444b..38367399e3 100644 --- a/src/services/following/create.ts +++ b/src/services/following/create.ts @@ -1,15 +1,45 @@ import User, { isLocalUser, isRemoteUser, pack as packUser, IUser } from '../../models/user'; import Following from '../../models/following'; +import Blocking from '../../models/blocking'; import { publishMainStream } from '../../stream'; import notify from '../../notify'; import pack from '../../remote/activitypub/renderer'; import renderFollow from '../../remote/activitypub/renderer/follow'; import renderAccept from '../../remote/activitypub/renderer/accept'; +import renderReject from '../../remote/activitypub/renderer/reject'; import { deliver } from '../../queue'; import createFollowRequest from './requests/create'; import perUserFollowingChart from '../../chart/per-user-following'; export default async function(follower: IUser, followee: IUser, requestId?: string) { + // check blocking + const [ blocking, blocked ] = await Promise.all([ + Blocking.findOne({ + blockerId: follower._id, + blockeeId: followee._id, + }), + Blocking.findOne({ + blockerId: followee._id, + blockeeId: follower._id, + }) + ]); + + if (isRemoteUser(follower) && isLocalUser(followee) && blocked) { + // リモートフォローを受けてブロックしていた場合は、エラーにするのではなくRejectを送り返しておしまい。 + const content = pack(renderReject(renderFollow(follower, followee, requestId), followee)); + deliver(followee , content, follower.inbox); + return; + } else if (isRemoteUser(follower) && isLocalUser(followee) && blocking) { + // リモートフォローを受けてブロックされているはずの場合だったら、ブロック解除しておく。 + await Blocking.remove({ + _id: blocking._id + }); + } else { + // それ以外は単純に例外 + if (blocking != null) throw new Error('blocking'); + if (blocked != null) throw new Error('blocked'); + } + // フォロー対象が鍵アカウントである or // フォロワーがBotであり、フォロー対象がBotからのフォローに慎重である or // フォロワーがローカルユーザーであり、フォロー対象がリモートユーザーである -- cgit v1.2.3-freya