summaryrefslogtreecommitdiff
path: root/src/services/chart/notes.ts
diff options
context:
space:
mode:
authorsyuilo <syuilotan@yahoo.co.jp>2019-02-08 04:31:33 +0900
committersyuilo <syuilotan@yahoo.co.jp>2019-02-08 04:31:33 +0900
commitaba85b977dfc868c1a65ce06ed58ea59d0371f7f (patch)
tree5e27a5397bb3ee93ae1790ed2f92c6264ae86956 /src/services/chart/notes.ts
parentImplement instance blocking (#4182) (diff)
downloadsharkey-aba85b977dfc868c1a65ce06ed58ea59d0371f7f.tar.gz
sharkey-aba85b977dfc868c1a65ce06ed58ea59d0371f7f.tar.bz2
sharkey-aba85b977dfc868c1a65ce06ed58ea59d0371f7f.zip
Refactoring: Move chart dir into services dir
Diffstat (limited to 'src/services/chart/notes.ts')
-rw-r--r--src/services/chart/notes.ts114
1 files changed, 114 insertions, 0 deletions
diff --git a/src/services/chart/notes.ts b/src/services/chart/notes.ts
new file mode 100644
index 0000000000..8f95f63638
--- /dev/null
+++ b/src/services/chart/notes.ts
@@ -0,0 +1,114 @@
+import autobind from 'autobind-decorator';
+import Chart, { Obj } from '.';
+import Note, { INote } from '../../models/note';
+import { isLocalUser } from '../../models/user';
+
+/**
+ * 投稿に関するチャート
+ */
+type NotesLog = {
+ local: {
+ /**
+ * 集計期間時点での、全投稿数
+ */
+ total: number;
+
+ /**
+ * 増加した投稿数
+ */
+ inc: number;
+
+ /**
+ * 減少した投稿数
+ */
+ dec: number;
+
+ diffs: {
+ /**
+ * 通常の投稿数の差分
+ */
+ normal: number;
+
+ /**
+ * リプライの投稿数の差分
+ */
+ reply: number;
+
+ /**
+ * Renoteの投稿数の差分
+ */
+ renote: number;
+ };
+ };
+
+ remote: NotesLog['local'];
+};
+
+class NotesChart extends Chart<NotesLog> {
+ constructor() {
+ super('notes');
+ }
+
+ @autobind
+ protected async getTemplate(init: boolean, latest?: NotesLog): Promise<NotesLog> {
+ const [localCount, remoteCount] = init ? await Promise.all([
+ Note.count({ '_user.host': null }),
+ Note.count({ '_user.host': { $ne: null } })
+ ]) : [
+ latest ? latest.local.total : 0,
+ latest ? latest.remote.total : 0
+ ];
+
+ return {
+ local: {
+ total: localCount,
+ inc: 0,
+ dec: 0,
+ diffs: {
+ normal: 0,
+ reply: 0,
+ renote: 0
+ }
+ },
+ remote: {
+ total: remoteCount,
+ inc: 0,
+ dec: 0,
+ diffs: {
+ normal: 0,
+ reply: 0,
+ renote: 0
+ }
+ }
+ };
+ }
+
+ @autobind
+ public async update(note: INote, isAdditional: boolean) {
+ const update: Obj = {
+ diffs: {}
+ };
+
+ update.total = isAdditional ? 1 : -1;
+
+ if (isAdditional) {
+ update.inc = 1;
+ } else {
+ update.dec = 1;
+ }
+
+ if (note.replyId != null) {
+ update.diffs.reply = isAdditional ? 1 : -1;
+ } else if (note.renoteId != null) {
+ update.diffs.renote = isAdditional ? 1 : -1;
+ } else {
+ update.diffs.normal = isAdditional ? 1 : -1;
+ }
+
+ await this.inc({
+ [isLocalUser(note._user) ? 'local' : 'remote']: update
+ });
+ }
+}
+
+export default new NotesChart();