summaryrefslogtreecommitdiff
path: root/src/server/api/endpoints/federation
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/api/endpoints/federation')
-rw-r--r--src/server/api/endpoints/federation/followers.ts51
-rw-r--r--src/server/api/endpoints/federation/following.ts51
-rw-r--r--src/server/api/endpoints/federation/instances.ts56
-rw-r--r--src/server/api/endpoints/federation/users.ts51
4 files changed, 204 insertions, 5 deletions
diff --git a/src/server/api/endpoints/federation/followers.ts b/src/server/api/endpoints/federation/followers.ts
new file mode 100644
index 0000000000..d885daf70e
--- /dev/null
+++ b/src/server/api/endpoints/federation/followers.ts
@@ -0,0 +1,51 @@
+import $ from 'cafy';
+import { ID } from '../../../../misc/cafy-id';
+import define from '../../define';
+import { Followings } from '../../../../models';
+import { makePaginationQuery } from '../../common/make-pagination-query';
+
+export const meta = {
+ tags: ['users'],
+
+ requireCredential: false,
+
+ params: {
+ host: {
+ validator: $.str
+ },
+
+ sinceId: {
+ validator: $.optional.type(ID),
+ },
+
+ untilId: {
+ validator: $.optional.type(ID),
+ },
+
+ limit: {
+ validator: $.optional.num.range(1, 100),
+ default: 10
+ },
+ },
+
+ res: {
+ type: 'array' as const,
+ optional: false as const, nullable: false as const,
+ items: {
+ type: 'object' as const,
+ optional: false as const, nullable: false as const,
+ ref: 'Following',
+ }
+ },
+};
+
+export default define(meta, async (ps, me) => {
+ const query = makePaginationQuery(Followings.createQueryBuilder('following'), ps.sinceId, ps.untilId)
+ .andWhere(`following.followeeHost = :host`, { host: ps.host });
+
+ const followings = await query
+ .take(ps.limit!)
+ .getMany();
+
+ return await Followings.packMany(followings, me, { populateFollowee: true });
+});
diff --git a/src/server/api/endpoints/federation/following.ts b/src/server/api/endpoints/federation/following.ts
new file mode 100644
index 0000000000..1f79817318
--- /dev/null
+++ b/src/server/api/endpoints/federation/following.ts
@@ -0,0 +1,51 @@
+import $ from 'cafy';
+import { ID } from '../../../../misc/cafy-id';
+import define from '../../define';
+import { Followings } from '../../../../models';
+import { makePaginationQuery } from '../../common/make-pagination-query';
+
+export const meta = {
+ tags: ['users'],
+
+ requireCredential: false,
+
+ params: {
+ host: {
+ validator: $.str
+ },
+
+ sinceId: {
+ validator: $.optional.type(ID),
+ },
+
+ untilId: {
+ validator: $.optional.type(ID),
+ },
+
+ limit: {
+ validator: $.optional.num.range(1, 100),
+ default: 10
+ },
+ },
+
+ res: {
+ type: 'array' as const,
+ optional: false as const, nullable: false as const,
+ items: {
+ type: 'object' as const,
+ optional: false as const, nullable: false as const,
+ ref: 'Following',
+ }
+ },
+};
+
+export default define(meta, async (ps, me) => {
+ const query = makePaginationQuery(Followings.createQueryBuilder('following'), ps.sinceId, ps.untilId)
+ .andWhere(`following.followerHost = :host`, { host: ps.host });
+
+ const followings = await query
+ .take(ps.limit!)
+ .getMany();
+
+ return await Followings.packMany(followings, me, { populateFollowee: true });
+});
diff --git a/src/server/api/endpoints/federation/instances.ts b/src/server/api/endpoints/federation/instances.ts
index bc0eb9a1d7..002cfd4335 100644
--- a/src/server/api/endpoints/federation/instances.ts
+++ b/src/server/api/endpoints/federation/instances.ts
@@ -9,6 +9,10 @@ export const meta = {
requireCredential: false,
params: {
+ host: {
+ validator: $.optional.nullable.str,
+ },
+
blocked: {
validator: $.optional.nullable.bool,
},
@@ -17,7 +21,19 @@ export const meta = {
validator: $.optional.nullable.bool,
},
- markedAsClosed: {
+ suspended: {
+ validator: $.optional.nullable.bool,
+ },
+
+ federating: {
+ validator: $.optional.nullable.bool,
+ },
+
+ subscribing: {
+ validator: $.optional.nullable.bool,
+ },
+
+ publishing: {
validator: $.optional.nullable.bool,
},
@@ -41,6 +57,8 @@ export default define(meta, async (ps, me) => {
const query = Instances.createQueryBuilder('instance');
switch (ps.sort) {
+ case '+pubSub': query.orderBy('instance.followingCount', 'DESC').orderBy('instance.followersCount', 'DESC'); break;
+ case '-pubSub': query.orderBy('instance.followingCount', 'ASC').orderBy('instance.followersCount', 'ASC'); break;
case '+notes': query.orderBy('instance.notesCount', 'DESC'); break;
case '-notes': query.orderBy('instance.notesCount', 'ASC'); break;
case '+users': query.orderBy('instance.usersCount', 'DESC'); break;
@@ -78,14 +96,42 @@ export default define(meta, async (ps, me) => {
}
}
- if (typeof ps.markedAsClosed === 'boolean') {
- if (ps.markedAsClosed) {
- query.andWhere('instance.isMarkedAsClosed = TRUE');
+ if (typeof ps.suspended === 'boolean') {
+ if (ps.suspended) {
+ query.andWhere('instance.isSuspended = TRUE');
} else {
- query.andWhere('instance.isMarkedAsClosed = FALSE');
+ query.andWhere('instance.isSuspended = FALSE');
}
}
+ if (typeof ps.federating === 'boolean') {
+ if (ps.federating) {
+ query.andWhere('((instance.followingCount > 0) OR (instance.followersCount > 0))');
+ } else {
+ query.andWhere('((instance.followingCount = 0) AND (instance.followersCount = 0))');
+ }
+ }
+
+ if (typeof ps.subscribing === 'boolean') {
+ if (ps.subscribing) {
+ query.andWhere('instance.followersCount > 0');
+ } else {
+ query.andWhere('instance.followersCount = 0');
+ }
+ }
+
+ if (typeof ps.publishing === 'boolean') {
+ if (ps.publishing) {
+ query.andWhere('instance.followingCount > 0');
+ } else {
+ query.andWhere('instance.followingCount = 0');
+ }
+ }
+
+ if (ps.host) {
+ query.andWhere('instance.host like :host', { host: '%' + ps.host.toLowerCase() + '%' })
+ }
+
const instances = await query.take(ps.limit!).skip(ps.offset).getMany();
return instances;
diff --git a/src/server/api/endpoints/federation/users.ts b/src/server/api/endpoints/federation/users.ts
new file mode 100644
index 0000000000..f69bbf949c
--- /dev/null
+++ b/src/server/api/endpoints/federation/users.ts
@@ -0,0 +1,51 @@
+import $ from 'cafy';
+import { ID } from '../../../../misc/cafy-id';
+import define from '../../define';
+import { Users } from '../../../../models';
+import { makePaginationQuery } from '../../common/make-pagination-query';
+
+export const meta = {
+ tags: ['users'],
+
+ requireCredential: false,
+
+ params: {
+ host: {
+ validator: $.str
+ },
+
+ sinceId: {
+ validator: $.optional.type(ID),
+ },
+
+ untilId: {
+ validator: $.optional.type(ID),
+ },
+
+ limit: {
+ validator: $.optional.num.range(1, 100),
+ default: 10
+ },
+ },
+
+ res: {
+ type: 'array' as const,
+ optional: false as const, nullable: false as const,
+ items: {
+ type: 'object' as const,
+ optional: false as const, nullable: false as const,
+ ref: 'User',
+ }
+ },
+};
+
+export default define(meta, async (ps, me) => {
+ const query = makePaginationQuery(Users.createQueryBuilder('user'), ps.sinceId, ps.untilId)
+ .andWhere(`user.host = :host`, { host: ps.host });
+
+ const users = await query
+ .take(ps.limit!)
+ .getMany();
+
+ return await Users.packMany(users, me, { detail: true });
+});