summaryrefslogtreecommitdiff
path: root/src/chart/users.ts
diff options
context:
space:
mode:
authorsyuilo <syuilotan@yahoo.co.jp>2018-10-23 05:36:35 +0900
committersyuilo <syuilotan@yahoo.co.jp>2018-10-23 05:36:35 +0900
commit7c7f32d9a6597fdc7bea02da0cfd4a843fd32d22 (patch)
treea67396d881993b4240b49f288594b827ef58531c /src/chart/users.ts
parentfix(package): update file-type to version 10.1.0 (#2984) (diff)
downloadsharkey-7c7f32d9a6597fdc7bea02da0cfd4a843fd32d22.tar.gz
sharkey-7c7f32d9a6597fdc7bea02da0cfd4a843fd32d22.tar.bz2
sharkey-7c7f32d9a6597fdc7bea02da0cfd4a843fd32d22.zip
Refactoring
Diffstat (limited to 'src/chart/users.ts')
-rw-r--r--src/chart/users.ts75
1 files changed, 75 insertions, 0 deletions
diff --git a/src/chart/users.ts b/src/chart/users.ts
new file mode 100644
index 0000000000..547e595b01
--- /dev/null
+++ b/src/chart/users.ts
@@ -0,0 +1,75 @@
+import autobind from 'autobind-decorator';
+import Chart, { Obj } from './';
+import User, { IUser, isLocalUser } from '../models/user';
+
+/**
+ * ユーザーに関するチャート
+ */
+type UsersLog = {
+ local: {
+ /**
+ * 集計期間時点での、全ユーザー数
+ */
+ total: number;
+
+ /**
+ * 増加したユーザー数
+ */
+ inc: number;
+
+ /**
+ * 減少したユーザー数
+ */
+ dec: number;
+ };
+
+ remote: UsersLog['local'];
+};
+
+class UsersChart extends Chart<UsersLog> {
+ constructor() {
+ super('users');
+ }
+
+ @autobind
+ protected async getTemplate(init: boolean, latest?: UsersLog): Promise<UsersLog> {
+ const [localCount, remoteCount] = init ? await Promise.all([
+ User.count({ host: null }),
+ User.count({ host: { $ne: null } })
+ ]) : [
+ latest ? latest.local.total : 0,
+ latest ? latest.remote.total : 0
+ ];
+
+ return {
+ local: {
+ total: localCount,
+ inc: 0,
+ dec: 0
+ },
+ remote: {
+ total: remoteCount,
+ inc: 0,
+ dec: 0
+ }
+ };
+ }
+
+ @autobind
+ public async update(user: IUser, isAdditional: boolean) {
+ const update: Obj = {};
+
+ update.total = isAdditional ? 1 : -1;
+ if (isAdditional) {
+ update.inc = 1;
+ } else {
+ update.dec = 1;
+ }
+
+ await this.inc({
+ [isLocalUser(user) ? 'local' : 'remote']: update
+ });
+ }
+}
+
+export default new UsersChart();