import Chart from "../core.js"; import { Followings, Users } from "../../../models/index.js"; import { Not, IsNull } from "typeorm"; import { name, schema } from "./entities/per-user-following.js"; /** * ユーザーごとのフォローに関するチャート */ export default class PerUserFollowingChart extends Chart { constructor(){ super(name, schema, true); } async tickMajor(group) { const [localFollowingsCount, localFollowersCount, remoteFollowingsCount, remoteFollowersCount] = await Promise.all([ Followings.countBy({ followerId: group, followeeHost: IsNull() }), Followings.countBy({ followeeId: group, followerHost: IsNull() }), Followings.countBy({ followerId: group, followeeHost: Not(IsNull()) }), Followings.countBy({ followeeId: group, followerHost: Not(IsNull()) }) ]); return { "local.followings.total": localFollowingsCount, "local.followers.total": localFollowersCount, "remote.followings.total": remoteFollowingsCount, "remote.followers.total": remoteFollowersCount }; } async tickMinor() { return {}; } async update(follower, followee, isFollow) { 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); } }