summaryrefslogtreecommitdiff
path: root/src/services/following/create.ts
diff options
context:
space:
mode:
authorsyuilo <Syuilotan@yahoo.co.jp>2021-11-12 02:02:25 +0900
committersyuilo <Syuilotan@yahoo.co.jp>2021-11-12 02:02:25 +0900
commit0e4a111f81cceed275d9bec2695f6e401fb654d8 (patch)
tree40874799472fa07416f17b50a398ac33b7771905 /src/services/following/create.ts
parentupdate deps (diff)
downloadmisskey-0e4a111f81cceed275d9bec2695f6e401fb654d8.tar.gz
misskey-0e4a111f81cceed275d9bec2695f6e401fb654d8.tar.bz2
misskey-0e4a111f81cceed275d9bec2695f6e401fb654d8.zip
refactoring
Resolve #7779
Diffstat (limited to 'src/services/following/create.ts')
-rw-r--r--src/services/following/create.ts180
1 files changed, 0 insertions, 180 deletions
diff --git a/src/services/following/create.ts b/src/services/following/create.ts
deleted file mode 100644
index 4d0754b504..0000000000
--- a/src/services/following/create.ts
+++ /dev/null
@@ -1,180 +0,0 @@
-import { publishMainStream, publishUserEvent } from '@/services/stream';
-import { renderActivity } from '@/remote/activitypub/renderer/index';
-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/index';
-import createFollowRequest from './requests/create';
-import { registerOrFetchInstanceDoc } from '../register-or-fetch-instance-doc';
-import Logger from '../logger';
-import { IdentifiableError } from '@/misc/identifiable-error';
-import { User } from '@/models/entities/user';
-import { Followings, Users, FollowRequests, Blockings, Instances, UserProfiles } from '@/models/index';
-import { instanceChart, perUserFollowingChart } from '@/services/chart/index';
-import { genId } from '@/misc/gen-id';
-import { createNotification } from '../create-notification';
-import { isDuplicateKeyValueError } from '@/misc/is-duplicate-key-value-error';
-
-const logger = new Logger('following/create');
-
-export async function insertFollowingDoc(followee: { id: User['id']; host: User['host']; uri: User['host']; inbox: User['inbox']; sharedInbox: User['sharedInbox'] }, follower: { id: User['id']; host: User['host']; uri: User['host']; inbox: User['inbox']; sharedInbox: User['sharedInbox'] }) {
- if (follower.id === followee.id) return;
-
- let alreadyFollowed = false;
-
- await Followings.insert({
- id: genId(),
- createdAt: new Date(),
- followerId: follower.id,
- followeeId: followee.id,
-
- // 非正規化
- followerHost: follower.host,
- followerInbox: Users.isRemoteUser(follower) ? follower.inbox : null,
- followerSharedInbox: Users.isRemoteUser(follower) ? follower.sharedInbox : null,
- followeeHost: followee.host,
- followeeInbox: Users.isRemoteUser(followee) ? followee.inbox : null,
- followeeSharedInbox: Users.isRemoteUser(followee) ? followee.sharedInbox : null
- }).catch(e => {
- if (isDuplicateKeyValueError(e) && Users.isRemoteUser(follower) && Users.isLocalUser(followee)) {
- logger.info(`Insert duplicated ignore. ${follower.id} => ${followee.id}`);
- alreadyFollowed = true;
- } else {
- throw e;
- }
- });
-
- const req = await FollowRequests.findOne({
- followeeId: followee.id,
- followerId: follower.id
- });
-
- if (req) {
- await FollowRequests.delete({
- followeeId: followee.id,
- followerId: follower.id
- });
-
- // 通知を作成
- createNotification(follower.id, 'followRequestAccepted', {
- notifierId: followee.id,
- });
- }
-
- if (alreadyFollowed) return;
-
- //#region Increment counts
- Users.increment({ id: follower.id }, 'followingCount', 1);
- Users.increment({ id: followee.id }, 'followersCount', 1);
- //#endregion
-
- //#region Update instance stats
- if (Users.isRemoteUser(follower) && Users.isLocalUser(followee)) {
- registerOrFetchInstanceDoc(follower.host).then(i => {
- Instances.increment({ id: i.id }, 'followingCount', 1);
- instanceChart.updateFollowing(i.host, true);
- });
- } else if (Users.isLocalUser(follower) && Users.isRemoteUser(followee)) {
- registerOrFetchInstanceDoc(followee.host).then(i => {
- Instances.increment({ id: i.id }, 'followersCount', 1);
- instanceChart.updateFollowers(i.host, true);
- });
- }
- //#endregion
-
- perUserFollowingChart.update(follower, followee, true);
-
- // Publish follow event
- if (Users.isLocalUser(follower)) {
- Users.pack(followee.id, follower, {
- detail: true
- }).then(packed => {
- publishUserEvent(follower.id, 'follow', packed);
- publishMainStream(follower.id, 'follow', packed);
- });
- }
-
- // Publish followed event
- if (Users.isLocalUser(followee)) {
- Users.pack(follower.id, followee).then(packed => publishMainStream(followee.id, 'followed', packed));
-
- // 通知を作成
- createNotification(followee.id, 'follow', {
- notifierId: follower.id
- });
- }
-}
-
-export default async function(_follower: { id: User['id'] }, _followee: { id: User['id'] }, requestId?: string) {
- const [follower, followee] = await Promise.all([
- Users.findOneOrFail(_follower.id),
- Users.findOneOrFail(_followee.id)
- ]);
-
- // check blocking
- const [blocking, blocked] = await Promise.all([
- Blockings.findOne({
- blockerId: follower.id,
- blockeeId: followee.id,
- }),
- Blockings.findOne({
- blockerId: followee.id,
- blockeeId: follower.id,
- })
- ]);
-
- if (Users.isRemoteUser(follower) && Users.isLocalUser(followee) && blocked) {
- // リモートフォローを受けてブロックしていた場合は、エラーにするのではなくRejectを送り返しておしまい。
- const content = renderActivity(renderReject(renderFollow(follower, followee, requestId), followee));
- deliver(followee , content, follower.inbox);
- return;
- } else if (Users.isRemoteUser(follower) && Users.isLocalUser(followee) && blocking) {
- // リモートフォローを受けてブロックされているはずの場合だったら、ブロック解除しておく。
- await Blockings.delete(blocking.id);
- } else {
- // それ以外は単純に例外
- if (blocking != null) throw new IdentifiableError('710e8fb0-b8c3-4922-be49-d5d93d8e6a6e', 'blocking');
- if (blocked != null) throw new IdentifiableError('3338392a-f764-498d-8855-db939dcf8c48', 'blocked');
- }
-
- const followeeProfile = await UserProfiles.findOneOrFail(followee.id);
-
- // フォロー対象が鍵アカウントである or
- // フォロワーがBotであり、フォロー対象がBotからのフォローに慎重である or
- // フォロワーがローカルユーザーであり、フォロー対象がリモートユーザーである
- // 上記のいずれかに当てはまる場合はすぐフォローせずにフォローリクエストを発行しておく
- if (followee.isLocked || (followeeProfile.carefulBot && follower.isBot) || (Users.isLocalUser(follower) && Users.isRemoteUser(followee))) {
- let autoAccept = false;
-
- // 鍵アカウントであっても、既にフォローされていた場合はスルー
- const following = await Followings.findOne({
- followerId: follower.id,
- followeeId: followee.id,
- });
- if (following) {
- autoAccept = true;
- }
-
- // フォローしているユーザーは自動承認オプション
- if (!autoAccept && (Users.isLocalUser(followee) && followeeProfile.autoAcceptFollowed)) {
- const followed = await Followings.findOne({
- followerId: followee.id,
- followeeId: follower.id
- });
-
- if (followed) autoAccept = true;
- }
-
- if (!autoAccept) {
- await createFollowRequest(follower, followee, requestId);
- return;
- }
- }
-
- await insertFollowingDoc(followee, follower);
-
- if (Users.isRemoteUser(follower) && Users.isLocalUser(followee)) {
- const content = renderActivity(renderAccept(renderFollow(follower, followee, requestId), followee));
- deliver(followee, content, follower.inbox);
- }
-}