Skip to content

Commit 3c08613

Browse files
committed
Only show verified skills in results
1 parent 7c70fdd commit 3c08613

3 files changed

Lines changed: 27 additions & 24 deletions

File tree

src/reports/member/dto/member-search-response.dto.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ export class MatchedSkillDto {
99

1010
@ApiProperty({
1111
description:
12-
"True when the member has win credit and/or at least one platform skill event for this skill (e.g. submission, review); false for self-declared only.",
12+
"True for platform-backed skill activity (wins and/or skill events). Matched skills only include these, not self-attested-only skills.",
1313
})
1414
isVerified!: boolean;
1515

src/reports/member/member-search.service.spec.ts

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,6 @@ describe("MemberSearchService", () => {
142142
expect(dataSql).not.toContain(
143143
'EXISTS (SELECT 1 FROM recently_active ra WHERE ra.user_id = m."userId")',
144144
);
145-
expect(dataSql).not.toContain("COALESCE(m.verified, false) = true");
146145
});
147146

148147
it("adds profileComplete CTE/join only when enabled and keeps count params free of pagination", async () => {
@@ -226,13 +225,11 @@ describe("MemberSearchService", () => {
226225
expect(validationParams).toEqual([[skillA, skillB]]);
227226

228227
expect(dataSql).toContain("requested_skills AS");
229-
expect(dataSql).toContain(
230-
"(usd.wins >= rs.min_wins OR usd.submitted > 0)",
231-
);
228+
expect(dataSql).toContain("FILTER (WHERE usd.wins > 0 OR usd.submitted > 0)");
232229
expect(dataSql).toContain("INNER JOIN user_match_data umd");
233-
expect(dataSql).toContain("THEN COUNT(DISTINCT usd.skill_id) =");
234-
expect(dataSql).toContain("ELSE COUNT(DISTINCT usd.skill_id) >= 1");
235-
expect(dataSql).not.toContain("usd.wins >= rs.min_wins");
230+
expect(dataSql).toContain("THEN COUNT(DISTINCT CASE");
231+
expect(dataSql).toContain("ELSE COUNT(DISTINCT CASE");
232+
expect(dataSql).toContain("(usd.wins >= rs.min_wins OR usd.submitted > 0)");
236233
expect(dataParams).toContainEqual([skillA, skillB]);
237234
expect(dataParams).toContainEqual([5, 0]);
238235
expect(dataParams).toContain("AND");

src/reports/member/member-search.service.ts

Lines changed: 22 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -153,23 +153,29 @@ qualifying_users AS (
153153
user_match_data AS (
154154
SELECT
155155
usd.user_id,
156-
SUM(
157-
1.0
158-
+ LEAST(usd.wins::float / 100.0, 0.5)
159-
+ CASE WHEN usd.submitted > 0
160-
THEN (usd.wins::float / usd.submitted::float) * 0.5
161-
ELSE 0.0
162-
END
156+
COALESCE(
157+
SUM(
158+
1.0
159+
+ LEAST(usd.wins::float / 100.0, 0.5)
160+
+ CASE WHEN usd.submitted > 0
161+
THEN (usd.wins::float / usd.submitted::float) * 0.5
162+
ELSE 0.0
163+
END
164+
) FILTER (WHERE usd.wins > 0 OR usd.submitted > 0),
165+
0.0
163166
) AS total_skill_points,
164-
jsonb_agg(
165-
jsonb_build_object(
166-
'id', usd.skill_id::text,
167-
'name', usd.skill_name,
168-
'isVerified', (usd.wins > 0 OR usd.submitted > 0),
169-
'wins', usd.wins,
170-
'submitted', usd.submitted
171-
)
172-
ORDER BY usd.skill_name
167+
COALESCE(
168+
jsonb_agg(
169+
jsonb_build_object(
170+
'id', usd.skill_id::text,
171+
'name', usd.skill_name,
172+
'isVerified', (usd.wins > 0 OR usd.submitted > 0),
173+
'wins', usd.wins,
174+
'submitted', usd.submitted
175+
)
176+
ORDER BY usd.skill_name
177+
) FILTER (WHERE usd.wins > 0 OR usd.submitted > 0),
178+
'[]'::jsonb
173179
) AS matched_skills
174180
FROM user_skill_data usd
175181
WHERE usd.user_id IN (SELECT user_id FROM qualifying_users)

0 commit comments

Comments
 (0)