55 lines
2.0 KiB
JavaScript
55 lines
2.0 KiB
JavaScript
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);
|
|
}
|
|
}
|