import { IsNull, MoreThan, Not } from "typeorm"; import { Followings, Instances } from "../../../../models/index.js"; import { awaitAll } from "../../../../prelude/await-all.js"; import define from "../../define.js"; export const meta = { tags: [ "federation" ], requireCredential: false, allowGet: true, cacheSec: 60 * 60 }; export const paramDef = { type: "object", properties: { limit: { type: "integer", minimum: 1, maximum: 100, default: 10 } }, required: [] }; export default define(meta, paramDef, async (ps, me)=>{ const [topSubInstances, topPubInstances, allSubCount, allPubCount] = await Promise.all([ Instances.find({ where: { followersCount: MoreThan(0) }, order: { followersCount: "DESC" }, take: ps.limit }), Instances.find({ where: { followingCount: MoreThan(0) }, order: { followingCount: "DESC" }, take: ps.limit }), Followings.count({ where: { followeeHost: Not(IsNull()) } }), Followings.count({ where: { followerHost: Not(IsNull()) } }) ]); const gotSubCount = topSubInstances.map((x)=>x.followersCount).reduce((a, b)=>a + b, 0); const gotPubCount = topPubInstances.map((x)=>x.followingCount).reduce((a, b)=>a + b, 0); return await awaitAll({ topSubInstances: Instances.packMany(topSubInstances, me !== null), otherFollowersCount: Math.max(0, allSubCount - gotSubCount), topPubInstances: Instances.packMany(topPubInstances, me !== null), otherFollowingCount: Math.max(0, allPubCount - gotPubCount) }); });