Sharkey/src/server/api/endpoints/chart.ts

179 lines
3.3 KiB
TypeScript
Raw Normal View History

import Stats, { IStats } from '../../../models/stats';
2018-08-18 17:27:23 +02:00
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) => {
2018-08-24 07:55:58 +02:00
const daysRange = 30;
const hoursRange = 30;
2018-08-18 17:27:23 +02:00
const now = new Date();
const y = now.getFullYear();
const m = now.getMonth();
const d = now.getDate();
const h = now.getHours();
2018-08-18 17:27:23 +02:00
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
}
}),
]);
2018-08-18 17:27:23 +02:00
const format = (src: IStats[], span: 'day' | 'hour') => {
const chart: Array<Omit<Omit<IStats, '_id'>, 'span'>> = [];
2018-08-18 17:27:23 +02:00
const range =
span == 'day' ? daysRange :
span == 'hour' ? hoursRange :
null;
2018-08-18 17:27:23 +02:00
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;
2018-08-18 17:27:23 +02:00
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) {
2018-08-24 07:55:58 +02:00
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
2018-08-18 17:27:23 +02:00
}
},
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
}
2018-08-18 17:27:23 +02:00
}
},
drive: {
local: {
totalCount: 0,
totalSize: 0,
diffCount: 0,
diffSize: 0
},
remote: {
totalCount: 0,
totalSize: 0,
diffCount: 0,
diffSize: 0
}
2018-08-18 17:27:23 +02:00
}
});
}
2018-08-18 17:27:23 +02:00
}
}
chart.forEach(x => {
delete (x as any).span;
});
2018-08-18 17:42:09 +02:00
return chart;
};
res({
perDay: format(statsPerDay, 'day'),
perHour: format(statsPerHour, 'hour')
});
2018-08-18 17:27:23 +02:00
});