summaryrefslogtreecommitdiff
path: root/src/services/following/delete.ts
diff options
context:
space:
mode:
Diffstat (limited to 'src/services/following/delete.ts')
-rw-r--r--src/services/following/delete.ts64
1 files changed, 64 insertions, 0 deletions
diff --git a/src/services/following/delete.ts b/src/services/following/delete.ts
new file mode 100644
index 0000000000..364a4803b9
--- /dev/null
+++ b/src/services/following/delete.ts
@@ -0,0 +1,64 @@
+import User, { isLocalUser, isRemoteUser, pack as packUser, IUser } from '../../models/user';
+import Following from '../../models/following';
+import FollowingLog from '../../models/following-log';
+import FollowedLog from '../../models/followed-log';
+import event from '../../publishers/stream';
+import context from '../../remote/activitypub/renderer/context';
+import renderFollow from '../../remote/activitypub/renderer/follow';
+import renderUndo from '../../remote/activitypub/renderer/undo';
+import { deliver } from '../../queue';
+
+export default async function(follower: IUser, followee: IUser, activity?) {
+ const following = await Following.findOne({
+ followerId: follower._id,
+ followeeId: followee._id
+ });
+
+ if (following == null) {
+ console.warn('フォロー解除がリクエストされましたがフォローしていませんでした');
+ return;
+ }
+
+ Following.remove({
+ _id: following._id
+ });
+
+ //#region Decrement following count
+ User.update({ _id: follower._id }, {
+ $inc: {
+ followingCount: -1
+ }
+ });
+
+ FollowingLog.insert({
+ createdAt: following.createdAt,
+ userId: follower._id,
+ count: follower.followingCount - 1
+ });
+ //#endregion
+
+ //#region Decrement followers count
+ User.update({ _id: followee._id }, {
+ $inc: {
+ followersCount: -1
+ }
+ });
+ FollowedLog.insert({
+ createdAt: following.createdAt,
+ userId: followee._id,
+ count: followee.followersCount - 1
+ });
+ //#endregion
+
+ // Publish unfollow event
+ if (isLocalUser(follower)) {
+ packUser(followee, follower).then(packed => event(follower._id, 'unfollow', packed));
+ }
+
+ if (isLocalUser(follower) && isRemoteUser(followee)) {
+ const content = renderUndo(renderFollow(follower, followee));
+ content['@context'] = context;
+
+ deliver(follower, content, followee.account.inbox).save();
+ }
+}