Files
FrozenFriendsYume/packages/backend/built/services/chart/charts/per-user-following.js
T
2026-07-26 18:25:37 +09:00

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);
}
}