Skip to content

Commit 0db70a5

Browse files
author
Marco Napetti
committed
paginate versions api
1 parent 7f0e529 commit 0db70a5

File tree

1 file changed

+12
-3
lines changed

1 file changed

+12
-3
lines changed

src/controllers/krate/metadata.rs

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@ use std::cmp::Reverse;
88
use std::str::FromStr;
99

1010
use crate::controllers::frontend_prelude::*;
11-
use crate::controllers::helpers::pagination::PaginationOptions;
11+
use crate::controllers::helpers::pagination::{Paginated, PaginationOptions};
12+
use crate::controllers::helpers::Paginate;
1213

1314
use crate::models::{
1415
Category, Crate, CrateCategory, CrateKeyword, CrateVersions, Keyword, RecentCrateDownloads,
@@ -325,15 +326,20 @@ pub fn readme(req: &mut dyn RequestExt) -> EndpointResult {
325326
// FIXME: Not sure why this is necessary since /crates/:crate_id returns
326327
// this information already, but ember is definitely requesting it
327328
pub fn versions(req: &mut dyn RequestExt) -> EndpointResult {
329+
let pagination_options = PaginationOptions::builder().gather(req)?;
328330
let crate_name = &req.params()["crate_id"];
329331
let conn = req.db_read()?;
330332
let krate: Crate = Crate::by_name(crate_name).first(&*conn)?;
331-
let mut versions_and_publishers: Vec<(Version, Option<User>)> = krate
333+
let data: Paginated<(Version, Option<User>)> = krate
332334
.all_versions()
333335
.left_outer_join(users::table)
334336
.select((versions::all_columns, users::all_columns.nullable()))
337+
.order(versions::created_at.desc())
338+
.pages_pagination(pagination_options)
335339
.load(&*conn)?;
340+
let more = data.next_page_params().is_some();
336341

342+
let mut versions_and_publishers = data.into_iter().collect::<Vec<_>>();
337343
versions_and_publishers
338344
.sort_by_cached_key(|(version, _)| Reverse(semver::Version::parse(&version.num).ok()));
339345

@@ -348,7 +354,10 @@ pub fn versions(req: &mut dyn RequestExt) -> EndpointResult {
348354
.map(|((v, pb), aas)| EncodableVersion::from(v, crate_name, pb, aas))
349355
.collect::<Vec<_>>();
350356

351-
Ok(req.json(&json!({ "versions": versions })))
357+
Ok(req.json(&json!({
358+
"versions": versions,
359+
"meta": { "more": more },
360+
})))
352361
}
353362

354363
/// Handles the `GET /crates/:crate_id/reverse_dependencies` route.

0 commit comments

Comments
 (0)