summaryrefslogtreecommitdiff
path: root/src/services/blocking
diff options
context:
space:
mode:
authorMeiMei <30769358+mei23@users.noreply.github.com>2018-10-29 20:32:42 +0900
committersyuilo <Syuilotan@yahoo.co.jp>2018-10-29 20:32:42 +0900
commitd64dc458999afdc0bfd5f662a583bd1a0f6eebb3 (patch)
tree7bafd2682c100ef3badb7dd0d992dbf35930678a /src/services/blocking
parentMerge branch 'develop' of https://github.com/syuilo/misskey into develop (diff)
downloadsharkey-d64dc458999afdc0bfd5f662a583bd1a0f6eebb3.tar.gz
sharkey-d64dc458999afdc0bfd5f662a583bd1a0f6eebb3.tar.bz2
sharkey-d64dc458999afdc0bfd5f662a583bd1a0f6eebb3.zip
User blocking (Following part) (#3035)
* block wip * UndoBlock * UnBlock * wip * follow * UI * fix
Diffstat (limited to 'src/services/blocking')
-rw-r--r--src/services/blocking/create.ts121
-rw-r--r--src/services/blocking/delete.ts28
2 files changed, 149 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);
+ }
+}
diff --git a/src/services/blocking/delete.ts b/src/services/blocking/delete.ts
new file mode 100644
index 0000000000..bc331d491a
--- /dev/null
+++ b/src/services/blocking/delete.ts
@@ -0,0 +1,28 @@
+import { isLocalUser, isRemoteUser, IUser } from '../../models/user';
+import Blocking from '../../models/blocking';
+import pack from '../../remote/activitypub/renderer';
+import renderBlock from '../../remote/activitypub/renderer/block';
+import renderUndo from '../../remote/activitypub/renderer/undo';
+import { deliver } from '../../queue';
+
+export default async function(blocker: IUser, blockee: IUser) {
+ const blocking = await Blocking.findOne({
+ blockerId: blocker._id,
+ blockeeId: blockee._id
+ });
+
+ if (blocking == null) {
+ console.warn('ブロック解除がリクエストされましたがブロックしていませんでした');
+ return;
+ }
+
+ Blocking.remove({
+ _id: blocking._id
+ });
+
+ // deliver if remote bloking
+ if (isLocalUser(blocker) && isRemoteUser(blockee)) {
+ const content = pack(renderUndo(renderBlock(blocker, blockee), blocker));
+ deliver(blocker, content, blockee.inbox);
+ }
+}