import autobind from 'autobind-decorator'; import Chart, { KVs } from '../core'; import { Followings, Users } from '@/models/index'; import { Not, IsNull } from 'typeorm'; import { User } from '@/models/entities/user'; import { name, schema } from './entities/per-user-following'; /** * ユーザーごとのフォローに関するチャート */ // eslint-disable-next-line import/no-default-export export default class PerUserFollowingChart extends Chart { constructor() { super(name, schema, true); } @autobind protected async tickMajor(group: string): Promise>> { const [ localFollowingsCount, localFollowersCount, remoteFollowingsCount, remoteFollowersCount, ] = await Promise.all([ Followings.count({ followerId: group, followeeHost: null }), Followings.count({ followeeId: group, followerHost: null }), Followings.count({ followerId: group, followeeHost: Not(IsNull()) }), Followings.count({ followeeId: group, followerHost: Not(IsNull()) }), ]); return { 'local.followings.total': localFollowingsCount, 'local.followers.total': localFollowersCount, 'remote.followings.total': remoteFollowingsCount, 'remote.followers.total': remoteFollowersCount, }; } @autobind protected async tickMinor(): Promise>> { return {}; } @autobind public async update(follower: { id: User['id']; host: User['host']; }, followee: { id: User['id']; host: User['host']; }, isFollow: boolean): Promise { const prefixFollower = Users.isLocalUser(follower) ? 'local' : 'remote'; const prefixFollowee = Users.isLocalUser(followee) ? 'local' : 'remote'; this.commit({ [`${prefixFollower}.followings.total`]: isFollow ? 1 : -1, [`${prefixFollower}.followings.inc`]: isFollow ? 1 : 0, [`${prefixFollower}.followings.dec`]: isFollow ? 0 : 1, }, follower.id); this.commit({ [`${prefixFollowee}.followers.total`]: isFollow ? 1 : -1, [`${prefixFollowee}.followers.inc`]: isFollow ? 1 : 0, [`${prefixFollowee}.followers.dec`]: isFollow ? 0 : 1, }, followee.id); } }