@@ -21,7 +21,7 @@ use diesel::{
2121} ;
2222use rebuilderd_common:: api:: v1:: {
2323 BuildStatus , FreshnessFilter , IdentityFilter , OriginFilter , PackageReport , Page , ResultPage ,
24- SourcePackageReport ,
24+ SourcePackageReport , StatusFilter ,
2525} ;
2626use rebuilderd_common:: errors:: Error ;
2727
@@ -412,10 +412,11 @@ pub async fn get_source_packages(
412412 origin_filter : web:: Query < OriginFilter > ,
413413 identity_filter : web:: Query < IdentityFilter > ,
414414 freshness_filter : web:: Query < FreshnessFilter > ,
415+ status_filter : web:: Query < StatusFilter > ,
415416) -> web:: Result < impl Responder > {
416417 let mut connection = pool. get ( ) . map_err ( Error :: from) ?;
417418
418- let records = source_packages_base ( )
419+ let mut query = source_packages_base ( )
419420 . filter (
420421 origin_filter
421422 . clone ( )
@@ -429,11 +430,26 @@ pub async fn get_source_packages(
429430 . into_filter ( source_packages:: name, source_packages:: version) ,
430431 )
431432 . filter ( freshness_filter. clone ( ) . into_inner ( ) . into_filter ( ) )
433+ . into_boxed ( ) ;
434+
435+ // Apply status filter if provided
436+ if let Some ( ref statuses) = status_filter. status {
437+ if !statuses. is_empty ( ) {
438+ let status_values: Vec < String > = statuses. iter ( ) . map ( |s| s. to_uppercase ( ) ) . collect ( ) ;
439+ query = query. filter (
440+ r1. field ( rebuilds:: status) . is_not_null ( ) . and (
441+ r1. field ( rebuilds:: status) . assume_not_null ( ) . eq_any ( status_values)
442+ )
443+ ) ;
444+ }
445+ }
446+
447+ let records = query
432448 . paginate ( page. into_inner ( ) )
433449 . load :: < rebuilderd_common:: api:: v1:: SourcePackage > ( connection. as_mut ( ) )
434450 . map_err ( Error :: from) ?;
435451
436- let total = source_packages_base ( )
452+ let mut count_query = source_packages_base ( )
437453 . filter (
438454 origin_filter
439455 . clone ( )
@@ -447,6 +463,21 @@ pub async fn get_source_packages(
447463 . into_filter ( source_packages:: name, source_packages:: version) ,
448464 )
449465 . filter ( freshness_filter. into_inner ( ) . into_filter ( ) )
466+ . into_boxed ( ) ;
467+
468+ // Apply status filter to count query
469+ if let Some ( ref statuses) = status_filter. status {
470+ if !statuses. is_empty ( ) {
471+ let status_values: Vec < String > = statuses. iter ( ) . map ( |s| s. to_uppercase ( ) ) . collect ( ) ;
472+ count_query = count_query. filter (
473+ r1. field ( rebuilds:: status) . is_not_null ( ) . and (
474+ r1. field ( rebuilds:: status) . assume_not_null ( ) . eq_any ( status_values)
475+ )
476+ ) ;
477+ }
478+ }
479+
480+ let total = count_query
450481 . count ( )
451482 . get_result :: < i64 > ( connection. as_mut ( ) )
452483 . map_err ( Error :: from) ?;
@@ -480,10 +511,11 @@ pub async fn get_binary_packages(
480511 origin_filter : web:: Query < OriginFilter > ,
481512 identity_filter : web:: Query < IdentityFilter > ,
482513 freshness_filter : web:: Query < FreshnessFilter > ,
514+ status_filter : web:: Query < StatusFilter > ,
483515) -> web:: Result < impl Responder > {
484516 let mut connection = pool. get ( ) . map_err ( Error :: from) ?;
485517
486- let records = binary_packages_base ( )
518+ let mut query = binary_packages_base ( )
487519 . filter (
488520 origin_filter
489521 . clone ( )
@@ -497,11 +529,26 @@ pub async fn get_binary_packages(
497529 . into_filter ( binary_packages:: name, binary_packages:: version) ,
498530 )
499531 . filter ( freshness_filter. clone ( ) . into_inner ( ) . into_filter ( ) )
532+ . into_boxed ( ) ;
533+
534+ // Apply status filter if provided
535+ if let Some ( ref statuses) = status_filter. status {
536+ if !statuses. is_empty ( ) {
537+ let status_values: Vec < String > = statuses. iter ( ) . map ( |s| s. to_uppercase ( ) ) . collect ( ) ;
538+ query = query. filter (
539+ rebuild_artifacts:: status. is_not_null ( ) . and (
540+ rebuild_artifacts:: status. assume_not_null ( ) . eq_any ( status_values)
541+ )
542+ ) ;
543+ }
544+ }
545+
546+ let records = query
500547 . paginate ( page. into_inner ( ) )
501548 . load :: < rebuilderd_common:: api:: v1:: BinaryPackage > ( connection. as_mut ( ) )
502549 . map_err ( Error :: from) ?;
503550
504- let total = binary_packages_base ( )
551+ let mut count_query = binary_packages_base ( )
505552 . filter (
506553 origin_filter
507554 . clone ( )
@@ -515,6 +562,21 @@ pub async fn get_binary_packages(
515562 . into_inner ( )
516563 . into_filter ( binary_packages:: name, binary_packages:: version) ,
517564 )
565+ . into_boxed ( ) ;
566+
567+ // Apply status filter to count query
568+ if let Some ( ref statuses) = status_filter. status {
569+ if !statuses. is_empty ( ) {
570+ let status_values: Vec < String > = statuses. iter ( ) . map ( |s| s. to_uppercase ( ) ) . collect ( ) ;
571+ count_query = count_query. filter (
572+ rebuild_artifacts:: status. is_not_null ( ) . and (
573+ rebuild_artifacts:: status. assume_not_null ( ) . eq_any ( status_values)
574+ )
575+ ) ;
576+ }
577+ }
578+
579+ let total = count_query
518580 . count ( )
519581 . get_result :: < i64 > ( connection. as_mut ( ) )
520582 . map_err ( Error :: from) ?;
0 commit comments