@@ -5,9 +5,27 @@ use iron::{
5
5
mime:: { Mime , SubLevel , TopLevel } ,
6
6
IronResult , Request , Response ,
7
7
} ;
8
+ use router:: Router ;
8
9
use serde:: Serialize ;
9
10
use serde_json:: Value ;
10
11
12
+ /// sitemap index
13
+ #[ derive( Debug , Clone , PartialEq , Eq , Serialize ) ]
14
+ struct SitemapIndexXml {
15
+ sitemaps : Vec < char > ,
16
+ }
17
+
18
+ impl_webpage ! {
19
+ SitemapIndexXml = "core/sitemapindex.xml" ,
20
+ content_type = ContentType ( Mime ( TopLevel :: Application , SubLevel :: Xml , vec![ ] ) ) ,
21
+ }
22
+
23
+ pub fn sitemapindex_handler ( req : & mut Request ) -> IronResult < Response > {
24
+ let sitemaps: Vec < char > = ( b'a' ..=b'z' ) . map ( char:: from) . collect ( ) ;
25
+
26
+ SitemapIndexXml { sitemaps } . into_response ( req)
27
+ }
28
+
11
29
/// The sitemap
12
30
#[ derive( Debug , Clone , PartialEq , Eq , Serialize ) ]
13
31
struct SitemapXml {
@@ -21,16 +39,30 @@ impl_webpage! {
21
39
}
22
40
23
41
pub fn sitemap_handler ( req : & mut Request ) -> IronResult < Response > {
42
+ let router = extension ! ( req, Router ) ;
43
+ let which = cexpect ! ( req, router. find( "which" ) ) . to_lowercase ( ) ;
44
+
24
45
let mut conn = extension ! ( req, Pool ) . get ( ) ?;
25
46
let query = conn
26
47
. query (
27
- "SELECT DISTINCT ON (crates.name)
28
- crates.name,
29
- releases.release_time
48
+ "SELECT crates.name,
49
+ MAX(releases.release_time) as release_time
30
50
FROM crates
31
51
INNER JOIN releases ON releases.crate_id = crates.id
32
- WHERE rustdoc_status = true" ,
33
- & [ ] ,
52
+ WHERE
53
+ rustdoc_status = true AND
54
+ (
55
+ crates.name like $1 OR
56
+ crates.name like $2
57
+ )
58
+ GROUP BY crates.name
59
+ " ,
60
+ & [
61
+ // this LIKE pattern has the '%' only at the end,
62
+ // so postgres can use the index on `name`
63
+ & format ! ( "{}%" , which) ,
64
+ & format ! ( "{}%" , which. to_uppercase( ) ) ,
65
+ ] ,
34
66
)
35
67
. unwrap ( ) ;
36
68
@@ -127,13 +159,15 @@ mod tests {
127
159
wrapper ( |env| {
128
160
let web = env. frontend ( ) ;
129
161
assert_success ( "/sitemap.xml" , web) ?;
162
+ assert_success ( "/-/sitemap/s/sitemap.xml" , web) ?;
130
163
131
164
env. fake_release ( ) . name ( "some_random_crate" ) . create ( ) ?;
132
165
env. fake_release ( )
133
166
. name ( "some_random_crate_that_failed" )
134
167
. build_result_successful ( false )
135
168
. create ( ) ?;
136
- assert_success ( "/sitemap.xml" , web)
169
+ assert_success ( "/sitemap.xml" , web) ?;
170
+ assert_success ( "/-/sitemap/s/sitemap.xml" , web)
137
171
} )
138
172
}
139
173
0 commit comments