summaryrefslogtreecommitdiff
path: root/src/services/blocking/create.ts
diff options
context:
space:
mode:
Diffstat (limited to 'src/services/blocking/create.ts')
-rw-r--r--src/services/blocking/create.ts121
1 files changed, 121 insertions, 0 deletions
diff --git a/src/services/blocking/create.ts b/src/services/blocking/create.ts
new file mode 100644
index 0000000000..11b2954af6
--- /dev/null
+++ b/src/services/blocking/create.ts
@@ -0,0 +1,121 @@
+import User, { isLocalUser, isRemoteUser, pack as packUser, IUser } from '../../models/user';
+import Following from '../../models/following';
+import FollowRequest from '../../models/follow-request';
+import { publishMainStream } from '../../stream';
+import pack from '../../remote/activitypub/renderer';
+import renderFollow from '../../remote/activitypub/renderer/follow';
+import renderUndo from '../../remote/activitypub/renderer/undo';
+import renderBlock from '../../remote/activitypub/renderer/block';
+import { deliver } from '../../queue';
+import renderReject from '../../remote/activitypub/renderer/reject';
+import perUserFollowingChart from '../../chart/per-user-following';
+import Blocking from '../../models/blocking';
+
+export default async function(blocker: IUser, blockee: IUser) {
+
+ await Promise.all([
+ cancelRequest(blocker, blockee),
+ cancelRequest(blockee, blocker),
+ unFollow(blocker, blockee),
+ unFollow(blockee, blocker)
+ ]);
+
+ await Blocking.insert({
+ createdAt: new Date(),
+ blockerId: blocker._id,
+ blockeeId: blockee._id,
+ });
+
+ if (isLocalUser(blocker) && isRemoteUser(blockee)) {
+ const content = pack(renderBlock(blocker, blockee));
+ deliver(blocker, content, blockee.inbox);
+ }
+}
+
+async function cancelRequest(follower: IUser, followee: IUser) {
+ const request = await FollowRequest.findOne({
+ followeeId: followee._id,
+ followerId: follower._id
+ });
+
+ if (request == null) {
+ return;
+ }
+
+ await FollowRequest.remove({
+ followeeId: followee._id,
+ followerId: follower._id
+ });
+
+ await User.update({ _id: followee._id }, {
+ $inc: {
+ pendingReceivedFollowRequestsCount: -1
+ }
+ });
+
+ if (isLocalUser(followee)) {
+ packUser(followee, followee, {
+ detail: true
+ }).then(packed => publishMainStream(followee._id, 'meUpdated', packed));
+ }
+
+ if (isLocalUser(follower)) {
+ packUser(followee, follower).then(packed => publishMainStream(follower._id, 'unfollow', packed));
+ }
+
+ // リモートにフォローリクエストをしていたらUndoFollow送信
+ if (isLocalUser(follower) && isRemoteUser(followee)) {
+ const content = pack(renderUndo(renderFollow(follower, followee), follower));
+ deliver(follower, content, followee.inbox);
+ }
+
+ // リモートからフォローリクエストを受けていたらReject送信
+ if (isRemoteUser(follower) && isLocalUser(followee)) {
+ const content = pack(renderReject(renderFollow(follower, followee, request.requestId), followee));
+ deliver(followee, content, follower.inbox);
+ }
+}
+
+async function unFollow(follower: IUser, followee: IUser) {
+ const following = await Following.findOne({
+ followerId: follower._id,
+ followeeId: followee._id
+ });
+
+ if (following == null) {
+ return;
+ }
+
+ Following.remove({
+ _id: following._id
+ });
+
+ //#region Decrement following count
+ User.update({ _id: follower._id }, {
+ $inc: {
+ followingCount: -1
+ }
+ });
+ //#endregion
+
+ //#region Decrement followers count
+ User.update({ _id: followee._id }, {
+ $inc: {
+ followersCount: -1
+ }
+ });
+ //#endregion
+
+ perUserFollowingChart.update(follower, followee, false);
+
+ // Publish unfollow event
+ if (isLocalUser(follower)) {
+ packUser(followee, follower).then(packed => publishMainStream(follower._id, 'unfollow', packed));
+ }
+
+ // リモートにフォローをしていたらUndoFollow送信
+ if (isLocalUser(follower) && isRemoteUser(followee)) {
+ const content = pack(renderUndo(renderFollow(follower, followee), follower));
+ deliver(follower, content, followee.inbox);
+ }
+}