summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorsyuilo <Syuilotan@yahoo.co.jp>2020-03-07 01:04:36 +0900
committersyuilo <Syuilotan@yahoo.co.jp>2020-03-07 01:04:36 +0900
commit1947835c5152b7cc9a23bb1a5da0caa953e9d660 (patch)
tree9d6e91f2a3ce6023b3c782c0fa0b650cdfbd2310 /src
parentRefactor (diff)
downloadsharkey-1947835c5152b7cc9a23bb1a5da0caa953e9d660.tar.gz
sharkey-1947835c5152b7cc9a23bb1a5da0caa953e9d660.tar.bz2
sharkey-1947835c5152b7cc9a23bb1a5da0caa953e9d660.zip
Resolve #6137
Diffstat (limited to 'src')
-rw-r--r--src/prelude/time.ts4
-rw-r--r--src/server/api/endpoints/charts/active-users.ts7
-rw-r--r--src/server/api/endpoints/charts/drive.ts7
-rw-r--r--src/server/api/endpoints/charts/federation.ts7
-rw-r--r--src/server/api/endpoints/charts/hashtag.ts7
-rw-r--r--src/server/api/endpoints/charts/instance.ts7
-rw-r--r--src/server/api/endpoints/charts/network.ts7
-rw-r--r--src/server/api/endpoints/charts/notes.ts7
-rw-r--r--src/server/api/endpoints/charts/user/drive.ts7
-rw-r--r--src/server/api/endpoints/charts/user/following.ts7
-rw-r--r--src/server/api/endpoints/charts/user/notes.ts7
-rw-r--r--src/server/api/endpoints/charts/user/reactions.ts7
-rw-r--r--src/server/api/endpoints/charts/users.ts7
-rw-r--r--src/server/api/endpoints/stats.ts6
-rw-r--r--src/services/chart/core.ts58
15 files changed, 114 insertions, 38 deletions
diff --git a/src/prelude/time.ts b/src/prelude/time.ts
index 0c75d96fe2..77a5fc1af2 100644
--- a/src/prelude/time.ts
+++ b/src/prelude/time.ts
@@ -1,6 +1,6 @@
const dateTimeIntervals = {
- 'days': 86400000,
- 'hours': 3600000,
+ 'day': 86400000,
+ 'hour': 3600000,
};
export function DateUTC(time: number[]): Date {
diff --git a/src/server/api/endpoints/charts/active-users.ts b/src/server/api/endpoints/charts/active-users.ts
index 59bb1db109..327dd4de3e 100644
--- a/src/server/api/endpoints/charts/active-users.ts
+++ b/src/server/api/endpoints/charts/active-users.ts
@@ -25,11 +25,16 @@ export const meta = {
'ja-JP': '最大数。例えば 30 を指定したとすると、スパンが"day"の場合は30日分のデータが、スパンが"hour"の場合は30時間分のデータが返ります。'
}
},
+
+ offset: {
+ validator: $.optional.num,
+ default: 0,
+ },
},
res: convertLog(activeUsersChart.schema),
};
export default define(meta, async (ps) => {
- return await activeUsersChart.getChart(ps.span as any, ps.limit!);
+ return await activeUsersChart.getChart(ps.span as any, ps.limit!, ps.offset!);
});
diff --git a/src/server/api/endpoints/charts/drive.ts b/src/server/api/endpoints/charts/drive.ts
index 5c26fe719a..752cb6f037 100644
--- a/src/server/api/endpoints/charts/drive.ts
+++ b/src/server/api/endpoints/charts/drive.ts
@@ -25,11 +25,16 @@ export const meta = {
'ja-JP': '最大数。例えば 30 を指定したとすると、スパンが"day"の場合は30日分のデータが、スパンが"hour"の場合は30時間分のデータが返ります。'
}
},
+
+ offset: {
+ validator: $.optional.num,
+ default: 0,
+ },
},
res: convertLog(driveChart.schema),
};
export default define(meta, async (ps) => {
- return await driveChart.getChart(ps.span as any, ps.limit!);
+ return await driveChart.getChart(ps.span as any, ps.limit!, ps.offset!);
});
diff --git a/src/server/api/endpoints/charts/federation.ts b/src/server/api/endpoints/charts/federation.ts
index ebd60cc24b..1701f9bde4 100644
--- a/src/server/api/endpoints/charts/federation.ts
+++ b/src/server/api/endpoints/charts/federation.ts
@@ -25,11 +25,16 @@ export const meta = {
'ja-JP': '最大数。例えば 30 を指定したとすると、スパンが"day"の場合は30日分のデータが、スパンが"hour"の場合は30時間分のデータが返ります。'
}
},
+
+ offset: {
+ validator: $.optional.num,
+ default: 0,
+ },
},
res: convertLog(federationChart.schema),
};
export default define(meta, async (ps) => {
- return await federationChart.getChart(ps.span as any, ps.limit!);
+ return await federationChart.getChart(ps.span as any, ps.limit!, ps.offset!);
});
diff --git a/src/server/api/endpoints/charts/hashtag.ts b/src/server/api/endpoints/charts/hashtag.ts
index 8d14430137..bb353e7038 100644
--- a/src/server/api/endpoints/charts/hashtag.ts
+++ b/src/server/api/endpoints/charts/hashtag.ts
@@ -26,6 +26,11 @@ export const meta = {
}
},
+ offset: {
+ validator: $.optional.num,
+ default: 0,
+ },
+
tag: {
validator: $.str,
desc: {
@@ -38,5 +43,5 @@ export const meta = {
};
export default define(meta, async (ps) => {
- return await hashtagChart.getChart(ps.span as any, ps.limit!, ps.tag);
+ return await hashtagChart.getChart(ps.span as any, ps.limit!, ps.offset!, ps.tag);
});
diff --git a/src/server/api/endpoints/charts/instance.ts b/src/server/api/endpoints/charts/instance.ts
index 4c26b7614c..3ccb2ba126 100644
--- a/src/server/api/endpoints/charts/instance.ts
+++ b/src/server/api/endpoints/charts/instance.ts
@@ -26,6 +26,11 @@ export const meta = {
}
},
+ offset: {
+ validator: $.optional.num,
+ default: 0,
+ },
+
host: {
validator: $.str,
desc: {
@@ -39,5 +44,5 @@ export const meta = {
};
export default define(meta, async (ps) => {
- return await instanceChart.getChart(ps.span as any, ps.limit!, ps.host);
+ return await instanceChart.getChart(ps.span as any, ps.limit!, ps.offset!, ps.host);
});
diff --git a/src/server/api/endpoints/charts/network.ts b/src/server/api/endpoints/charts/network.ts
index 162c0c9ecd..20f5977baa 100644
--- a/src/server/api/endpoints/charts/network.ts
+++ b/src/server/api/endpoints/charts/network.ts
@@ -25,11 +25,16 @@ export const meta = {
'ja-JP': '最大数。例えば 30 を指定したとすると、スパンが"day"の場合は30日分のデータが、スパンが"hour"の場合は30時間分のデータが返ります。'
}
},
+
+ offset: {
+ validator: $.optional.num,
+ default: 0,
+ },
},
res: convertLog(networkChart.schema),
};
export default define(meta, async (ps) => {
- return await networkChart.getChart(ps.span as any, ps.limit!);
+ return await networkChart.getChart(ps.span as any, ps.limit!, ps.offset!);
});
diff --git a/src/server/api/endpoints/charts/notes.ts b/src/server/api/endpoints/charts/notes.ts
index c25f46f543..5111e299e2 100644
--- a/src/server/api/endpoints/charts/notes.ts
+++ b/src/server/api/endpoints/charts/notes.ts
@@ -25,11 +25,16 @@ export const meta = {
'ja-JP': '最大数。例えば 30 を指定したとすると、スパンが"day"の場合は30日分のデータが、スパンが"hour"の場合は30時間分のデータが返ります。'
}
},
+
+ offset: {
+ validator: $.optional.num,
+ default: 0,
+ },
},
res: convertLog(notesChart.schema),
};
export default define(meta, async (ps) => {
- return await notesChart.getChart(ps.span as any, ps.limit!);
+ return await notesChart.getChart(ps.span as any, ps.limit!, ps.offset!);
});
diff --git a/src/server/api/endpoints/charts/user/drive.ts b/src/server/api/endpoints/charts/user/drive.ts
index 6bfa427403..576bc7be6a 100644
--- a/src/server/api/endpoints/charts/user/drive.ts
+++ b/src/server/api/endpoints/charts/user/drive.ts
@@ -27,6 +27,11 @@ export const meta = {
}
},
+ offset: {
+ validator: $.optional.num,
+ default: 0,
+ },
+
userId: {
validator: $.type(ID),
desc: {
@@ -40,5 +45,5 @@ export const meta = {
};
export default define(meta, async (ps) => {
- return await perUserDriveChart.getChart(ps.span as any, ps.limit!, ps.userId);
+ return await perUserDriveChart.getChart(ps.span as any, ps.limit!, ps.offset!, ps.userId);
});
diff --git a/src/server/api/endpoints/charts/user/following.ts b/src/server/api/endpoints/charts/user/following.ts
index 0da995e2ec..dcdf15b410 100644
--- a/src/server/api/endpoints/charts/user/following.ts
+++ b/src/server/api/endpoints/charts/user/following.ts
@@ -27,6 +27,11 @@ export const meta = {
}
},
+ offset: {
+ validator: $.optional.num,
+ default: 0,
+ },
+
userId: {
validator: $.type(ID),
desc: {
@@ -40,5 +45,5 @@ export const meta = {
};
export default define(meta, async (ps) => {
- return await perUserFollowingChart.getChart(ps.span as any, ps.limit!, ps.userId);
+ return await perUserFollowingChart.getChart(ps.span as any, ps.limit!, ps.offset!, ps.userId);
});
diff --git a/src/server/api/endpoints/charts/user/notes.ts b/src/server/api/endpoints/charts/user/notes.ts
index 754ade1228..65c12d6be2 100644
--- a/src/server/api/endpoints/charts/user/notes.ts
+++ b/src/server/api/endpoints/charts/user/notes.ts
@@ -27,6 +27,11 @@ export const meta = {
}
},
+ offset: {
+ validator: $.optional.num,
+ default: 0,
+ },
+
userId: {
validator: $.type(ID),
desc: {
@@ -40,5 +45,5 @@ export const meta = {
};
export default define(meta, async (ps) => {
- return await perUserNotesChart.getChart(ps.span as any, ps.limit!, ps.userId);
+ return await perUserNotesChart.getChart(ps.span as any, ps.limit!, ps.offset!, ps.userId);
});
diff --git a/src/server/api/endpoints/charts/user/reactions.ts b/src/server/api/endpoints/charts/user/reactions.ts
index f3344c6648..c83a203b9c 100644
--- a/src/server/api/endpoints/charts/user/reactions.ts
+++ b/src/server/api/endpoints/charts/user/reactions.ts
@@ -27,6 +27,11 @@ export const meta = {
}
},
+ offset: {
+ validator: $.optional.num,
+ default: 0,
+ },
+
userId: {
validator: $.type(ID),
desc: {
@@ -40,5 +45,5 @@ export const meta = {
};
export default define(meta, async (ps) => {
- return await perUserReactionsChart.getChart(ps.span as any, ps.limit!, ps.userId);
+ return await perUserReactionsChart.getChart(ps.span as any, ps.limit!, ps.offset!, ps.userId);
});
diff --git a/src/server/api/endpoints/charts/users.ts b/src/server/api/endpoints/charts/users.ts
index 0d7fb7b951..7f52184f16 100644
--- a/src/server/api/endpoints/charts/users.ts
+++ b/src/server/api/endpoints/charts/users.ts
@@ -25,11 +25,16 @@ export const meta = {
'ja-JP': '最大数。例えば 30 を指定したとすると、スパンが"day"の場合は30日分のデータが、スパンが"hour"の場合は30時間分のデータが返ります。'
}
},
+
+ offset: {
+ validator: $.optional.num,
+ default: 0,
+ },
},
res: convertLog(usersChart.schema),
};
export default define(meta, async (ps) => {
- return await usersChart.getChart(ps.span as any, ps.limit!);
+ return await usersChart.getChart(ps.span as any, ps.limit!, ps.offset!);
});
diff --git a/src/server/api/endpoints/stats.ts b/src/server/api/endpoints/stats.ts
index 5bc224450b..a6ee240a89 100644
--- a/src/server/api/endpoints/stats.ts
+++ b/src/server/api/endpoints/stats.ts
@@ -60,9 +60,9 @@ export default define(meta, async () => {
Notes.count({ where: { userHost: null }, cache: 3600000 }),
Users.count({ cache: 3600000 }),
Users.count({ where: { host: null }, cache: 3600000 }),
- federationChart.getChart('hour', 1).then(chart => chart.instance.total[0]),
- driveChart.getChart('hour', 1).then(chart => chart.local.totalSize[0]),
- driveChart.getChart('hour', 1).then(chart => chart.remote.totalSize[0]),
+ federationChart.getChart('hour', 1, 0).then(chart => chart.instance.total[0]),
+ driveChart.getChart('hour', 1, 0).then(chart => chart.local.totalSize[0]),
+ driveChart.getChart('hour', 1, 0).then(chart => chart.remote.totalSize[0]),
]);
return {
diff --git a/src/services/chart/core.ts b/src/services/chart/core.ts
index d62149c9a9..5a2508b556 100644
--- a/src/services/chart/core.ts
+++ b/src/services/chart/core.ts
@@ -8,7 +8,7 @@ import * as nestedProperty from 'nested-property';
import autobind from 'autobind-decorator';
import Logger from '../logger';
import { Schema } from '../../misc/schema';
-import { EntitySchema, getRepository, Repository, LessThan, MoreThanOrEqual } from 'typeorm';
+import { EntitySchema, getRepository, Repository, LessThan, MoreThanOrEqual, Between } from 'typeorm';
import { DateUTC, isTimeSame, isTimeBefore, subtractTimespan } from '../../prelude/time';
import { getChartInsertLock } from '../../misc/app-lock';
@@ -134,6 +134,21 @@ export default abstract class Chart<T extends Record<string, any>> {
}
@autobind
+ private static dateToYMDH(date: Date): [number, number, number, number] {
+ const y = date.getUTCFullYear();
+ const m = date.getUTCMonth();
+ const d = date.getUTCDate();
+ const h = date.getUTCHours();
+
+ return [y, m, d, h];
+ }
+
+ @autobind
+ private static getCurrentDate(): [number, number, number, number] {
+ return Chart.dateToYMDH(new Date());
+ }
+
+ @autobind
public static schemaToEntity(name: string, schema: Schema): EntitySchema {
return new EntitySchema({
name: `__chart__${camelToSnake(name)}`,
@@ -212,18 +227,6 @@ export default abstract class Chart<T extends Record<string, any>> {
}
@autobind
- private getCurrentDate(): [number, number, number, number] {
- const now = new Date();
-
- const y = now.getUTCFullYear();
- const m = now.getUTCMonth();
- const d = now.getUTCDate();
- const h = now.getUTCHours();
-
- return [y, m, d, h];
- }
-
- @autobind
private getLatestLog(span: Span, group: string | null = null): Promise<Log | null> {
return this.repository.findOne({
group: group,
@@ -237,7 +240,7 @@ export default abstract class Chart<T extends Record<string, any>> {
@autobind
private async getCurrentLog(span: Span, group: string | null = null): Promise<Log> {
- const [y, m, d, h] = this.getCurrentDate();
+ const [y, m, d, h] = Chart.getCurrentDate();
const current =
span == 'day' ? DateUTC([y, m, d]) :
@@ -378,12 +381,23 @@ export default abstract class Chart<T extends Record<string, any>> {
}
@autobind
- public async getChart(span: Span, range: number, group: string | null = null): Promise<ArrayValue<T>> {
- const [y, m, d, h] = this.getCurrentDate();
+ public async getChart(span: Span, range: number, offset: number, group: string | null = null): Promise<ArrayValue<T>> {
+ let [y, m, d, h] = Chart.getCurrentDate();
+
+ let lt: Date = null as never;
+
+ if (offset > 0) {
+ [y, m, d, h] = Chart.dateToYMDH(subtractTimespan(DateUTC([y, m, d, h]), offset, span));
+
+ lt =
+ span === 'day' ? DateUTC([y, m, d]) :
+ span === 'hour' ? DateUTC([y, m, d, h]) :
+ null as never;
+ }
const gt =
- span === 'day' ? subtractTimespan(DateUTC([y, m, d]), range - 1, 'days') :
- span === 'hour' ? subtractTimespan(DateUTC([y, m, d, h]), range - 1, 'hours') :
+ span === 'day' ? subtractTimespan(DateUTC([y, m, d]), range - 1, 'day') :
+ span === 'hour' ? subtractTimespan(DateUTC([y, m, d, h]), range - 1, 'hour') :
null as never;
// ログ取得
@@ -391,7 +405,9 @@ export default abstract class Chart<T extends Record<string, any>> {
where: {
group: group,
span: span,
- date: MoreThanOrEqual(Chart.dateToTimestamp(gt))
+ date: offset === 0
+ ? MoreThanOrEqual(Chart.dateToTimestamp(gt))
+ : Between(Chart.dateToTimestamp(gt), Chart.dateToTimestamp(lt))
},
order: {
date: -1
@@ -439,8 +455,8 @@ export default abstract class Chart<T extends Record<string, any>> {
// 整形
for (let i = (range - 1); i >= 0; i--) {
const current =
- span == 'day' ? subtractTimespan(DateUTC([y, m, d]), i, 'days') :
- span == 'hour' ? subtractTimespan(DateUTC([y, m, d, h]), i, 'hours') :
+ span == 'day' ? subtractTimespan(DateUTC([y, m, d]), i, 'day') :
+ span == 'hour' ? subtractTimespan(DateUTC([y, m, d, h]), i, 'hour') :
null as never;
const log = logs.find(l => isTimeSame(new Date(l.date * 1000), current));