diff options
| author | MeiMei <30769358+mei23@users.noreply.github.com> | 2018-10-29 20:32:42 +0900 |
|---|---|---|
| committer | syuilo <Syuilotan@yahoo.co.jp> | 2018-10-29 20:32:42 +0900 |
| commit | d64dc458999afdc0bfd5f662a583bd1a0f6eebb3 (patch) | |
| tree | 7bafd2682c100ef3badb7dd0d992dbf35930678a /src/services/blocking | |
| parent | Merge branch 'develop' of https://github.com/syuilo/misskey into develop (diff) | |
| download | sharkey-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.ts | 121 | ||||
| -rw-r--r-- | src/services/blocking/delete.ts | 28 |
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); + } +} |