From 32b2b43c06621e384c0bd1610ef0bb9f23399be7 Mon Sep 17 00:00:00 2001 From: Chocobozzz Date: Fri, 12 Jan 2018 11:47:45 +0100 Subject: Update follower/following counts --- server/models/activitypub/actor-follow.ts | 20 ++++++++++++++++++++ server/models/activitypub/actor.ts | 10 ++++++++++ 2 files changed, 30 insertions(+) (limited to 'server/models/activitypub') diff --git a/server/models/activitypub/actor-follow.ts b/server/models/activitypub/actor-follow.ts index de5bb6f74..435d22db5 100644 --- a/server/models/activitypub/actor-follow.ts +++ b/server/models/activitypub/actor-follow.ts @@ -2,6 +2,7 @@ import * as Bluebird from 'bluebird' import { values } from 'lodash' import * as Sequelize from 'sequelize' import { + AfterCreate, AfterDestroy, AfterUpdate, AllowNull, BelongsTo, Column, CreatedAt, DataType, Default, ForeignKey, IsInt, Max, Model, Table, UpdatedAt } from 'sequelize-typescript' @@ -79,6 +80,25 @@ export class ActorFollowModel extends Model { }) ActorFollowing: ActorModel + @AfterCreate + @AfterUpdate + static incrementFollowerAndFollowingCount (instance: ActorFollowModel) { + if (instance.state !== 'accepted') return + + return Promise.all([ + ActorModel.incrementFollows(instance.actorId, 'followingCount', 1), + ActorModel.incrementFollows(instance.targetActorId, 'followersCount', 1) + ]) + } + + @AfterDestroy + static decrementFollowerAndFollowingCount (instance: ActorFollowModel) { + return Promise.all([ + ActorModel.incrementFollows(instance.actorId, 'followingCount',-1), + ActorModel.incrementFollows(instance.targetActorId, 'followersCount', -1) + ]) + } + // Remove actor follows with a score of 0 (too many requests where they were unreachable) static async removeBadActorFollows () { const actorFollows = await ActorFollowModel.listBadActorFollows() diff --git a/server/models/activitypub/actor.ts b/server/models/activitypub/actor.ts index 17f69f7a7..b7be9c32c 100644 --- a/server/models/activitypub/actor.ts +++ b/server/models/activitypub/actor.ts @@ -264,6 +264,16 @@ export class ActorModel extends Model { return ActorModel.scope(ScopeNames.FULL).findOne(query) } + static incrementFollows (id: number, column: 'followersCount' | 'followingCount', by: number) { + // FIXME: typings + return (ActorModel as any).increment(column, { + by, + where: { + id + } + }) + } + toFormattedJSON () { let avatar: Avatar = null if (this.Avatar) { -- cgit v1.2.3