Skip to content

Commit ae54e94

Browse files
committed
fix: apply risk_level filter after resolving latest version
The risk_level filter was applied inside the CTE before DISTINCT ON, causing old versions to surface when their risk_level matched the filter even though the latest version had a different risk_level. Now the CTE resolves the latest version first, then risk_level is filtered on top, so only packages whose latest version matches appear.
1 parent 17a141a commit ae54e94

File tree

1 file changed

+12
-8
lines changed

1 file changed

+12
-8
lines changed

crates/common/src/db.rs

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -465,7 +465,6 @@ impl Database {
465465
SELECT DISTINCT ON (name, registry) *
466466
FROM packages
467467
WHERE ($3::text IS NULL OR registry = $3)
468-
AND ($4::text IS NULL OR risk_level = $4)
469468
ORDER BY name, registry, scanned_at DESC
470469
)
471470
SELECT
@@ -474,6 +473,7 @@ impl Database {
474473
COALESCE((SELECT COUNT(*) FROM package_cves WHERE package_id = p.id), 0) as cve_count,
475474
COALESCE((SELECT COUNT(*) FROM agentic_threats WHERE package_id = p.id AND verification_status = 'verified'), 0) as threat_count
476475
FROM latest p
476+
WHERE ($4::text IS NULL OR p.risk_level = $4)
477477
ORDER BY p.weekly_downloads DESC NULLS LAST, p.name ASC
478478
LIMIT $1 OFFSET $2
479479
"#,
@@ -488,10 +488,12 @@ impl Database {
488488
let total: (i64,) = sqlx::query_as(
489489
r#"
490490
SELECT COUNT(*) FROM (
491-
SELECT DISTINCT name, registry FROM packages
491+
SELECT DISTINCT ON (name, registry) id, name, registry, risk_level
492+
FROM packages
492493
WHERE ($1::text IS NULL OR registry = $1)
493-
AND ($2::text IS NULL OR risk_level = $2)
494-
) t
494+
ORDER BY name, registry, scanned_at DESC
495+
) latest
496+
WHERE ($2::text IS NULL OR latest.risk_level = $2)
495497
"#,
496498
)
497499
.bind(&registry_str)
@@ -522,7 +524,6 @@ impl Database {
522524
FROM packages
523525
WHERE name ILIKE $1
524526
AND ($5::text IS NULL OR registry = $5)
525-
AND ($6::text IS NULL OR risk_level = $6)
526527
ORDER BY name, registry, scanned_at DESC
527528
)
528529
SELECT
@@ -531,6 +532,7 @@ impl Database {
531532
COALESCE((SELECT COUNT(*) FROM package_cves WHERE package_id = p.id), 0) as cve_count,
532533
COALESCE((SELECT COUNT(*) FROM agentic_threats WHERE package_id = p.id AND verification_status = 'verified'), 0) as threat_count
533534
FROM latest p
535+
WHERE ($6::text IS NULL OR p.risk_level = $6)
534536
ORDER BY
535537
CASE
536538
WHEN LOWER(p.name) = LOWER($2) THEN 0
@@ -554,11 +556,13 @@ impl Database {
554556
let total: (i64,) = sqlx::query_as(
555557
r#"
556558
SELECT COUNT(*) FROM (
557-
SELECT DISTINCT name, registry FROM packages
559+
SELECT DISTINCT ON (name, registry) id, name, registry, risk_level
560+
FROM packages
558561
WHERE name ILIKE $1
559562
AND ($2::text IS NULL OR registry = $2)
560-
AND ($3::text IS NULL OR risk_level = $3)
561-
) t
563+
ORDER BY name, registry, scanned_at DESC
564+
) latest
565+
WHERE ($3::text IS NULL OR latest.risk_level = $3)
562566
"#,
563567
)
564568
.bind(&pattern)

0 commit comments

Comments
 (0)