Skip to content

Commit 09a29ce

Browse files
eth3lbertTurbo87
authored andcommitted
Move krate::metadata::versions to krate:versions::versions
Prepare for implementing pagination support for the versions endpoint.
1 parent 5a5b2ab commit 09a29ce

File tree

4 files changed

+49
-38
lines changed

4 files changed

+49
-38
lines changed

src/controllers/krate.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,4 @@ pub mod metadata;
44
pub mod owners;
55
pub mod publish;
66
pub mod search;
7+
pub mod versions;

src/controllers/krate/metadata.rs

Lines changed: 0 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -328,43 +328,6 @@ pub async fn readme(
328328
}
329329
}
330330

331-
/// Handles the `GET /crates/:crate_id/versions` route.
332-
// FIXME: Not sure why this is necessary since /crates/:crate_id returns
333-
// this information already, but ember is definitely requesting it
334-
pub async fn versions(state: AppState, Path(crate_name): Path<String>) -> AppResult<Json<Value>> {
335-
spawn_blocking(move || {
336-
let conn = &mut *state.db_read()?;
337-
338-
let krate: Crate = Crate::by_name(&crate_name)
339-
.first(conn)
340-
.optional()?
341-
.ok_or_else(|| crate_not_found(&crate_name))?;
342-
343-
let mut versions_and_publishers: Vec<(Version, Option<User>)> = krate
344-
.all_versions()
345-
.left_outer_join(users::table)
346-
.select((versions::all_columns, users::all_columns.nullable()))
347-
.load(conn)?;
348-
349-
versions_and_publishers
350-
.sort_by_cached_key(|(version, _)| Reverse(semver::Version::parse(&version.num).ok()));
351-
352-
let versions = versions_and_publishers
353-
.iter()
354-
.map(|(v, _)| v)
355-
.cloned()
356-
.collect::<Vec<_>>();
357-
let versions = versions_and_publishers
358-
.into_iter()
359-
.zip(VersionOwnerAction::for_versions(conn, &versions)?)
360-
.map(|((v, pb), aas)| EncodableVersion::from(v, &crate_name, pb, aas))
361-
.collect::<Vec<_>>();
362-
363-
Ok(Json(json!({ "versions": versions })))
364-
})
365-
.await
366-
}
367-
368331
/// Handles the `GET /crates/:crate_id/reverse_dependencies` route.
369332
pub async fn reverse_dependencies(
370333
app: AppState,

src/controllers/krate/versions.rs

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
//! Endpoint for versions of a crate
2+
3+
use std::cmp::Reverse;
4+
5+
use crate::controllers::frontend_prelude::*;
6+
7+
use crate::models::{Crate, CrateVersions, User, Version, VersionOwnerAction};
8+
use crate::schema::{users, versions};
9+
use crate::util::errors::crate_not_found;
10+
use crate::views::EncodableVersion;
11+
12+
/// Handles the `GET /crates/:crate_id/versions` route.
13+
// FIXME: Not sure why this is necessary since /crates/:crate_id returns
14+
// this information already, but ember is definitely requesting it
15+
pub async fn versions(state: AppState, Path(crate_name): Path<String>) -> AppResult<Json<Value>> {
16+
spawn_blocking(move || {
17+
let conn = &mut *state.db_read()?;
18+
19+
let krate: Crate = Crate::by_name(&crate_name)
20+
.first(conn)
21+
.optional()?
22+
.ok_or_else(|| crate_not_found(&crate_name))?;
23+
24+
let mut versions_and_publishers: Vec<(Version, Option<User>)> = krate
25+
.all_versions()
26+
.left_outer_join(users::table)
27+
.select((versions::all_columns, users::all_columns.nullable()))
28+
.load(conn)?;
29+
30+
versions_and_publishers
31+
.sort_by_cached_key(|(version, _)| Reverse(semver::Version::parse(&version.num).ok()));
32+
33+
let versions = versions_and_publishers
34+
.iter()
35+
.map(|(v, _)| v)
36+
.cloned()
37+
.collect::<Vec<_>>();
38+
let versions = versions_and_publishers
39+
.into_iter()
40+
.zip(VersionOwnerAction::for_versions(conn, &versions)?)
41+
.map(|((v, pb), aas)| EncodableVersion::from(v, &crate_name, pb, aas))
42+
.collect::<Vec<_>>();
43+
44+
Ok(Json(json!({ "versions": versions })))
45+
})
46+
.await
47+
}

src/router.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ pub fn build_axum_router(state: AppState) -> Router<()> {
6868
)
6969
.route(
7070
"/api/v1/crates/:crate_id/versions",
71-
get(krate::metadata::versions),
71+
get(krate::versions::versions),
7272
)
7373
.route(
7474
"/api/v1/crates/:crate_id/follow",

0 commit comments

Comments
 (0)