diff options
Diffstat (limited to 'src/server/api/endpoints/federation/instances.ts')
| -rw-r--r-- | src/server/api/endpoints/federation/instances.ts | 126 |
1 files changed, 45 insertions, 81 deletions
diff --git a/src/server/api/endpoints/federation/instances.ts b/src/server/api/endpoints/federation/instances.ts index f81f81822e..1946d26dec 100644 --- a/src/server/api/endpoints/federation/instances.ts +++ b/src/server/api/endpoints/federation/instances.ts @@ -1,6 +1,7 @@ import $ from 'cafy'; import define from '../../define'; -import Instance from '../../../../models/instance'; +import { Instances } from '../../../../models'; +import fetchMeta from '../../../../misc/fetch-meta'; export const meta = { tags: ['federation'], @@ -37,92 +38,55 @@ export const meta = { }; export default define(meta, async (ps, me) => { - let sort; + const query = Instances.createQueryBuilder('instance'); - if (ps.sort) { - if (ps.sort == '+notes') { - sort = { - notesCount: -1 - }; - } else if (ps.sort == '-notes') { - sort = { - notesCount: 1 - }; - } else if (ps.sort == '+users') { - sort = { - usersCount: -1 - }; - } else if (ps.sort == '-users') { - sort = { - usersCount: 1 - }; - } else if (ps.sort == '+following') { - sort = { - followingCount: -1 - }; - } else if (ps.sort == '-following') { - sort = { - followingCount: 1 - }; - } else if (ps.sort == '+followers') { - sort = { - followersCount: -1 - }; - } else if (ps.sort == '-followers') { - sort = { - followersCount: 1 - }; - } else if (ps.sort == '+caughtAt') { - sort = { - caughtAt: -1 - }; - } else if (ps.sort == '-caughtAt') { - sort = { - caughtAt: 1 - }; - } else if (ps.sort == '+lastCommunicatedAt') { - sort = { - lastCommunicatedAt: -1 - }; - } else if (ps.sort == '-lastCommunicatedAt') { - sort = { - lastCommunicatedAt: 1 - }; - } else if (ps.sort == '+driveUsage') { - sort = { - driveUsage: -1 - }; - } else if (ps.sort == '-driveUsage') { - sort = { - driveUsage: 1 - }; - } else if (ps.sort == '+driveFiles') { - sort = { - driveFiles: -1 - }; - } else if (ps.sort == '-driveFiles') { - sort = { - driveFiles: 1 - }; + switch (ps.sort) { + case '+notes': query.orderBy('instance.notesCount', 'DESC'); break; + case '-notes': query.orderBy('instance.notesCount', 'ASC'); break; + case '+usersCount': query.orderBy('instance.usersCount', 'DESC'); break; + case '-usersCount': query.orderBy('instance.usersCount', 'ASC'); break; + case '+followingCount': query.orderBy('instance.followingCount', 'DESC'); break; + case '-followingCount': query.orderBy('instance.followingCount', 'ASC'); break; + case '+followersCount': query.orderBy('instance.followersCount', 'DESC'); break; + case '-followersCount': query.orderBy('instance.followersCount', 'ASC'); break; + case '+caughtAt': query.orderBy('instance.caughtAt', 'DESC'); break; + case '-caughtAt': query.orderBy('instance.caughtAt', 'ASC'); break; + case '+lastCommunicatedAt': query.orderBy('instance.lastCommunicatedAt', 'DESC'); break; + case '-lastCommunicatedAt': query.orderBy('instance.lastCommunicatedAt', 'ASC'); break; + case '+driveUsage': query.orderBy('instance.driveUsage', 'DESC'); break; + case '-driveUsage': query.orderBy('instance.driveUsage', 'ASC'); break; + case '+driveFiles': query.orderBy('instance.driveFiles', 'DESC'); break; + case '-driveFiles': query.orderBy('instance.driveFiles', 'ASC'); break; + + default: query.orderBy('instance.id', 'DESC'); break; + } + + if (typeof ps.blocked === 'boolean') { + const meta = await fetchMeta(); + if (ps.blocked) { + query.andWhere('instance.host IN (:...blocks)', { blocks: meta.blockedHosts }); + } else { + query.andWhere('instance.host NOT IN (:...blocks)', { blocks: meta.blockedHosts }); } - } else { - sort = { - _id: -1 - }; } - const q = {} as any; + if (typeof ps.notResponding === 'boolean') { + if (ps.notResponding) { + query.andWhere('instance.isNotResponding = TRUE'); + } else { + query.andWhere('instance.isNotResponding = FALSE'); + } + } - if (typeof ps.blocked === 'boolean') q.isBlocked = ps.blocked; - if (typeof ps.notResponding === 'boolean') q.isNotResponding = ps.notResponding; - if (typeof ps.markedAsClosed === 'boolean') q.isMarkedAsClosed = ps.markedAsClosed; + if (typeof ps.markedAsClosed === 'boolean') { + if (ps.markedAsClosed) { + query.andWhere('instance.isMarkedAsClosed = TRUE'); + } else { + query.andWhere('instance.isMarkedAsClosed = FALSE'); + } + } - const instances = await Instance - .find(q, { - limit: ps.limit, - sort: sort, - skip: ps.offset - }); + const instances = await query.take(ps.limit).skip(ps.offset).getMany(); return instances; }); |