summaryrefslogtreecommitdiff
path: root/src/server/api
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/api')
-rw-r--r--src/server/api/endpoints/admin/update-meta.ts11
-rw-r--r--src/server/api/endpoints/charts/active-users.ts34
-rw-r--r--src/server/api/endpoints/meta.ts2
-rw-r--r--src/server/api/endpoints/notes/global-timeline.ts8
-rw-r--r--src/server/api/endpoints/notes/hybrid-timeline.ts9
-rw-r--r--src/server/api/endpoints/notes/local-timeline.ts13
-rw-r--r--src/server/api/endpoints/notes/timeline.ts3
-rw-r--r--src/server/api/stream/channels/global-timeline.ts6
-rw-r--r--src/server/api/stream/channels/hybrid-timeline.ts4
-rw-r--r--src/server/api/stream/channels/local-timeline.ts6
10 files changed, 96 insertions, 0 deletions
diff --git a/src/server/api/endpoints/admin/update-meta.ts b/src/server/api/endpoints/admin/update-meta.ts
index cf117ebd71..13663243a2 100644
--- a/src/server/api/endpoints/admin/update-meta.ts
+++ b/src/server/api/endpoints/admin/update-meta.ts
@@ -32,6 +32,13 @@ export const meta = {
}
},
+ disableGlobalTimeline: {
+ validator: $.bool.optional.nullable,
+ desc: {
+ 'ja-JP': 'グローバルタイムラインを無効にするか否か'
+ }
+ },
+
hidedTags: {
validator: $.arr($.str).optional.nullable,
desc: {
@@ -331,6 +338,10 @@ export default define(meta, (ps) => new Promise(async (res, rej) => {
set.disableLocalTimeline = ps.disableLocalTimeline;
}
+ if (typeof ps.disableGlobalTimeline === 'boolean') {
+ set.disableGlobalTimeline = ps.disableGlobalTimeline;
+ }
+
if (Array.isArray(ps.hidedTags)) {
set.hidedTags = ps.hidedTags;
}
diff --git a/src/server/api/endpoints/charts/active-users.ts b/src/server/api/endpoints/charts/active-users.ts
new file mode 100644
index 0000000000..5187e5b353
--- /dev/null
+++ b/src/server/api/endpoints/charts/active-users.ts
@@ -0,0 +1,34 @@
+import $ from 'cafy';
+import define from '../../define';
+import activeUsersChart from '../../../../chart/active-users';
+
+export const meta = {
+ stability: 'stable',
+
+ desc: {
+ 'ja-JP': 'アクティブユーザーのチャートを取得します。'
+ },
+
+ params: {
+ span: {
+ validator: $.str.or(['day', 'hour']),
+ desc: {
+ 'ja-JP': '集計のスパン (day または hour)'
+ }
+ },
+
+ limit: {
+ validator: $.num.optional.range(1, 500),
+ default: 30,
+ desc: {
+ 'ja-JP': '最大数。例えば 30 を指定したとすると、スパンが"day"の場合は30日分のデータが、スパンが"hour"の場合は30時間分のデータが返ります。'
+ }
+ },
+ }
+};
+
+export default define(meta, (ps) => new Promise(async (res, rej) => {
+ const stats = await activeUsersChart.getChart(ps.span as any, ps.limit);
+
+ res(stats);
+}));
diff --git a/src/server/api/endpoints/meta.ts b/src/server/api/endpoints/meta.ts
index fa933513b7..3b2a49dbb0 100644
--- a/src/server/api/endpoints/meta.ts
+++ b/src/server/api/endpoints/meta.ts
@@ -59,6 +59,7 @@ export default define(meta, (ps, me) => new Promise(async (res, rej) => {
broadcasts: instance.broadcasts || [],
disableRegistration: instance.disableRegistration,
disableLocalTimeline: instance.disableLocalTimeline,
+ disableGlobalTimeline: instance.disableGlobalTimeline,
driveCapacityPerLocalUserMb: instance.localDriveCapacityMb,
driveCapacityPerRemoteUserMb: instance.remoteDriveCapacityMb,
cacheRemoteFiles: instance.cacheRemoteFiles,
@@ -81,6 +82,7 @@ export default define(meta, (ps, me) => new Promise(async (res, rej) => {
response.features = {
registration: !instance.disableRegistration,
localTimeLine: !instance.disableLocalTimeline,
+ globalTimeLine: !instance.disableGlobalTimeline,
elasticsearch: config.elasticsearch ? true : false,
recaptcha: instance.enableRecaptcha,
objectStorage: config.drive && config.drive.storage === 'minio',
diff --git a/src/server/api/endpoints/notes/global-timeline.ts b/src/server/api/endpoints/notes/global-timeline.ts
index b7f765f27d..f0d052ff98 100644
--- a/src/server/api/endpoints/notes/global-timeline.ts
+++ b/src/server/api/endpoints/notes/global-timeline.ts
@@ -4,6 +4,7 @@ import Mute from '../../../../models/mute';
import { packMany } from '../../../../models/note';
import define from '../../define';
import { countIf } from '../../../../prelude/array';
+import fetchMeta from '../../../../misc/fetch-meta';
export const meta = {
desc: {
@@ -51,6 +52,13 @@ export const meta = {
};
export default define(meta, (ps, user) => new Promise(async (res, rej) => {
+ const meta = await fetchMeta();
+ if (meta.disableGlobalTimeline) {
+ if (user == null || (!user.isAdmin && !user.isModerator)) {
+ return rej('global timeline disabled');
+ }
+ }
+
// Check if only one of sinceId, untilId, sinceDate, untilDate specified
if (countIf(x => x != null, [ps.sinceId, ps.untilId, ps.sinceDate, ps.untilDate]) > 1) {
return rej('only one of sinceId, untilId, sinceDate, untilDate can be specified');
diff --git a/src/server/api/endpoints/notes/hybrid-timeline.ts b/src/server/api/endpoints/notes/hybrid-timeline.ts
index 7cf05cb9a8..919b0662aa 100644
--- a/src/server/api/endpoints/notes/hybrid-timeline.ts
+++ b/src/server/api/endpoints/notes/hybrid-timeline.ts
@@ -5,6 +5,8 @@ import { getFriends } from '../../common/get-friends';
import { packMany } from '../../../../models/note';
import define from '../../define';
import { countIf } from '../../../../prelude/array';
+import fetchMeta from '../../../../misc/fetch-meta';
+import activeUsersChart from '../../../../chart/active-users';
export const meta = {
desc: {
@@ -91,6 +93,11 @@ export const meta = {
};
export default define(meta, (ps, user) => new Promise(async (res, rej) => {
+ const meta = await fetchMeta();
+ if (meta.disableLocalTimeline && !user.isAdmin && !user.isModerator) {
+ return rej('local timeline disabled');
+ }
+
// Check if only one of sinceId, untilId, sinceDate, untilDate specified
if (countIf(x => x != null, [ps.sinceId, ps.untilId, ps.sinceDate, ps.untilDate]) > 1) {
return rej('only one of sinceId, untilId, sinceDate, untilDate can be specified');
@@ -266,4 +273,6 @@ export default define(meta, (ps, user) => new Promise(async (res, rej) => {
});
res(await packMany(timeline, user));
+
+ activeUsersChart.update(user);
}));
diff --git a/src/server/api/endpoints/notes/local-timeline.ts b/src/server/api/endpoints/notes/local-timeline.ts
index 4446f52cdc..fd624c10e6 100644
--- a/src/server/api/endpoints/notes/local-timeline.ts
+++ b/src/server/api/endpoints/notes/local-timeline.ts
@@ -4,6 +4,8 @@ import Mute from '../../../../models/mute';
import { packMany } from '../../../../models/note';
import define from '../../define';
import { countIf } from '../../../../prelude/array';
+import fetchMeta from '../../../../misc/fetch-meta';
+import activeUsersChart from '../../../../chart/active-users';
export const meta = {
desc: {
@@ -66,6 +68,13 @@ export const meta = {
};
export default define(meta, (ps, user) => new Promise(async (res, rej) => {
+ const meta = await fetchMeta();
+ if (meta.disableLocalTimeline) {
+ if (user == null || (!user.isAdmin && !user.isModerator)) {
+ return rej('local timeline disabled');
+ }
+ }
+
// Check if only one of sinceId, untilId, sinceDate, untilDate specified
if (countIf(x => x != null, [ps.sinceId, ps.untilId, ps.sinceDate, ps.untilDate]) > 1) {
return rej('only one of sinceId, untilId, sinceDate, untilDate can be specified');
@@ -153,4 +162,8 @@ export default define(meta, (ps, user) => new Promise(async (res, rej) => {
});
res(await packMany(timeline, user));
+
+ if (user) {
+ activeUsersChart.update(user);
+ }
}));
diff --git a/src/server/api/endpoints/notes/timeline.ts b/src/server/api/endpoints/notes/timeline.ts
index 5604cf291b..24ed222e9a 100644
--- a/src/server/api/endpoints/notes/timeline.ts
+++ b/src/server/api/endpoints/notes/timeline.ts
@@ -5,6 +5,7 @@ import { getFriends } from '../../common/get-friends';
import { packMany } from '../../../../models/note';
import define from '../../define';
import { countIf } from '../../../../prelude/array';
+import activeUsersChart from '../../../../chart/active-users';
export const meta = {
desc: {
@@ -266,4 +267,6 @@ export default define(meta, (ps, user) => new Promise(async (res, rej) => {
// Serialize
res(await packMany(timeline, user));
+
+ activeUsersChart.update(user);
}));
diff --git a/src/server/api/stream/channels/global-timeline.ts b/src/server/api/stream/channels/global-timeline.ts
index c5499801ed..b09035daee 100644
--- a/src/server/api/stream/channels/global-timeline.ts
+++ b/src/server/api/stream/channels/global-timeline.ts
@@ -3,6 +3,7 @@ import Mute from '../../../../models/mute';
import { pack } from '../../../../models/note';
import shouldMuteThisNote from '../../../../misc/should-mute-this-note';
import Channel from '../channel';
+import fetchMeta from '../../../../misc/fetch-meta';
export default class extends Channel {
public readonly chName = 'globalTimeline';
@@ -13,6 +14,11 @@ export default class extends Channel {
@autobind
public async init(params: any) {
+ const meta = await fetchMeta();
+ if (meta.disableGlobalTimeline) {
+ if (this.user == null || (!this.user.isAdmin && !this.user.isModerator)) return;
+ }
+
// Subscribe events
this.subscriber.on('globalTimeline', this.onNote);
diff --git a/src/server/api/stream/channels/hybrid-timeline.ts b/src/server/api/stream/channels/hybrid-timeline.ts
index 15a516b0c0..e573d27ee8 100644
--- a/src/server/api/stream/channels/hybrid-timeline.ts
+++ b/src/server/api/stream/channels/hybrid-timeline.ts
@@ -3,6 +3,7 @@ import Mute from '../../../../models/mute';
import { pack } from '../../../../models/note';
import shouldMuteThisNote from '../../../../misc/should-mute-this-note';
import Channel from '../channel';
+import fetchMeta from '../../../../misc/fetch-meta';
export default class extends Channel {
public readonly chName = 'hybridTimeline';
@@ -13,6 +14,9 @@ export default class extends Channel {
@autobind
public async init(params: any) {
+ const meta = await fetchMeta();
+ if (meta.disableLocalTimeline && !this.user.isAdmin && !this.user.isModerator) return;
+
// Subscribe events
this.subscriber.on('hybridTimeline', this.onNewNote);
this.subscriber.on(`hybridTimeline:${this.user._id}`, this.onNewNote);
diff --git a/src/server/api/stream/channels/local-timeline.ts b/src/server/api/stream/channels/local-timeline.ts
index a26f71af8e..8e490677d3 100644
--- a/src/server/api/stream/channels/local-timeline.ts
+++ b/src/server/api/stream/channels/local-timeline.ts
@@ -3,6 +3,7 @@ import Mute from '../../../../models/mute';
import { pack } from '../../../../models/note';
import shouldMuteThisNote from '../../../../misc/should-mute-this-note';
import Channel from '../channel';
+import fetchMeta from '../../../../misc/fetch-meta';
export default class extends Channel {
public readonly chName = 'localTimeline';
@@ -13,6 +14,11 @@ export default class extends Channel {
@autobind
public async init(params: any) {
+ const meta = await fetchMeta();
+ if (meta.disableLocalTimeline) {
+ if (this.user == null || (!this.user.isAdmin && !this.user.isModerator)) return;
+ }
+
// Subscribe events
this.subscriber.on('localTimeline', this.onNote);