import { formatDate } from './Helpers/Format'; const KEY_FORMAT = 'yyyy-mm-dd-HH'; const KEEP_RECORD_COUNT = 24; export interface ActionStatistics { [key: string]: number; } export interface StatisticsStorageInterface { getActionStatistics(): ActionStatistics; setActionStatistics(statistics: ActionStatistics): void; } export class Statistics { private readonly storage: StatisticsStorageInterface; static readonly keepRecords = KEEP_RECORD_COUNT; constructor(storage: StatisticsStorageInterface) { this.storage = storage; } incrementAction(ts: number): void { const stat = this.storage.getActionStatistics(); const key = formatDate(ts, KEY_FORMAT); stat[key] = (stat[key] || 0) + 1; this.trimStatistics(stat); this.storage.setActionStatistics(stat); } private trimStatistics(stat: ActionStatistics) { const topKeys = this.getTopStatKeys(stat); const statKeys = Object.keys(stat); for (let key of statKeys) { if (!topKeys.includes(key)) { delete stat[key]; } } return stat; } private getTopStatKeys(stat: ActionStatistics) { const keys = Object.keys(stat); return keys.sort().reverse().slice(0, KEEP_RECORD_COUNT); } getActionStatistics(): ActionStatistics { return this.storage.getActionStatistics(); } }