Skip to content

use pagination for version downloads #611

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 4 commits into from
Mar 13, 2017
Merged
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 6 additions & 5 deletions src/version.rs
Original file line number Diff line number Diff line change
Expand Up @@ -300,16 +300,17 @@ pub fn dependencies(req: &mut Request) -> CargoResult<Response> {

/// Handles the `GET /crates/:crate_id/:version/downloads` route.
pub fn downloads(req: &mut Request) -> CargoResult<Response> {
let (offset, limit) = req.pagination(90, 100)?;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I wouldn't call this offset and limit, since it's not used for either offset or limit. Not sure it makes sense to permit the per_page param here either.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I did it to be consistent with the other uses. The advantage of per_page is the consistency with other endpoints. All in all, I am not strongly wedded to this solution.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not sure that the concept of a page makes as much sense here. Perhaps we should just have the parameter be called before_date, which takes the date directly, and only allow the 90 day interval.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That would make more seance. What is a good format for the date as url query fragment? And, how do we parce it into a type for the sql query?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

YYYY-MM-DD. I'd just pass it directly as a bind param into the query if Rust postgres lets us. If not, strptime it up

let (version, _) = version_and_crate(req)?;

let tx = req.tx()?;
let cutoff_date = ::now() + Duration::days(-90);
let cutoff_end_date = ::now() + Duration::days(-offset);
let cutoff_start_date = cutoff_end_date + Duration::days(-limit);
let stmt = tx.prepare("SELECT * FROM version_downloads
WHERE date > $1 AND version_id = $2
WHERE date > $1 AND date <= $2 AND version_id = $3
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What do you think about doing WHERE date BETWEEN $1 AND $2 instead?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Love it, I will make that change at the next opportunity!

ORDER BY date ASC")?;
let downloads = stmt.query(&[&cutoff_date, &version.id])?.iter().map(|row| {
VersionDownload::from_row(&row).encodable()
}).collect();
let downloads = stmt.query(&[&cutoff_start_date, &cutoff_end_date, &version.id])?
.iter().map(|row| { VersionDownload::from_row(&row).encodable() }).collect();

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