diff --git a/src/lib/features/traffic-data-usage/traffic-data-usage-store.test.ts b/src/lib/features/traffic-data-usage/traffic-data-usage-store.test.ts index ba3cecf635..89329e5cd7 100644 --- a/src/lib/features/traffic-data-usage/traffic-data-usage-store.test.ts +++ b/src/lib/features/traffic-data-usage/traffic-data-usage-store.test.ts @@ -204,7 +204,7 @@ test('can query for monthly aggregation of data for a specified range', async () // fill in with data for the last 13 months for (let i = 0; i <= 12; i++) { - const month = subMonths(now, i).getMonth(); + const then = subMonths(now, i); let monthAggregateA = 0; let monthAggregateB = 0; for (let day = 1; day <= 5; day++) { @@ -213,14 +213,14 @@ test('can query for monthly aggregation of data for a specified range', async () monthAggregateA += dayValue; monthAggregateB += dayValueB; const dataA = { - day: new Date(2024, month, day), + day: new Date(then.getFullYear(), then.getMonth(), day), trafficGroup: 'groupA', statusCodeSeries: 200, count: dayValue, }; await trafficDataUsageStore.upsert(dataA); const dataB = { - day: new Date(2024, month, day), + day: new Date(then.getFullYear(), then.getMonth(), day), trafficGroup: 'groupB', statusCodeSeries: 200, count: dayValueB, @@ -233,14 +233,12 @@ test('can query for monthly aggregation of data for a specified range', async () }); } - console.log(expectedValues); - for (const monthsBack of [3, 6, 12]) { const result = await trafficDataUsageStore.getTrafficDataForMonthRange(monthsBack); // should have the current month and the preceding n months - expect(result.length).toBe(monthsBack + 1); + expect(result.length).toBe((monthsBack + 1) * 2); for (const entry of result) { const index = differenceInCalendarMonths( diff --git a/src/lib/features/traffic-data-usage/traffic-data-usage-store.ts b/src/lib/features/traffic-data-usage/traffic-data-usage-store.ts index c55d83336c..ba686ea867 100644 --- a/src/lib/features/traffic-data-usage/traffic-data-usage-store.ts +++ b/src/lib/features/traffic-data-usage/traffic-data-usage-store.ts @@ -56,7 +56,7 @@ export class TrafficDataUsageStore implements ITrafficDataUsageStore { } async exists(key: IStatTrafficUsageKey): Promise { const result = await this.db.raw( - `SELECT EXISTS (SELECT 1 FROM ${TABLE} WHERE + `SELECT EXISTS (SELECT 1 FROM ${TABLE} WHERE day = ? AND traffic_group = ? AND status_code_series ?) AS present`, @@ -102,6 +102,33 @@ export class TrafficDataUsageStore implements ITrafficDataUsageStore { async getTrafficDataForMonthRange( monthsBack: number, ): Promise { - return []; + 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`), + ) + .whereRaw( + `day >= date_trunc('month', CURRENT_DATE) - make_interval(months := ?)`, + [monthsBack], + ) + .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), + }), + ); } }