@@ -73,6 +73,64 @@ pub struct ListReviewsParams {
7373 pub per_page : Option < usize > ,
7474}
7575
76+ #[ derive( Deserialize ) ]
77+ pub struct ListEventsParams {
78+ pub source : Option < String > ,
79+ pub model : Option < String > ,
80+ pub status : Option < String > ,
81+ }
82+
83+ use super :: state:: ReviewEvent ;
84+
85+ /// Returns all wide events from completed/failed reviews, sorted newest-first.
86+ pub async fn list_events (
87+ State ( state) : State < Arc < AppState > > ,
88+ Query ( params) : Query < ListEventsParams > ,
89+ ) -> Json < Vec < ReviewEvent > > {
90+ let reviews = state. reviews . read ( ) . await ;
91+ let mut events: Vec < ReviewEvent > = reviews
92+ . values ( )
93+ . filter_map ( |s| s. event . clone ( ) )
94+ . filter ( |e| {
95+ let source_ok = params
96+ . source
97+ . as_ref ( )
98+ . map_or ( true , |f| e. diff_source . eq_ignore_ascii_case ( f) ) ;
99+ let model_ok = params
100+ . model
101+ . as_ref ( )
102+ . map_or ( true , |f| e. model . eq_ignore_ascii_case ( f) ) ;
103+ let status_ok = params. status . as_ref ( ) . map_or ( true , |f| {
104+ e. event_type . eq_ignore_ascii_case ( & format ! ( "review.{}" , f) )
105+ } ) ;
106+ source_ok && model_ok && status_ok
107+ } )
108+ . collect ( ) ;
109+ events. sort_by ( |a, b| b. review_id . cmp ( & a. review_id ) ) ;
110+ events. sort_by ( |a, b| {
111+ b. duration_ms
112+ . cmp ( & a. duration_ms )
113+ . then ( b. review_id . cmp ( & a. review_id ) )
114+ } ) ;
115+ // Sort by review start time proxy: we use completed reviews ordering
116+ // Re-sort by the review order (newest first) using the review map ordering
117+ let id_order: std:: collections:: HashMap < String , usize > = {
118+ let mut ordered: Vec < _ > = reviews
119+ . values ( )
120+ . filter ( |s| s. event . is_some ( ) )
121+ . map ( |s| ( s. id . clone ( ) , s. started_at ) )
122+ . collect ( ) ;
123+ ordered. sort_by ( |a, b| b. 1 . cmp ( & a. 1 ) ) ;
124+ ordered
125+ . into_iter ( )
126+ . enumerate ( )
127+ . map ( |( i, ( id, _) ) | ( id, i) )
128+ . collect ( )
129+ } ;
130+ events. sort_by_key ( |e| id_order. get ( & e. review_id ) . copied ( ) . unwrap_or ( usize:: MAX ) ) ;
131+ Json ( events)
132+ }
133+
76134// === Handlers ===
77135
78136pub async fn get_status ( State ( state) : State < Arc < AppState > > ) -> Json < StatusResponse > {
0 commit comments