diff --git a/src/services/following/delete.ts b/src/services/following/delete.ts index e3b5f8c414..8821611515 100644 --- a/src/services/following/delete.ts +++ b/src/services/following/delete.ts @@ -24,6 +24,22 @@ export default async function(follower: User, followee: User, silent = false) { await Followings.delete(following.id); + decrementFollowing(follower, followee); + + // Publish unfollow event + if (!silent && Users.isLocalUser(follower)) { + Users.pack(followee, follower, { + detail: true + }).then(packed => publishMainStream(follower.id, 'unfollow', packed)); + } + + if (Users.isLocalUser(follower) && Users.isRemoteUser(followee)) { + const content = renderActivity(renderUndo(renderFollow(follower, followee), follower)); + deliver(follower, content, followee.inbox); + } +} + +export async function decrementFollowing(follower: User, followee: User) { //#region Decrement following count Users.decrement({ id: follower.id }, 'followingCount', 1); //#endregion @@ -47,16 +63,4 @@ export default async function(follower: User, followee: User, silent = false) { //#endregion perUserFollowingChart.update(follower, followee, false); - - // Publish unfollow event - if (!silent && Users.isLocalUser(follower)) { - Users.pack(followee, follower, { - detail: true - }).then(packed => publishMainStream(follower.id, 'unfollow', packed)); - } - - if (Users.isLocalUser(follower) && Users.isRemoteUser(followee)) { - const content = renderActivity(renderUndo(renderFollow(follower, followee), follower)); - deliver(follower, content, followee.inbox); - } } diff --git a/src/services/following/requests/reject.ts b/src/services/following/requests/reject.ts index d5b5e48c41..9a8b14bbfd 100644 --- a/src/services/following/requests/reject.ts +++ b/src/services/following/requests/reject.ts @@ -4,7 +4,8 @@ import renderReject from '../../../remote/activitypub/renderer/reject'; import { deliver } from '../../../queue'; import { publishMainStream } from '../../stream'; import { User, ILocalUser } from '../../../models/entities/user'; -import { Users, FollowRequests } from '../../../models'; +import { Users, FollowRequests, Followings } from '../../../models'; +import { decrementFollowing } from '../delete'; export default async function(followee: User, follower: User) { if (Users.isRemoteUser(follower)) { @@ -17,11 +18,25 @@ export default async function(followee: User, follower: User) { deliver(followee as ILocalUser, content, follower.inbox); } - await FollowRequests.delete({ + const request = await FollowRequests.findOne({ followeeId: followee.id, followerId: follower.id }); + if (request) { + await FollowRequests.delete(request.id); + } else { + const following = await Followings.findOne({ + followeeId: followee.id, + followerId: follower.id + }); + + if (following) { + await Followings.delete(following.id); + decrementFollowing(follower, followee); + } + } + Users.pack(followee, follower, { detail: true }).then(packed => publishMainStream(follower.id, 'unfollow', packed));