diff --git a/packages/backend/src/core/chart/charts/per-user-pv.ts b/packages/backend/src/core/chart/charts/per-user-pv.ts index 40ff9061f6..02baa5ec1d 100644 --- a/packages/backend/src/core/chart/charts/per-user-pv.ts +++ b/packages/backend/src/core/chart/charts/per-user-pv.ts @@ -54,10 +54,10 @@ export default class PerUserPvChart extends Chart { // eslint-dis } @bindThis - public async getChartUsers(span: 'hour' | 'day', amount: number, cursor: Date | null, limit = 0, offset = 0): Promise<{ + public async getChartUsers(span: 'hour' | 'day', order: 'ASC' | 'DESC', amount: number, cursor: Date | null, limit = 0, offset = 0): Promise<{ userId: string; count: number; }[]> { - return await this.getChartPv(span, amount, cursor, limit, offset); + return await this.getChartPv(span, amount, cursor, limit, offset, order); } } diff --git a/packages/backend/src/core/chart/core.ts b/packages/backend/src/core/chart/core.ts index f0d4fb25c2..44613b5223 100644 --- a/packages/backend/src/core/chart/core.ts +++ b/packages/backend/src/core/chart/core.ts @@ -734,7 +734,7 @@ export default abstract class Chart { } @bindThis - public async getChartPv(span: 'hour' | 'day', amount: number, cursor: Date | null, limit: number, offset: number): Promise< + public async getChartPv(span: 'hour' | 'day', amount: number, cursor: Date | null, limit: number, offset: number, order: 'ASC' | 'DESC'): Promise< { userId: string, count: number, @@ -756,27 +756,13 @@ export default abstract class Chart { new Error('not happen') as never; // ログ取得 - const logs = await repository.createQueryBuilder() + return await repository.createQueryBuilder() + .select('"group" as "userId", sum("___upv_user" + "___upv_visitor") as "count"') .where('date BETWEEN :gt AND :lt', { gt: Chart.dateToTimestamp(gt), lt: Chart.dateToTimestamp(lt) }) - .orderBy('___pv_visitor + ___upv_visitor + ___pv_user + ___upv_user', 'DESC') - .skip(offset) - .take(limit) - .getMany() as { - ___pv_visitor: number, - ___upv_visitor: number, - ___pv_user: number, - ___upv_user: number, - group: string, - }[]; - const result = [] as { - userId: string, - count: number, - }[]; - for (const row of logs) { - const userId = row.group; - const count = row.___pv_user + row.___upv_user + row.___pv_visitor + row.___upv_visitor; - result.push({ userId, count }); - } - return result; + .groupBy('"userId"') + .orderBy('"count"', order) + .offset(offset) + .limit(limit) + .getRawMany<{ userId: string, count: number }>(); } } diff --git a/packages/backend/src/server/api/endpoints/users.ts b/packages/backend/src/server/api/endpoints/users.ts index 41b1dbb581..f09b0de687 100644 --- a/packages/backend/src/server/api/endpoints/users.ts +++ b/packages/backend/src/server/api/endpoints/users.ts @@ -74,7 +74,7 @@ export default class extends Endpoint { // eslint- } const chartUsers: { userId: string; count: number; }[] = []; if (ps.sort?.endsWith('pv')) { - await this.perUserPvChart.getChartUsers('day', 0, null, ps.limit, ps.offset).then(users => { + await this.perUserPvChart.getChartUsers('day', ps.sort === '+pv' ? 'DESC' : 'ASC', 0, null, ps.limit, ps.offset).then(users => { chartUsers.push(...users); }); }