diff --git a/sql/reports/topgear/topgear-handles.sql b/sql/reports/topgear/topgear-handles.sql new file mode 100644 index 0000000..a2dc53c --- /dev/null +++ b/sql/reports/topgear/topgear-handles.sql @@ -0,0 +1,30 @@ +-- INPUTS: +-- $1 :: timestamptz -- startDate filter +SELECT + m.handle AS "Handle", + m."firstName" AS "First name", + m."lastName" AS "Last name", + m.email AS "Email address", + m."userId" AS "User ID", + u.create_date AS "User create date", + sso.sso_user_id AS "SSO user ID", + sso.sso_user_name AS "SSO user name", + sso.email AS "SSO email" +FROM members.member m +JOIN identity."user" u + ON u.user_id = m."userId"::numeric(10, 0) + AND u.create_date >= $1::timestamptz +LEFT JOIN LATERAL ( + SELECT + usl.sso_user_id, + usl.sso_user_name, + usl.email + FROM identity.user_sso_login usl + WHERE usl.user_id = m."userId"::numeric(10, 0) + ORDER BY + (usl.email ILIKE '%@wipro.com') DESC, + usl.provider_id + LIMIT 1 +) sso ON TRUE +WHERE m.email ILIKE '%@wipro.com' +ORDER BY u.create_date DESC NULLS LAST, m.handle; diff --git a/src/app-constants.ts b/src/app-constants.ts index 19d8181..42777a9 100644 --- a/src/app-constants.ts +++ b/src/app-constants.ts @@ -1,5 +1,6 @@ export const Scopes = { TopgearHourly: "reports:topgear-hourly", + TopgearHandles: "reports:topgear-handles", TopgearPayments: "reports:topgear-payments", TopgearChallenge: "reports:topgear-challenge", TopgearCancelledChallenge: "reports:topgear-cancelled-challenge", diff --git a/src/reports/topgear/topgear-reports.controller.ts b/src/reports/topgear/topgear-reports.controller.ts index 1901979..7f6e8ef 100644 --- a/src/reports/topgear/topgear-reports.controller.ts +++ b/src/reports/topgear/topgear-reports.controller.ts @@ -29,6 +29,24 @@ export class TopgearReportsController { return this.reports.getTopgearHourly(); } + @Get("topgear-handles") + @UseGuards(PermissionsGuard) + @Scopes(AppScopes.AllReports, AppScopes.TopgearHandles) + @ApiBearerAuth() + @ApiOperation({ + summary: "Return the Topgear handles report for Wipro email accounts", + }) + @ApiQuery({ + name: "startDate", + required: false, + type: Date, + description: + "Filter users created after this date (defaults to current date - 90 days)", + }) + getTopgearHandles(@Query("startDate") startDate?: string) { + return this.reports.getTopgearHandles({ startDate }); + } + @Get("challenge-stats-by-user") @UseGuards(PermissionsGuard) @Scopes(AppScopes.AllReports, AppScopes.TopgearChallengeStatsByUser) diff --git a/src/reports/topgear/topgear-reports.service.ts b/src/reports/topgear/topgear-reports.service.ts index cf1583b..8763473 100644 --- a/src/reports/topgear/topgear-reports.service.ts +++ b/src/reports/topgear/topgear-reports.service.ts @@ -21,6 +21,12 @@ export class TopgearReportsService { return this.db.query(query); } + async getTopgearHandles(opts: { startDate?: string }) { + const startDate = parseOptionalDate(opts.startDate) ?? subDays(new Date(), 90); + const query = this.sql.load("reports/topgear/topgear-handles.sql"); + return this.db.query(query, [startDate.toISOString()]); + } + async getChallengeStatsByUser(opts: { startDate?: string; endDate?: string;