From 9dd06a7621d1745b30ed1c2b1d94d34143dd638e Mon Sep 17 00:00:00 2001 From: "Acid Chicken (硫酸鶏)" Date: Tue, 5 Feb 2019 17:42:55 +0900 Subject: /.well-known 周りをいい感じに (#4141) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Enhance /.well-known and their friends * Fix bug --- src/server/nodeinfo.ts | 73 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 src/server/nodeinfo.ts (limited to 'src/server/nodeinfo.ts') diff --git a/src/server/nodeinfo.ts b/src/server/nodeinfo.ts new file mode 100644 index 0000000000..5abb2e4973 --- /dev/null +++ b/src/server/nodeinfo.ts @@ -0,0 +1,73 @@ +import * as Router from 'koa-router'; +import config from '../config'; +import fetchMeta from '../misc/fetch-meta'; +import User from '../models/user'; +import { name as softwareName, version, repository } from '../../package.json'; +import Note from '../models/note'; + +const router = new Router(); + +const nodeinfo2_1path = '/nodeinfo/2.1'; +const nodeinfo2_0path = '/nodeinfo/2.0'; + +export const links = [/* (awaiting release) { + rel: 'http://nodeinfo.diaspora.software/ns/schema/2.1', + href: config.url + nodeinfo2_1path +}, */{ + rel: 'http://nodeinfo.diaspora.software/ns/schema/2.0', + href: config.url + nodeinfo2_0path +}]; + +const nodeinfo2 = async () => { + const [ + { name, description, maintainer, langs, broadcasts, disableRegistration, disableLocalTimeline, disableGlobalTimeline, enableRecaptcha, maxNoteTextLength, enableTwitterIntegration, enableGithubIntegration, enableDiscordIntegration, enableEmail, enableServiceWorker }, + total, + activeHalfyear, + activeMonth, + localPosts, + localComments + ] = await Promise.all([ + fetchMeta(), + User.count({ host: null }), + User.count({ host: null, updatedAt: { $gt: new Date(Date.now() - 15552000000) } }), + User.count({ host: null, updatedAt: { $gt: new Date(Date.now() - 2592000000) } }), + Note.count({ '_user.host': null, replyId: null }), + Note.count({ '_user.host': null, replyId: { $ne: null } }) + ]); + + return { + software: { + name: softwareName, + version, + repository: repository.url + }, + protocols: ['activitypub'], + services: { + inbound: [] as string[], + outbound: ['atom1.0', 'rss2.0'] + }, + openRegistrations: !disableRegistration, + usage: { + users: { total, activeHalfyear, activeMonth }, + localPosts, + localComments + }, + metadata: { name, description, maintainer, langs, broadcasts, disableRegistration, disableLocalTimeline, disableGlobalTimeline, enableRecaptcha, maxNoteTextLength, enableTwitterIntegration, enableGithubIntegration, enableDiscordIntegration, enableEmail, enableServiceWorker } + }; +}; + +router.get(nodeinfo2_1path, async ctx => { + const base = await nodeinfo2(); + + ctx.body = { version: '2.1', ...base }; +}); + +router.get(nodeinfo2_0path, async ctx => { + const base = await nodeinfo2(); + + delete base.software.repository; + + ctx.body = { version: '2.0', ...base }; +}); + +export default router; -- cgit v1.2.3-freya