summaryrefslogtreecommitdiff
path: root/src/server/api/endpoints/aggregation/users.ts
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/api/endpoints/aggregation/users.ts')
-rw-r--r--src/server/api/endpoints/aggregation/users.ts95
1 files changed, 63 insertions, 32 deletions
diff --git a/src/server/api/endpoints/aggregation/users.ts b/src/server/api/endpoints/aggregation/users.ts
index f1e41cf170..2e397545de 100644
--- a/src/server/api/endpoints/aggregation/users.ts
+++ b/src/server/api/endpoints/aggregation/users.ts
@@ -9,46 +9,77 @@ export default (params: any) => new Promise(async (res, rej) => {
const [limit = 365, limitErr] = $.num.optional.range(1, 365).get(params.limit);
if (limitErr) return rej('invalid limit param');
- const users = await User
- .find({}, {
- sort: {
- _id: -1
+ const query = [{
+ $project: {
+ host: '$host',
+ createdAt: { $add: ['$createdAt', 9 * 60 * 60 * 1000] } // Convert into JST
+ }
+ }, {
+ $project: {
+ date: {
+ year: { $year: '$createdAt' },
+ month: { $month: '$createdAt' },
+ day: { $dayOfMonth: '$createdAt' }
},
- fields: {
- _id: false,
- createdAt: true,
- deletedAt: true
+ origin: {
+ $cond: {
+ if: { $eq: ['$host', null] },
+ then: 'local',
+ else: 'remote'
+ }
}
- });
+ }
+ }, {
+ $group: {
+ _id: {
+ date: '$date',
+ origin: '$origin'
+ },
+ count: { $sum: 1 }
+ }
+ }, {
+ $group: {
+ _id: '$_id.date',
+ data: {
+ $addToSet: {
+ type: '$_id.type',
+ origin: '$_id.origin',
+ count: '$count'
+ }
+ }
+ }
+ }] as any;
- const graph = [];
+ const datas = await User.aggregate(query);
- for (let i = 0; i < limit; i++) {
- let dayStart = new Date(new Date().setDate(new Date().getDate() - i));
- dayStart = new Date(dayStart.setMilliseconds(0));
- dayStart = new Date(dayStart.setSeconds(0));
- dayStart = new Date(dayStart.setMinutes(0));
- dayStart = new Date(dayStart.setHours(0));
+ datas.forEach((data: any) => {
+ data.date = data._id;
+ delete data._id;
- let dayEnd = new Date(new Date().setDate(new Date().getDate() - i));
- dayEnd = new Date(dayEnd.setMilliseconds(999));
- dayEnd = new Date(dayEnd.setSeconds(59));
- dayEnd = new Date(dayEnd.setMinutes(59));
- dayEnd = new Date(dayEnd.setHours(23));
- // day = day.getTime();
+ data.local = (data.data.filter((x: any) => x.origin == 'local')[0] || { count: 0 }).count;
+ data.remote = (data.data.filter((x: any) => x.origin == 'remote')[0] || { count: 0 }).count;
- const total = users.filter(u =>
- u.createdAt < dayEnd && (u.deletedAt == null || u.deletedAt > dayEnd)
- ).length;
+ delete data.data;
+ });
+
+ const graph = [];
+
+ for (let i = 0; i < limit; i++) {
+ const day = new Date(new Date().setDate(new Date().getDate() - i));
- const created = users.filter(u =>
- u.createdAt < dayEnd && u.createdAt > dayStart
- ).length;
+ const data = datas.filter((d: any) =>
+ d.date.year == day.getFullYear() && d.date.month == day.getMonth() + 1 && d.date.day == day.getDate()
+ )[0];
- graph.push({
- total: total,
- created: created
- });
+ if (data) {
+ graph.push(data);
+ } else {
+ graph.push({
+ date: { year: day.getFullYear(), month: day.getMonth() + 1, day: day.getDate() },
+ local: 0,
+ remote: 0
+ });
+ }
}
res(graph);