UNPKG

unleash-server

Version:

Unleash is an enterprise ready feature flag service. It provides different strategies for handling feature flags.

102 lines 3.58 kB
import { endOfDay, endOfMonth, startOfDay, startOfMonth } from 'date-fns'; const TABLE = 'stat_traffic_usage'; const COLUMNS = ['day', 'traffic_group', 'status_code_series', 'count']; const toRow = (trafficDataUsage) => { return { day: trafficDataUsage.day, traffic_group: trafficDataUsage.trafficGroup, status_code_series: trafficDataUsage.statusCodeSeries, count: trafficDataUsage.count, }; }; const mapRow = (row) => { return { day: row.day, trafficGroup: row.traffic_group, statusCodeSeries: row.status_code_series, count: Number.parseInt(row.count, 10), }; }; export class TrafficDataUsageStore { constructor(db, _getLogger) { this.db = db; } async get(key) { const row = await this.db .table(TABLE) .select() .where({ day: key.day, traffic_group: key.trafficGroup, status_code_series: key.statusCodeSeries, }) .first(); return mapRow(row); } async getAll(query = {}) { const rows = await this.db.select(COLUMNS).where(query).from(TABLE); return rows.map(mapRow); } async exists(key) { const result = await this.db.raw(`SELECT EXISTS (SELECT 1 FROM ${TABLE} WHERE day = ? AND traffic_group = ? AND status_code_series ?) AS present`, [key.day, key.trafficGroup, key.statusCodeSeries]); const { present } = result.rows[0]; return present; } async delete(key) { await this.db(TABLE) .where({ day: key.day, traffic_group: key.trafficGroup, status_code_series: key.statusCodeSeries, }) .del(); } async deleteAll() { await this.db(TABLE).del(); } destroy() { } async upsert(trafficDataUsage) { const row = toRow(trafficDataUsage); await this.db(TABLE) .insert(row) .onConflict(['day', 'traffic_group', 'status_code_series']) .merge({ count: this.db.raw('stat_traffic_usage.count + EXCLUDED.count'), }); } async getDailyTrafficDataUsageForPeriod(from, to) { const rows = await this.db(TABLE) .where('day', '>=', startOfDay(from)) .andWhere('day', '<=', endOfDay(to)); return rows.map(mapRow); } async getMonthlyTrafficDataUsageForPeriod(from, to) { const rows = await this.db(TABLE) .select('traffic_group', 'status_code_series', this.db.raw(`to_char(day, 'YYYY-MM') AS month`), this.db.raw(`SUM(count) AS count`)) .where('day', '>=', startOfDay(from)) .andWhere('day', '<=', endOfDay(to)) .groupBy([ 'traffic_group', this.db.raw(`to_char(day, 'YYYY-MM')`), 'status_code_series', ]) .orderBy([ { column: 'month', order: 'desc' }, { column: 'traffic_group', order: 'asc' }, ]); return rows.map(({ traffic_group, status_code_series, month, count }) => ({ trafficGroup: traffic_group, statusCodeSeries: status_code_series, month, count: Number.parseInt(count, 10), })); } async getTrafficDataUsageForPeriod(period) { const month = new Date(period); return this.getDailyTrafficDataUsageForPeriod(startOfMonth(month), endOfMonth(month)); } } //# sourceMappingURL=traffic-data-usage-store.js.map