Skip to content

Commit e5abcda

Browse files
committed
chore: add hourly request stats to subscription request history
- Updated version in package.json to 2.1.64. - Added hourlyRequestStats to GetSubscriptionRequestHistoryStatsCommand and GetSubscriptionRequestHistoryStatsResponseModel. - Implemented getHourlyRequestStats method in UserSubscriptionRequestHistoryRepository to retrieve hourly request statistics.
1 parent f6010bf commit e5abcda

File tree

5 files changed

+34
-1
lines changed

5 files changed

+34
-1
lines changed

libs/contract/commands/subscription-request-history/get-subscription-request-history-stats.command.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,15 @@ export namespace GetSubscriptionRequestHistoryStatsCommand {
2121
count: z.number(),
2222
}),
2323
),
24+
hourlyRequestStats: z.array(
25+
z.object({
26+
dateTime: z
27+
.string()
28+
.datetime()
29+
.transform((str) => new Date(str)),
30+
requestCount: z.number(),
31+
}),
32+
),
2433
}),
2534
});
2635

libs/contract/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@remnawave/backend-contract",
3-
"version": "2.1.62",
3+
"version": "2.1.64",
44
"public": true,
55
"license": "AGPL-3.0-only",
66
"description": "A contract library for Remnawave Backend. It can be used in backend and frontend.",
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
export class GetSubscriptionRequestHistoryStatsResponseModel {
22
public readonly byParsedApp: { app: string; count: number }[];
3+
public readonly hourlyRequestStats: { dateTime: Date; requestCount: number }[];
34

45
constructor(data: GetSubscriptionRequestHistoryStatsResponseModel) {
56
this.byParsedApp = data.byParsedApp;
7+
this.hourlyRequestStats = data.hourlyRequestStats;
68
}
79
}

src/modules/user-subscription-request-history/repositories/user-subscription-request-history.repository.ts

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -254,4 +254,22 @@ export class UserSubscriptionRequestHistoryRepository
254254

255255
return result.length;
256256
}
257+
258+
public async getHourlyRequestStats(): Promise<{ dateTime: Date; requestCount: number }[]> {
259+
const result = await this.qb.kysely
260+
.selectFrom('userSubscriptionRequestHistory')
261+
.select([
262+
sql<Date>`date_trunc('hour', request_at)`.as('hour'),
263+
(eb) => eb.fn.count('id').as('requestCount'),
264+
])
265+
.where('requestAt', '>=', sql<Date>`NOW() - INTERVAL '48 hours'`)
266+
.groupBy(sql`date_trunc('hour', request_at)`)
267+
.orderBy('hour')
268+
.execute();
269+
270+
return result.map((row) => ({
271+
dateTime: row.hour,
272+
requestCount: Number(row.requestCount),
273+
}));
274+
}
257275
}

src/modules/user-subscription-request-history/user-subscription-request-history.service.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,10 +52,14 @@ export class UserSubscriptionRequestHistoryService {
5252
const stats =
5353
await this.userSubscriptionRequestHistoryRepository.getSubscriptionRequestHistoryStats();
5454

55+
const hourlyRequestStats =
56+
await this.userSubscriptionRequestHistoryRepository.getHourlyRequestStats();
57+
5558
return {
5659
isOk: true,
5760
response: new GetSubscriptionRequestHistoryStatsResponseModel({
5861
byParsedApp: stats.byParsedApp,
62+
hourlyRequestStats: hourlyRequestStats,
5963
}),
6064
};
6165
} catch (error) {

0 commit comments

Comments
 (0)