@@ -69,6 +69,8 @@ impl ToJson for Release {
69
69
enum Order {
70
70
ReleaseTime , // this is default order
71
71
GithubStars ,
72
+ RecentFailures ,
73
+ FailuresByGithubStars ,
72
74
}
73
75
74
76
@@ -105,6 +107,34 @@ fn get_releases(conn: &Connection, page: i64, limit: i64, order: Order) -> Vec<R
105
107
ORDER BY crates.github_stars DESC
106
108
LIMIT $1 OFFSET $2"
107
109
}
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
+ }
108
138
} ;
109
139
110
140
let mut packages = Vec :: new ( ) ;
@@ -300,13 +330,11 @@ pub fn releases_feed_handler(req: &mut Request) -> IronResult<Response> {
300
330
}
301
331
302
332
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 > {
310
338
if packages. is_empty ( ) {
311
339
return Err ( IronError :: new ( Nope :: CrateNotFound , status:: NotFound ) ) ;
312
340
}
@@ -318,10 +346,10 @@ pub fn releases_handler(req: &mut Request) -> IronResult<Response> {
318
346
319
347
Page :: new ( packages)
320
348
. title ( "Releases" )
321
- . set ( "description" , "Recently uploaded crates" )
322
- . set ( "release_type" , "recent" )
349
+ . set ( "description" , title )
350
+ . set ( "release_type" , release_type )
323
351
. set_true ( "show_releases_navigation" )
324
- . set_true ( "releases_navigation_recent_tab" )
352
+ . set_true ( tab )
325
353
. set_bool ( "show_next_page_button" , show_next_page)
326
354
. set_int ( "next_page" , page_number + 1 )
327
355
. set_bool ( "show_previous_page_button" , show_previous_page)
@@ -330,35 +358,36 @@ pub fn releases_handler(req: &mut Request) -> IronResult<Response> {
330
358
}
331
359
332
360
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 > {
336
363
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
+ }
337
368
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 ) ;
338
372
let conn = extension ! ( req, Pool ) ;
339
373
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
+ }
340
376
341
- if packages. is_empty ( ) {
342
- return Err ( IronError :: new ( Nope :: CrateNotFound , status:: NotFound ) ) ;
343
- }
344
377
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
+ }
349
384
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" )
362
391
}
363
392
364
393
0 commit comments