Fixed 267U.pre2
This commit is contained in:
@@ -0,0 +1,56 @@
|
||||
import define from "../../define.js";
|
||||
import { Followings } from "../../../../models/index.js";
|
||||
import { makePaginationQuery } from "../../common/make-pagination-query.js";
|
||||
export const meta = {
|
||||
tags: [
|
||||
"federation"
|
||||
],
|
||||
requireCredential: true,
|
||||
requireAdmin: true,
|
||||
requireCredentialPrivateMode: true,
|
||||
res: {
|
||||
type: "array",
|
||||
optional: false,
|
||||
nullable: false,
|
||||
items: {
|
||||
type: "object",
|
||||
optional: false,
|
||||
nullable: false,
|
||||
ref: "Following"
|
||||
}
|
||||
}
|
||||
};
|
||||
export const paramDef = {
|
||||
type: "object",
|
||||
properties: {
|
||||
host: {
|
||||
type: "string"
|
||||
},
|
||||
sinceId: {
|
||||
type: "string",
|
||||
format: "misskey:id"
|
||||
},
|
||||
untilId: {
|
||||
type: "string",
|
||||
format: "misskey:id"
|
||||
},
|
||||
limit: {
|
||||
type: "integer",
|
||||
minimum: 1,
|
||||
maximum: 100,
|
||||
default: 10
|
||||
}
|
||||
},
|
||||
required: [
|
||||
"host"
|
||||
]
|
||||
};
|
||||
export default define(meta, paramDef, 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
|
||||
});
|
||||
});
|
||||
@@ -0,0 +1,56 @@
|
||||
import define from "../../define.js";
|
||||
import { Followings } from "../../../../models/index.js";
|
||||
import { makePaginationQuery } from "../../common/make-pagination-query.js";
|
||||
export const meta = {
|
||||
tags: [
|
||||
"federation"
|
||||
],
|
||||
requireCredential: true,
|
||||
requireAdmin: true,
|
||||
requireCredentialPrivateMode: true,
|
||||
res: {
|
||||
type: "array",
|
||||
optional: false,
|
||||
nullable: false,
|
||||
items: {
|
||||
type: "object",
|
||||
optional: false,
|
||||
nullable: false,
|
||||
ref: "Following"
|
||||
}
|
||||
}
|
||||
};
|
||||
export const paramDef = {
|
||||
type: "object",
|
||||
properties: {
|
||||
host: {
|
||||
type: "string"
|
||||
},
|
||||
sinceId: {
|
||||
type: "string",
|
||||
format: "misskey:id"
|
||||
},
|
||||
untilId: {
|
||||
type: "string",
|
||||
format: "misskey:id"
|
||||
},
|
||||
limit: {
|
||||
type: "integer",
|
||||
minimum: 1,
|
||||
maximum: 100,
|
||||
default: 10
|
||||
}
|
||||
},
|
||||
required: [
|
||||
"host"
|
||||
]
|
||||
};
|
||||
export default define(meta, paramDef, 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
|
||||
});
|
||||
});
|
||||
@@ -0,0 +1,201 @@
|
||||
import define from "../../define.js";
|
||||
import { Instances } from "../../../../models/index.js";
|
||||
import { fetchMeta } from "../../../../misc/fetch-meta.js";
|
||||
import { sqlLikeEscape } from "../../../../misc/sql-like-escape.js";
|
||||
export const meta = {
|
||||
tags: [
|
||||
"federation"
|
||||
],
|
||||
requireCredential: false,
|
||||
requireCredentialPrivateMode: true,
|
||||
res: {
|
||||
type: "array",
|
||||
optional: false,
|
||||
nullable: false,
|
||||
items: {
|
||||
type: "object",
|
||||
optional: false,
|
||||
nullable: false,
|
||||
ref: "FederationInstance"
|
||||
}
|
||||
}
|
||||
};
|
||||
export const paramDef = {
|
||||
type: "object",
|
||||
properties: {
|
||||
host: {
|
||||
type: "string",
|
||||
nullable: true,
|
||||
description: "Omit or use `null` to not filter by host."
|
||||
},
|
||||
blocked: {
|
||||
type: "boolean",
|
||||
nullable: true
|
||||
},
|
||||
notResponding: {
|
||||
type: "boolean",
|
||||
nullable: true
|
||||
},
|
||||
suspended: {
|
||||
type: "boolean",
|
||||
nullable: true
|
||||
},
|
||||
federating: {
|
||||
type: "boolean",
|
||||
nullable: true
|
||||
},
|
||||
silenced: {
|
||||
type: "boolean",
|
||||
nullable: true
|
||||
},
|
||||
subscribing: {
|
||||
type: "boolean",
|
||||
nullable: true
|
||||
},
|
||||
publishing: {
|
||||
type: "boolean",
|
||||
nullable: true
|
||||
},
|
||||
limit: {
|
||||
type: "integer",
|
||||
minimum: 1,
|
||||
maximum: 100,
|
||||
default: 30
|
||||
},
|
||||
offset: {
|
||||
type: "integer",
|
||||
default: 0
|
||||
},
|
||||
sort: {
|
||||
type: "string"
|
||||
}
|
||||
},
|
||||
required: []
|
||||
};
|
||||
export default define(meta, paramDef, async (ps, me)=>{
|
||||
if (!me) {
|
||||
ps.blocked = false;
|
||||
ps.suspended = false;
|
||||
ps.silenced = false;
|
||||
}
|
||||
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;
|
||||
case "-users":
|
||||
query.orderBy("instance.usersCount", "ASC");
|
||||
break;
|
||||
case "+following":
|
||||
query.orderBy("instance.followingCount", "DESC");
|
||||
break;
|
||||
case "-following":
|
||||
query.orderBy("instance.followingCount", "ASC");
|
||||
break;
|
||||
case "+followers":
|
||||
query.orderBy("instance.followersCount", "DESC");
|
||||
break;
|
||||
case "-followers":
|
||||
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;
|
||||
default:
|
||||
query.orderBy("instance.id", "DESC");
|
||||
break;
|
||||
}
|
||||
if (typeof ps.blocked === "boolean") {
|
||||
const meta = await fetchMeta(true);
|
||||
if (ps.blocked) {
|
||||
if (meta.blockedHosts.length === 0) {
|
||||
return [];
|
||||
}
|
||||
query.andWhere("instance.host IN (:...blocks)", {
|
||||
blocks: meta.blockedHosts
|
||||
});
|
||||
} else if (meta.blockedHosts.length > 0) {
|
||||
query.andWhere("instance.host NOT IN (:...blocks)", {
|
||||
blocks: meta.blockedHosts
|
||||
});
|
||||
}
|
||||
}
|
||||
if (typeof ps.silenced === "boolean") {
|
||||
const meta = await fetchMeta(true);
|
||||
if (ps.silenced) {
|
||||
if (meta.silencedHosts.length === 0) {
|
||||
return [];
|
||||
}
|
||||
query.andWhere("instance.host IN (:...silences)", {
|
||||
silences: meta.silencedHosts
|
||||
});
|
||||
} else if (meta.silencedHosts.length > 0) {
|
||||
query.andWhere("instance.host NOT IN (:...silences)", {
|
||||
silences: meta.silencedHosts
|
||||
});
|
||||
}
|
||||
}
|
||||
if (typeof ps.notResponding === "boolean") {
|
||||
if (ps.notResponding) {
|
||||
query.andWhere("instance.isNotResponding = TRUE");
|
||||
} else {
|
||||
query.andWhere("instance.isNotResponding = FALSE");
|
||||
}
|
||||
}
|
||||
if (typeof ps.suspended === "boolean") {
|
||||
if (ps.suspended) {
|
||||
query.andWhere("instance.isSuspended = TRUE");
|
||||
} else {
|
||||
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: `%${sqlLikeEscape(ps.host.toLowerCase())}%`
|
||||
});
|
||||
}
|
||||
const instances = await query.take(ps.limit).skip(ps.offset).getMany();
|
||||
return await Instances.packMany(instances, me !== null);
|
||||
});
|
||||
@@ -0,0 +1,38 @@
|
||||
import define from "../../define.js";
|
||||
import { Instances } from "../../../../models/index.js";
|
||||
import { toPuny } from "../../../../misc/convert-host.js";
|
||||
export const meta = {
|
||||
tags: [
|
||||
"federation"
|
||||
],
|
||||
requireCredential: true,
|
||||
requireCredentialPrivateMode: true,
|
||||
res: {
|
||||
oneOf: [
|
||||
{
|
||||
type: "object",
|
||||
ref: "FederationInstance"
|
||||
},
|
||||
{
|
||||
type: "null"
|
||||
}
|
||||
]
|
||||
}
|
||||
};
|
||||
export const paramDef = {
|
||||
type: "object",
|
||||
properties: {
|
||||
host: {
|
||||
type: "string"
|
||||
}
|
||||
},
|
||||
required: [
|
||||
"host"
|
||||
]
|
||||
};
|
||||
export default define(meta, paramDef, async (ps, me)=>{
|
||||
const instance = await Instances.findOneBy({
|
||||
host: toPuny(ps.host)
|
||||
});
|
||||
return instance ? await Instances.pack(instance, me !== null) : null;
|
||||
});
|
||||
@@ -0,0 +1,64 @@
|
||||
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)
|
||||
});
|
||||
});
|
||||
@@ -0,0 +1,25 @@
|
||||
import define from "../../define.js";
|
||||
import { getRemoteUser } from "../../common/getters.js";
|
||||
import { updatePerson } from "../../../../remote/activitypub/models/person.js";
|
||||
export const meta = {
|
||||
tags: [
|
||||
"federation"
|
||||
],
|
||||
requireCredential: true
|
||||
};
|
||||
export const paramDef = {
|
||||
type: "object",
|
||||
properties: {
|
||||
userId: {
|
||||
type: "string",
|
||||
format: "misskey:id"
|
||||
}
|
||||
},
|
||||
required: [
|
||||
"userId"
|
||||
]
|
||||
};
|
||||
export default define(meta, paramDef, async (ps)=>{
|
||||
const user = await getRemoteUser(ps.userId);
|
||||
await updatePerson(user.uri, undefined, undefined, user);
|
||||
});
|
||||
@@ -0,0 +1,55 @@
|
||||
import define from "../../define.js";
|
||||
import { Users } from "../../../../models/index.js";
|
||||
import { makePaginationQuery } from "../../common/make-pagination-query.js";
|
||||
export const meta = {
|
||||
tags: [
|
||||
"federation"
|
||||
],
|
||||
requireCredential: false,
|
||||
requireCredentialPrivateMode: true,
|
||||
res: {
|
||||
type: "array",
|
||||
optional: false,
|
||||
nullable: false,
|
||||
items: {
|
||||
type: "object",
|
||||
optional: false,
|
||||
nullable: false,
|
||||
ref: "UserDetailedNotMe"
|
||||
}
|
||||
}
|
||||
};
|
||||
export const paramDef = {
|
||||
type: "object",
|
||||
properties: {
|
||||
host: {
|
||||
type: "string"
|
||||
},
|
||||
sinceId: {
|
||||
type: "string",
|
||||
format: "misskey:id"
|
||||
},
|
||||
untilId: {
|
||||
type: "string",
|
||||
format: "misskey:id"
|
||||
},
|
||||
limit: {
|
||||
type: "integer",
|
||||
minimum: 1,
|
||||
maximum: 100,
|
||||
default: 10
|
||||
}
|
||||
},
|
||||
required: [
|
||||
"host"
|
||||
]
|
||||
};
|
||||
export default define(meta, paramDef, 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
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user