import autobind from 'autobind-decorator'; import Chart, { Obj, DeepPartial } from '../core'; import { User } from '@/models/entities/user'; import { SchemaType } from '@/misc/schema'; import { Notes } from '@/models/index'; import { Note } from '@/models/entities/note'; import { name, schema } from './entities/per-user-notes'; type PerUserNotesLog = SchemaType; /** * ユーザーごとのノートに関するチャート */ // eslint-disable-next-line import/no-default-export export default class PerUserNotesChart extends Chart { constructor() { super(name, schema, true); } @autobind protected genNewLog(latest: PerUserNotesLog): DeepPartial { return { total: latest.total, }; } @autobind protected aggregate(logs: PerUserNotesLog[]): PerUserNotesLog { return { total: logs[0].total, inc: logs.reduce((a, b) => a + b.inc, 0), dec: logs.reduce((a, b) => a + b.dec, 0), diffs: { reply: logs.reduce((a, b) => a + b.diffs.reply, 0), renote: logs.reduce((a, b) => a + b.diffs.renote, 0), normal: logs.reduce((a, b) => a + b.diffs.normal, 0), }, }; } @autobind protected async fetchActual(group: string): Promise> { const [count] = await Promise.all([ Notes.count({ userId: group }), ]); return { total: count, }; } @autobind public async update(user: { id: User['id'] }, note: Note, isAdditional: boolean): Promise { 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(update, user.id); } }