diff options
| author | syuilo <syuilotan@yahoo.co.jp> | 2017-08-12 15:17:03 +0900 |
|---|---|---|
| committer | syuilo <syuilotan@yahoo.co.jp> | 2017-08-12 15:17:03 +0900 |
| commit | dd1aa8c7d6ec003fcf187c1fc8e6c56f60723414 (patch) | |
| tree | 02138842254347d2ee8ceea73e439de040cc9ccb /src/api/endpoints/aggregation/users.ts | |
| parent | Merge pull request #687 from syuilo/greenkeeper/reconnecting-websocket-3.1.1 (diff) | |
| download | sharkey-dd1aa8c7d6ec003fcf187c1fc8e6c56f60723414.tar.gz sharkey-dd1aa8c7d6ec003fcf187c1fc8e6c56f60723414.tar.bz2 sharkey-dd1aa8c7d6ec003fcf187c1fc8e6c56f60723414.zip | |
stats
Diffstat (limited to 'src/api/endpoints/aggregation/users.ts')
| -rw-r--r-- | src/api/endpoints/aggregation/users.ts | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/src/api/endpoints/aggregation/users.ts b/src/api/endpoints/aggregation/users.ts new file mode 100644 index 0000000000..9be4ca12a1 --- /dev/null +++ b/src/api/endpoints/aggregation/users.ts @@ -0,0 +1,59 @@ +/** + * Module dependencies + */ +import $ from 'cafy'; +import User from '../../models/user'; + +/** + * Aggregate users + * + * @param {any} params + * @return {Promise<any>} + */ +module.exports = params => new Promise(async (res, rej) => { + // Get 'limit' parameter + const [limit = 365, limitErr] = $(params.limit).optional.number().range(1, 365).$; + if (limitErr) return rej('invalid limit param'); + + const startTime = new Date(new Date().setMonth(new Date().getMonth() - 1)); + + const users = await User + .find({ + $or: [ + { deleted_at: { $exists: false } }, + { deleted_at: { $gt: startTime } } + ] + }, { + _id: false, + created_at: true, + deleted_at: true + }, { + sort: { created_at: -1 } + }); + + const graph = []; + + for (let i = 0; i < limit; i++) { + let day = new Date(new Date().setDate(new Date().getDate() - i)); + day = new Date(day.setMilliseconds(999)); + day = new Date(day.setSeconds(59)); + day = new Date(day.setMinutes(59)); + day = new Date(day.setHours(23)); + // day = day.getTime(); + + const count = users.filter(f => + f.created_at < day && (f.deleted_at == null || f.deleted_at > day) + ).length; + + graph.push({ + date: { + year: day.getFullYear(), + month: day.getMonth() + 1, // In JavaScript, month is zero-based. + day: day.getDate() + }, + count: count + }); + } + + res(graph); +}); |