|
1 | | -import { Injectable, NotFoundException, OnModuleInit } from "@nestjs/common"; |
| 1 | +import { Injectable, NotFoundException } from "@nestjs/common"; |
2 | 2 | import { alpha3ToCountryName } from "../../common/country.util"; |
3 | 3 | import { DbService } from "../../db/db.service"; |
4 | 4 | import { MemberSearchBodyDto } from "./dto/member-search.dto"; |
@@ -42,35 +42,9 @@ function formatLocation(location: string): string { |
42 | 42 | } |
43 | 43 |
|
44 | 44 | @Injectable() |
45 | | -export class MemberSearchService implements OnModuleInit { |
46 | | - private winEventTypeIds: string[] = []; |
47 | | - private engagementSourceTypeId: string = ""; |
48 | | - |
| 45 | +export class MemberSearchService { |
49 | 46 | constructor(private readonly db: DbService) {} |
50 | 47 |
|
51 | | - async onModuleInit(): Promise<void> { |
52 | | - const [winRows, engRows] = await Promise.all([ |
53 | | - this.db.query<{ id: string }>( |
54 | | - `SELECT id::text FROM skills.skill_event_type |
55 | | - WHERE name = ANY($1::text[])`, |
56 | | - [ |
57 | | - [ |
58 | | - "challenge_win", |
59 | | - "challenge_2nd_place", |
60 | | - "challenge_3rd_place", |
61 | | - "gig_completion", |
62 | | - ], |
63 | | - ], |
64 | | - ), |
65 | | - this.db.query<{ id: string }>( |
66 | | - `SELECT id::text FROM skills.source_type WHERE name = 'engagement'`, |
67 | | - [], |
68 | | - ), |
69 | | - ]); |
70 | | - this.winEventTypeIds = winRows.map((r) => r.id); |
71 | | - this.engagementSourceTypeId = engRows[0]?.id ?? ""; |
72 | | - } |
73 | | - |
74 | 48 | async search(dto: MemberSearchBodyDto): Promise<MemberSearchResponseDto> { |
75 | 49 | const { |
76 | 50 | skills, |
@@ -125,49 +99,23 @@ export class MemberSearchService implements OnModuleInit { |
125 | 99 | const pMinWins = p(minWins); |
126 | 100 | const pSearchType = p(skillSearchType); |
127 | 101 | const pNumSkills = p(deduped.length); |
128 | | - const pWinTypeIds = p(this.winEventTypeIds); |
129 | | - const pEngSourceId = p(this.engagementSourceTypeId); |
130 | 102 |
|
131 | 103 | ctes.push(`requested_skills AS ( |
132 | 104 | SELECT rs.skill_id, rs.min_wins |
133 | 105 | FROM unnest(${pSkillIds}::uuid[], ${pMinWins}::integer[]) |
134 | 106 | AS rs(skill_id, min_wins) |
135 | 107 | ), |
136 | | -skill_event_stats AS ( |
137 | | - SELECT |
138 | | - se.user_id, |
139 | | - se.skill_id, |
140 | | - COUNT(*) FILTER ( |
141 | | - WHERE se.skill_event_type_id = ANY(${pWinTypeIds}::uuid[]) |
142 | | - OR se.source_type_id = ${pEngSourceId}::uuid |
143 | | - ) AS wins, |
144 | | - COUNT(*) AS submitted |
145 | | - FROM skills.skill_event se |
146 | | - WHERE se.skill_id = ANY(${pSkillIds}::uuid[]) |
147 | | - AND se.user_id IN (SELECT user_id FROM active_members) |
148 | | - GROUP BY se.user_id, se.skill_id |
149 | | -), |
150 | | -deduped_user_skills AS ( |
151 | | - SELECT DISTINCT |
152 | | - us.user_id, |
153 | | - us.skill_id |
154 | | - FROM skills.user_skill us |
155 | | - WHERE us.skill_id = ANY(${pSkillIds}::uuid[]) |
156 | | - AND us.user_id IN (SELECT user_id FROM active_members) |
157 | | -), |
158 | 108 | user_skill_data AS ( |
159 | 109 | SELECT |
160 | | - us.user_id, |
161 | | - us.skill_id, |
162 | | - sk.name AS skill_name, |
163 | | - COALESCE(ses.wins, 0) AS wins, |
164 | | - COALESCE(ses.submitted, 0) AS submitted |
165 | | - FROM deduped_user_skills us |
166 | | - JOIN requested_skills rs ON rs.skill_id = us.skill_id |
167 | | - JOIN skills.skill sk ON sk.id = us.skill_id AND sk.deleted_at IS NULL |
168 | | - LEFT JOIN skill_event_stats ses |
169 | | - ON ses.user_id = us.user_id |
170 | | - AND ses.skill_id = us.skill_id |
| 110 | + usws.user_id, |
| 111 | + usws.skill_id, |
| 112 | + sk.name AS skill_name, |
| 113 | + usws.wins, |
| 114 | + usws.submitted |
| 115 | + FROM skills.user_skill_win_summary usws |
| 116 | + JOIN requested_skills rs ON rs.skill_id = usws.skill_id |
| 117 | + JOIN skills.skill sk ON sk.id = usws.skill_id AND sk.deleted_at IS NULL |
| 118 | + WHERE usws.user_id IN (SELECT user_id FROM active_members) |
171 | 119 | ), |
172 | 120 | qualifying_users AS ( |
173 | 121 | SELECT usd.user_id |
@@ -289,10 +237,13 @@ member_address AS ( |
289 | 237 | } |
290 | 238 |
|
291 | 239 | const whereClause = where.join(" AND "); |
| 240 | + const skillJoin = deduped.length > 0 |
| 241 | + ? `INNER JOIN user_match_data umd ON umd.user_id = m."userId"` |
| 242 | + : ``; |
292 | 243 | ctes.push(`filtered_members AS ( |
293 | 244 | SELECT m."userId" AS user_id |
294 | 245 | FROM members.member m |
295 | | - INNER JOIN user_match_data umd ON umd.user_id = m."userId" |
| 246 | + ${skillJoin} |
296 | 247 | WHERE ${whereClause} |
297 | 248 | )`); |
298 | 249 |
|
|
0 commit comments