diff options
| author | syuilo <syuilotan@yahoo.co.jp> | 2018-08-19 00:27:23 +0900 |
|---|---|---|
| committer | syuilo <syuilotan@yahoo.co.jp> | 2018-08-19 00:27:23 +0900 |
| commit | 0481de6629536f7f3144321d9e4fe2144c62d7f0 (patch) | |
| tree | a4b10a50c4114d4229c6ff87905f9bd2bc4ed375 /src/server/api/endpoints | |
| parent | wip (diff) | |
| download | sharkey-0481de6629536f7f3144321d9e4fe2144c62d7f0.tar.gz sharkey-0481de6629536f7f3144321d9e4fe2144c62d7f0.tar.bz2 sharkey-0481de6629536f7f3144321d9e4fe2144c62d7f0.zip | |
wip
Diffstat (limited to 'src/server/api/endpoints')
| -rw-r--r-- | src/server/api/endpoints/admin/chart.ts | 97 | ||||
| -rw-r--r-- | src/server/api/endpoints/aggregation/notes.ts | 116 | ||||
| -rw-r--r-- | src/server/api/endpoints/aggregation/users.ts | 92 |
3 files changed, 97 insertions, 208 deletions
diff --git a/src/server/api/endpoints/admin/chart.ts b/src/server/api/endpoints/admin/chart.ts new file mode 100644 index 0000000000..4ad29a7015 --- /dev/null +++ b/src/server/api/endpoints/admin/chart.ts @@ -0,0 +1,97 @@ +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.push(stat); + } else { // 隙間埋め + const mostRecent = stats.find(s => s.date.getTime() < day.getTime()); + if (mostRecent) { + chart.push(Object.assign({}, mostRecent, { + date: day + })); + } else { + chart.push({ + 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 + } + } + }); + } + } + } + + res(chart); +}); diff --git a/src/server/api/endpoints/aggregation/notes.ts b/src/server/api/endpoints/aggregation/notes.ts deleted file mode 100644 index 77ed07ef4b..0000000000 --- a/src/server/api/endpoints/aggregation/notes.ts +++ /dev/null @@ -1,116 +0,0 @@ -import Note from '../../../../models/note'; - -export const meta = { - requireCredential: true, - requireAdmin: true -}; - -/** - * Aggregate notes - */ -export default (params: any) => new Promise(async (res, rej) => { - const query = [{ - $match: { - createdAt: { - $gt: new Date(new Date().setFullYear(new Date().getFullYear() - 1)) - } - } - }, { - $project: { - renoteId: '$renoteId', - replyId: '$replyId', - user: '$_user', - createdAt: { $add: ['$createdAt', 9 * 60 * 60 * 1000] } // Convert into JST - } - }, { - $project: { - date: { - year: { $year: '$createdAt' }, - month: { $month: '$createdAt' }, - day: { $dayOfMonth: '$createdAt' } - }, - type: { - $cond: { - if: { $ne: ['$renoteId', null] }, - then: 'renote', - else: { - $cond: { - if: { $ne: ['$replyId', null] }, - then: 'reply', - else: 'note' - } - } - } - }, - origin: { - $cond: { - if: { $eq: ['$user.host', null] }, - then: 'local', - else: 'remote' - } - } - } - }, { - $group: { - _id: { - date: '$date', - type: '$type', - origin: '$origin' - }, - count: { $sum: 1 } - } - }, { - $group: { - _id: '$_id.date', - data: { - $addToSet: { - type: '$_id.type', - origin: '$_id.origin', - count: '$count' - } - } - } - }] as any; - - const datas = await Note.aggregate(query); - - datas.forEach((data: any) => { - data.date = data._id; - delete data._id; - - data.localNotes = (data.data.filter((x: any) => x.type == 'note' && x.origin == 'local')[0] || { count: 0 }).count; - data.localRenotes = (data.data.filter((x: any) => x.type == 'renote' && x.origin == 'local')[0] || { count: 0 }).count; - data.localReplies = (data.data.filter((x: any) => x.type == 'reply' && x.origin == 'local')[0] || { count: 0 }).count; - data.remoteNotes = (data.data.filter((x: any) => x.type == 'note' && x.origin == 'remote')[0] || { count: 0 }).count; - data.remoteRenotes = (data.data.filter((x: any) => x.type == 'renote' && x.origin == 'remote')[0] || { count: 0 }).count; - data.remoteReplies = (data.data.filter((x: any) => x.type == 'reply' && x.origin == 'remote')[0] || { count: 0 }).count; - - delete data.data; - }); - - const graph = []; - - for (let i = 0; i < 365; i++) { - const day = new Date(new Date().setDate(new Date().getDate() - i)); - - const data = datas.filter((d: any) => - d.date.year == day.getFullYear() && d.date.month == day.getMonth() + 1 && d.date.day == day.getDate() - )[0]; - - if (data) { - graph.push(data); - } else { - graph.push({ - date: { year: day.getFullYear(), month: day.getMonth() + 1, day: day.getDate() }, - localNotes: 0, - localRenotes: 0, - localReplies: 0, - remoteNotes: 0, - remoteRenotes: 0, - remoteReplies: 0 - }); - } - } - - res(graph); -}); diff --git a/src/server/api/endpoints/aggregation/users.ts b/src/server/api/endpoints/aggregation/users.ts deleted file mode 100644 index d016484238..0000000000 --- a/src/server/api/endpoints/aggregation/users.ts +++ /dev/null @@ -1,92 +0,0 @@ -import User from '../../../../models/user'; - -export const meta = { - requireCredential: true, - requireAdmin: true -}; - -/** - * Aggregate users - */ -export default (params: any) => new Promise(async (res, rej) => { - const query = [{ - $match: { - createdAt: { - $gt: new Date(new Date().setFullYear(new Date().getFullYear() - 1)) - } - } - }, { - $project: { - host: '$host', - createdAt: { $add: ['$createdAt', 9 * 60 * 60 * 1000] } // Convert into JST - } - }, { - $project: { - date: { - year: { $year: '$createdAt' }, - month: { $month: '$createdAt' }, - day: { $dayOfMonth: '$createdAt' } - }, - 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 datas = await User.aggregate(query); - - datas.forEach((data: any) => { - data.date = data._id; - delete data._id; - - 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; - - delete data.data; - }); - - const graph = []; - - for (let i = 0; i < 365; i++) { - const day = new Date(new Date().setDate(new Date().getDate() - i)); - - const data = datas.filter((d: any) => - d.date.year == day.getFullYear() && d.date.month == day.getMonth() + 1 && d.date.day == day.getDate() - )[0]; - - 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); -}); |