'use strict'; const logger = require('../logger'); const METRICS_COLUMNS = ['id', 'created_at', 'metrics']; const TABLE = 'client_metrics'; const mapRow = (row) => ({ id: row.id, createdAt: row.created_at, metrics: row.metrics, }); class ClientMetricsStore { constructor (db) { this.db = db; setTimeout(() => this._removeMetricsOlderThanOneHour(), 10).unref(); setInterval(() => this._removeMetricsOlderThanOneHour(), 60 * 60 * 1000).unref(); } _removeMetricsOlderThanOneHour () { this.db(TABLE) .whereRaw('created_at < now() - interval \'1 hour\'') .del() .then((res) => logger.info(`Delted ${res} metrics`)); } // Insert new client metrics insert (metrics) { return this.db(TABLE).insert({ metrics }); } // Used at startup to load all metrics last week into memory! getMetricsLastHour () { return this.db .select(METRICS_COLUMNS) .from(TABLE) .limit(2000) .whereRaw('created_at > now() - interval \'1 hour\'') .orderBy('created_at', 'asc') .map(mapRow); } // Used to poll for new metrics getNewMetrics (lastKnownId) { return this.db .select(METRICS_COLUMNS) .from(TABLE) .limit(1000) .where('id', '>', lastKnownId) .orderBy('created_at', 'asc') .map(mapRow); } }; module.exports = ClientMetricsStore;