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/chart.ts101
-rw-r--r--src/server/api/endpoints/admin/update-meta.ts37
-rw-r--r--src/server/api/endpoints/chart.ts178
-rw-r--r--src/server/api/endpoints/following/requests/cancel.ts6
-rw-r--r--src/server/api/index.ts5
5 files changed, 225 insertions, 102 deletions
diff --git a/src/server/api/endpoints/admin/chart.ts b/src/server/api/endpoints/admin/chart.ts
deleted file mode 100644
index a0566b11f5..0000000000
--- a/src/server/api/endpoints/admin/chart.ts
+++ /dev/null
@@ -1,101 +0,0 @@
-import Stats, { IStats } from '../../../../models/stats';
-
-type Omit<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>>;
-
-export const meta = {
- requireCredential: true,
- requireAdmin: true
-};
-
-export default (params: any) => new Promise(async (res, rej) => {
- const now = new Date();
- const y = now.getFullYear();
- const m = now.getMonth();
- const d = now.getDate();
-
- const stats = await Stats.find({
- date: {
- $gt: new Date(y - 1, m, d)
- }
- }, {
- sort: {
- date: -1
- },
- fields: {
- _id: 0
- }
- });
-
- const chart: Array<Omit<IStats, '_id'>> = [];
-
- for (let i = 364; i >= 0; i--) {
- const day = new Date(y, m, d - i);
-
- const stat = stats.find(s => s.date.getTime() == day.getTime());
-
- if (stat) {
- chart.unshift(stat);
- } else { // 隙間埋め
- const mostRecent = stats.find(s => s.date.getTime() < day.getTime());
- if (mostRecent) {
- chart.unshift(Object.assign({}, mostRecent, {
- date: day
- }));
- } else {
- chart.unshift({
- date: day,
- users: {
- local: {
- total: 0,
- diff: 0
- },
- remote: {
- total: 0,
- diff: 0
- }
- },
- notes: {
- local: {
- total: 0,
- diff: 0,
- diffs: {
- normal: 0,
- reply: 0,
- renote: 0
- }
- },
- remote: {
- total: 0,
- diff: 0,
- diffs: {
- normal: 0,
- reply: 0,
- renote: 0
- }
- }
- },
- drive: {
- local: {
- totalCount: 0,
- totalSize: 0,
- diffCount: 0,
- diffSize: 0
- },
- remote: {
- totalCount: 0,
- totalSize: 0,
- diffCount: 0,
- diffSize: 0
- }
- }
- });
- }
- }
- }
-
- chart.forEach(x => {
- delete x.date;
- });
-
- res(chart);
-});
diff --git a/src/server/api/endpoints/admin/update-meta.ts b/src/server/api/endpoints/admin/update-meta.ts
new file mode 100644
index 0000000000..bfcab9d6a6
--- /dev/null
+++ b/src/server/api/endpoints/admin/update-meta.ts
@@ -0,0 +1,37 @@
+import $ from 'cafy';
+import Meta from '../../../../models/meta';
+import getParams from '../../get-params';
+
+export const meta = {
+ desc: {
+ ja: 'インスタンスの設定を更新します。'
+ },
+
+ requireCredential: true,
+ requireAdmin: true,
+
+ params: {
+ disableRegistration: $.bool.optional.nullable.note({
+ desc: {
+ ja: '招待制か否か'
+ }
+ }),
+ }
+};
+
+export default (params: any) => new Promise(async (res, rej) => {
+ const [ps, psErr] = getParams(meta, params);
+ if (psErr) return rej(psErr);
+
+ const set = {} as any;
+
+ if (ps.disableRegistration === true || ps.disableRegistration === false) {
+ set.disableRegistration = ps.disableRegistration;
+ }
+
+ await Meta.update({}, {
+ $set: set
+ }, { upsert: true });
+
+ res();
+});
diff --git a/src/server/api/endpoints/chart.ts b/src/server/api/endpoints/chart.ts
new file mode 100644
index 0000000000..da3476f067
--- /dev/null
+++ b/src/server/api/endpoints/chart.ts
@@ -0,0 +1,178 @@
+import Stats, { IStats } from '../../../models/stats';
+
+type Omit<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>>;
+
+export const meta = {
+};
+
+export default (params: any) => new Promise(async (res, rej) => {
+ const daysRange = 30;
+ const hoursRange = 30;
+
+ const now = new Date();
+ const y = now.getFullYear();
+ const m = now.getMonth();
+ const d = now.getDate();
+ const h = now.getHours();
+
+ const [statsPerDay, statsPerHour] = await Promise.all([
+ Stats.find({
+ span: 'day',
+ date: {
+ $gt: new Date(y, m, d - daysRange)
+ }
+ }, {
+ sort: {
+ date: -1
+ },
+ fields: {
+ _id: 0
+ }
+ }),
+ Stats.find({
+ span: 'hour',
+ date: {
+ $gt: new Date(y, m, d, h - hoursRange)
+ }
+ }, {
+ sort: {
+ date: -1
+ },
+ fields: {
+ _id: 0
+ }
+ }),
+ ]);
+
+ const format = (src: IStats[], span: 'day' | 'hour') => {
+ const chart: Array<Omit<Omit<IStats, '_id'>, 'span'>> = [];
+
+ const range =
+ span == 'day' ? daysRange :
+ span == 'hour' ? hoursRange :
+ null;
+
+ for (let i = (range - 1); i >= 0; i--) {
+ const current =
+ span == 'day' ? new Date(y, m, d - i) :
+ span == 'hour' ? new Date(y, m, d, h - i) :
+ null;
+
+ const stat = src.find(s => s.date.getTime() == current.getTime());
+
+ if (stat) {
+ chart.unshift(stat);
+ } else { // 隙間埋め
+ const mostRecent = src.find(s => s.date.getTime() < current.getTime());
+ if (mostRecent) {
+ chart.unshift({
+ date: current,
+ users: {
+ local: {
+ total: mostRecent.users.local.total,
+ diff: 0
+ },
+ remote: {
+ total: mostRecent.users.remote.total,
+ diff: 0
+ }
+ },
+ notes: {
+ local: {
+ total: mostRecent.notes.local.total,
+ diff: 0,
+ diffs: {
+ normal: 0,
+ reply: 0,
+ renote: 0
+ }
+ },
+ remote: {
+ total: mostRecent.notes.remote.total,
+ diff: 0,
+ diffs: {
+ normal: 0,
+ reply: 0,
+ renote: 0
+ }
+ }
+ },
+ drive: {
+ local: {
+ totalCount: mostRecent.drive.local.totalCount,
+ totalSize: mostRecent.drive.local.totalSize,
+ diffCount: 0,
+ diffSize: 0
+ },
+ remote: {
+ totalCount: mostRecent.drive.remote.totalCount,
+ totalSize: mostRecent.drive.remote.totalSize,
+ diffCount: 0,
+ diffSize: 0
+ }
+ }
+ });
+ } else {
+ chart.unshift({
+ date: current,
+ users: {
+ local: {
+ total: 0,
+ diff: 0
+ },
+ remote: {
+ total: 0,
+ diff: 0
+ }
+ },
+ notes: {
+ local: {
+ total: 0,
+ diff: 0,
+ diffs: {
+ normal: 0,
+ reply: 0,
+ renote: 0
+ }
+ },
+ remote: {
+ total: 0,
+ diff: 0,
+ diffs: {
+ normal: 0,
+ reply: 0,
+ renote: 0
+ }
+ }
+ },
+ drive: {
+ local: {
+ totalCount: 0,
+ totalSize: 0,
+ diffCount: 0,
+ diffSize: 0
+ },
+ remote: {
+ totalCount: 0,
+ totalSize: 0,
+ diffCount: 0,
+ diffSize: 0
+ }
+ }
+ });
+ }
+ }
+ }
+
+ chart.forEach(x => {
+ delete (x as any).span;
+ });
+
+ return chart;
+ };
+
+ res({
+ perDay: format(statsPerDay, 'day'),
+ perHour: format(statsPerHour, 'hour')
+ });
+});
diff --git a/src/server/api/endpoints/following/requests/cancel.ts b/src/server/api/endpoints/following/requests/cancel.ts
index 9bfc40ce65..c46b948d29 100644
--- a/src/server/api/endpoints/following/requests/cancel.ts
+++ b/src/server/api/endpoints/following/requests/cancel.ts
@@ -27,7 +27,11 @@ export default (params: any, user: ILocalUser) => new Promise(async (res, rej) =
return rej('followee not found');
}
- await cancelFollowRequest(followee, user);
+ try {
+ await cancelFollowRequest(followee, user);
+ } catch (e) {
+ return rej(e);
+ }
// Send response
res(await pack(followee._id, user));
diff --git a/src/server/api/index.ts b/src/server/api/index.ts
index 3ec7a28df9..a8f6455d9a 100644
--- a/src/server/api/index.ts
+++ b/src/server/api/index.ts
@@ -46,6 +46,11 @@ router.post('/signin', require('./private/signin').default);
router.use(require('./service/github').routes());
router.use(require('./service/twitter').routes());
+// Return 404 for unknown API
+router.all('*', async ctx => {
+ ctx.status = 404;
+});
+
// Register router
app.use(router.routes());