Skip to content

Commit a7e8b07

Browse files
Eh2406sgrif
authored andcommitted
use pagination for version downloads (#611)
* use pagination for version downloads * use before_date for version downloads * BETWEEN in sql * Add test for before_date for version downloads
1 parent 113ad2d commit a7e8b07

File tree

2 files changed

+24
-7
lines changed

2 files changed

+24
-7
lines changed

src/tests/krate.rs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -700,6 +700,7 @@ fn summary_doesnt_die() {
700700

701701
#[test]
702702
fn download() {
703+
use ::time::{Duration, now_utc, strftime};
703704
let (_b, app, middle) = ::app();
704705
let mut req = ::req(app, Method::Get, "/api/v1/crates/foo_download/1.0.0/download");
705706
::mock_user(&mut req, ::user("foo"));
@@ -720,6 +721,21 @@ fn download() {
720721
let mut resp = ok_resp!(middle.call(&mut req));
721722
let downloads = ::json::<Downloads>(&mut resp);
722723
assert_eq!(downloads.version_downloads.len(), 1);
724+
725+
let yesterday = now_utc() + Duration::days(-1);
726+
req.with_path("/api/v1/crates/FOO_DOWNLOAD/1.0.0/downloads");
727+
req.with_query(&("before_date=".to_string() + &strftime("%Y-%m-%d", &yesterday).unwrap()));
728+
let mut resp = ok_resp!(middle.call(&mut req));
729+
let downloads = ::json::<Downloads>(&mut resp);
730+
assert_eq!(downloads.version_downloads.len(), 0);
731+
732+
let tomorrow = now_utc() + Duration::days(1);
733+
req.with_path("/api/v1/crates/FOO_DOWNLOAD/1.0.0/downloads");
734+
req.with_query(&("before_date=".to_string() + &strftime("%Y-%m-%d", &tomorrow).unwrap()));
735+
let mut resp = ok_resp!(middle.call(&mut req));
736+
let downloads = ::json::<Downloads>(&mut resp);
737+
assert_eq!(downloads.version_downloads.len(), 1);
738+
723739
}
724740

725741
#[test]

src/version.rs

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,7 @@ use pg::GenericConnection;
66
use pg::rows::Row;
77
use rustc_serialize::json;
88
use semver;
9-
use time::Duration;
10-
use time::Timespec;
9+
use time::{Duration, Timespec, now_utc, strptime};
1110
use url;
1211

1312
use app::RequestApp;
@@ -339,15 +338,17 @@ pub fn dependencies(req: &mut Request) -> CargoResult<Response> {
339338
/// Handles the `GET /crates/:crate_id/:version/downloads` route.
340339
pub fn downloads(req: &mut Request) -> CargoResult<Response> {
341340
let (version, _) = version_and_crate(req)?;
341+
let cutoff_end_date = req.query().get("before_date")
342+
.and_then(|d| strptime(d, "%Y-%m-%d").ok())
343+
.unwrap_or(now_utc()).to_timespec();
344+
let cutoff_start_date = cutoff_end_date + Duration::days(-89);
342345

343346
let tx = req.tx()?;
344-
let cutoff_date = ::now() + Duration::days(-90);
345347
let stmt = tx.prepare("SELECT * FROM version_downloads
346-
WHERE date > $1 AND version_id = $2
348+
WHERE date BETWEEN $1 AND $2 AND version_id = $3
347349
ORDER BY date ASC")?;
348-
let downloads = stmt.query(&[&cutoff_date, &version.id])?.iter().map(|row| {
349-
VersionDownload::from_row(&row).encodable()
350-
}).collect();
350+
let downloads = stmt.query(&[&cutoff_start_date, &cutoff_end_date, &version.id])?
351+
.iter().map(|row| VersionDownload::from_row(&row).encodable()).collect();
351352

352353
#[derive(RustcEncodable)]
353354
struct R { version_downloads: Vec<EncodableVersionDownload> }

0 commit comments

Comments
 (0)