@@ -69,6 +69,8 @@ impl ToJson for Release {
6969enum Order {
7070 ReleaseTime , // this is default order
7171 GithubStars ,
72+ RecentFailures ,
73+ FailuresByGithubStars ,
7274}
7375
7476
@@ -105,6 +107,34 @@ fn get_releases(conn: &Connection, page: i64, limit: i64, order: Order) -> Vec<R
105107 ORDER BY crates.github_stars DESC
106108 LIMIT $1 OFFSET $2"
107109 }
110+ Order :: RecentFailures => {
111+ "SELECT crates.name,
112+ releases.version,
113+ releases.description,
114+ releases.target_name,
115+ releases.release_time,
116+ releases.rustdoc_status,
117+ crates.github_stars
118+ FROM crates
119+ INNER JOIN releases ON crates.id = releases.crate_id
120+ WHERE releases.build_status = FALSE AND releases.is_library = TRUE
121+ ORDER BY releases.release_time DESC
122+ LIMIT $1 OFFSET $2"
123+ }
124+ Order :: FailuresByGithubStars => {
125+ "SELECT crates.name,
126+ releases.version,
127+ releases.description,
128+ releases.target_name,
129+ releases.release_time,
130+ releases.rustdoc_status,
131+ crates.github_stars
132+ FROM crates
133+ INNER JOIN releases ON releases.id = crates.latest_version_id
134+ WHERE releases.build_status = FALSE AND releases.is_library = TRUE
135+ ORDER BY crates.github_stars DESC
136+ LIMIT $1 OFFSET $2"
137+ }
108138 } ;
109139
110140 let mut packages = Vec :: new ( ) ;
@@ -300,13 +330,11 @@ pub fn releases_feed_handler(req: &mut Request) -> IronResult<Response> {
300330}
301331
302332
303- pub fn releases_handler ( req : & mut Request ) -> IronResult < Response > {
304- // page number of releases
305- let page_number: i64 = extension ! ( req, Router ) . find ( "page" ) . unwrap_or ( "1" ) . parse ( ) . unwrap_or ( 1 ) ;
306-
307- let conn = extension ! ( req, Pool ) ;
308- let packages = get_releases ( conn, page_number, RELEASES_IN_RELEASES , Order :: ReleaseTime ) ;
309-
333+ pub fn releases_handler ( packages : Vec < Release > ,
334+ page_number : i64 ,
335+ release_type : & str ,
336+ tab : & str ,
337+ title : & str ) -> IronResult < Response > {
310338 if packages. is_empty ( ) {
311339 return Err ( IronError :: new ( Nope :: CrateNotFound , status:: NotFound ) ) ;
312340 }
@@ -318,10 +346,10 @@ pub fn releases_handler(req: &mut Request) -> IronResult<Response> {
318346
319347 Page :: new ( packages)
320348 . title ( "Releases" )
321- . set ( "description" , "Recently uploaded crates" )
322- . set ( "release_type" , "recent" )
349+ . set ( "description" , title )
350+ . set ( "release_type" , release_type )
323351 . set_true ( "show_releases_navigation" )
324- . set_true ( "releases_navigation_recent_tab" )
352+ . set_true ( tab )
325353 . set_bool ( "show_next_page_button" , show_next_page)
326354 . set_int ( "next_page" , page_number + 1 )
327355 . set_bool ( "show_previous_page_button" , show_previous_page)
@@ -330,35 +358,36 @@ pub fn releases_handler(req: &mut Request) -> IronResult<Response> {
330358}
331359
332360
333- // TODO: This function is almost identical to previous one
334- pub fn stars_handler ( req : & mut Request ) -> IronResult < Response > {
335- // page number of releases
361+ // Following functions caused a code repeat due to design of our /releases/ URL routes
362+ pub fn recent_releases_handler ( req : & mut Request ) -> IronResult < Response > {
336363 let page_number: i64 = extension ! ( req, Router ) . find ( "page" ) . unwrap_or ( "1" ) . parse ( ) . unwrap_or ( 1 ) ;
364+ let conn = extension ! ( req, Pool ) ;
365+ let packages = get_releases ( conn, page_number, RELEASES_IN_RELEASES , Order :: ReleaseTime ) ;
366+ releases_handler ( packages, page_number, "recent" , "releases_navigation_recent_tab" , "Recently uploaded crates" )
367+ }
337368
369+
370+ pub fn releases_by_stars_handler ( req : & mut Request ) -> IronResult < Response > {
371+ let page_number: i64 = extension ! ( req, Router ) . find ( "page" ) . unwrap_or ( "1" ) . parse ( ) . unwrap_or ( 1 ) ;
338372 let conn = extension ! ( req, Pool ) ;
339373 let packages = get_releases ( conn, page_number, RELEASES_IN_RELEASES , Order :: GithubStars ) ;
374+ releases_handler ( packages, page_number, "stars" , "releases_navigation_stars_tab" , "Crates with most stars" )
375+ }
340376
341- if packages. is_empty ( ) {
342- return Err ( IronError :: new ( Nope :: CrateNotFound , status:: NotFound ) ) ;
343- }
344377
345- // Show next and previous page buttons
346- // This is a temporary solution to avoid expensive COUNT(*)
347- let ( show_next_page, show_previous_page) = ( packages. len ( ) == RELEASES_IN_RELEASES as usize ,
348- page_number != 1 ) ;
378+ pub fn releases_recent_failures_handler ( req : & mut Request ) -> IronResult < Response > {
379+ let page_number: i64 = extension ! ( req, Router ) . find ( "page" ) . unwrap_or ( "1" ) . parse ( ) . unwrap_or ( 1 ) ;
380+ let conn = extension ! ( req, Pool ) ;
381+ let packages = get_releases ( conn, page_number, RELEASES_IN_RELEASES , Order :: RecentFailures ) ;
382+ releases_handler ( packages, page_number, "recent-failures" , "releases_navigation_recent_failures_tab" , "Recent crates failed to build" )
383+ }
349384
350- Page :: new ( packages)
351- . title ( "Releases" )
352- . set ( "description" , "Most starred crates" )
353- . set ( "release_type" , "stars" )
354- . set_true ( "show_releases_navigation" )
355- . set_true ( "releases_navigation_stars_tab" )
356- . set_true ( "show_stars" )
357- . set_bool ( "show_next_page_button" , show_next_page)
358- . set_int ( "next_page" , page_number + 1 )
359- . set_bool ( "show_previous_page_button" , show_previous_page)
360- . set_int ( "previous_page" , page_number - 1 )
361- . to_resp ( "releases" )
385+
386+ pub fn releases_failures_by_stars_handler ( req : & mut Request ) -> IronResult < Response > {
387+ let page_number: i64 = extension ! ( req, Router ) . find ( "page" ) . unwrap_or ( "1" ) . parse ( ) . unwrap_or ( 1 ) ;
388+ let conn = extension ! ( req, Pool ) ;
389+ let packages = get_releases ( conn, page_number, RELEASES_IN_RELEASES , Order :: FailuresByGithubStars ) ;
390+ releases_handler ( packages, page_number, "failures" , "releases_navigation_failures_by_stars_tab" , "Crates with most stars failed to build" )
362391}
363392
364393
0 commit comments