Skip to content

Commit 62fdb18

Browse files
committed
Query for published_by for multiple versions where needed
1 parent b9d15df commit 62fdb18

File tree

2 files changed

+48
-11
lines changed

2 files changed

+48
-11
lines changed

src/controllers/krate/metadata.rs

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -107,9 +107,13 @@ pub fn show(req: &mut dyn Request) -> CargoResult<Response> {
107107
let conn = req.db_conn()?;
108108
let krate = Crate::by_name(name).first::<Crate>(&*conn)?;
109109

110-
let mut versions = krate.all_versions().load::<Version>(&*conn)?;
111-
versions.sort_by(|a, b| b.num.cmp(&a.num));
112-
let ids = versions.iter().map(|v| v.id).collect();
110+
let mut versions_and_publishers: Vec<(Version, Option<User>)> = krate
111+
.all_versions()
112+
.left_outer_join(users::table)
113+
.select((versions::all_columns, users::all_columns.nullable()))
114+
.load(&*conn)?;
115+
versions_and_publishers.sort_by(|a, b| b.0.num.cmp(&a.0.num));
116+
let ids = versions_and_publishers.iter().map(|v| v.0.id).collect();
113117

114118
let kws = CrateKeyword::belonging_to(&krate)
115119
.inner_join(keywords::table)
@@ -147,9 +151,9 @@ pub fn show(req: &mut dyn Request) -> CargoResult<Response> {
147151
false,
148152
recent_downloads,
149153
),
150-
versions: versions
154+
versions: versions_and_publishers
151155
.into_iter()
152-
.map(|v| v.encodable(&krate.name, None))
156+
.map(|(v, pb)| v.encodable(&krate.name, pb))
153157
.collect(),
154158
keywords: kws.into_iter().map(|k| k.encodable()).collect(),
155159
categories: cats.into_iter().map(|k| k.encodable()).collect(),
@@ -186,11 +190,15 @@ pub fn versions(req: &mut dyn Request) -> CargoResult<Response> {
186190
let crate_name = &req.params()["crate_id"];
187191
let conn = req.db_conn()?;
188192
let krate = Crate::by_name(crate_name).first::<Crate>(&*conn)?;
189-
let mut versions = krate.all_versions().load::<Version>(&*conn)?;
190-
versions.sort_by(|a, b| b.num.cmp(&a.num));
191-
let versions = versions
193+
let mut versions_and_publishers: Vec<(Version, Option<User>)> = krate
194+
.all_versions()
195+
.left_outer_join(users::table)
196+
.select((versions::all_columns, users::all_columns.nullable()))
197+
.load(&*conn)?;
198+
versions_and_publishers.sort_by(|a, b| b.0.num.cmp(&a.0.num));
199+
let versions = versions_and_publishers
192200
.into_iter()
193-
.map(|v| v.encodable(crate_name, None))
201+
.map(|(v, pb)| v.encodable(crate_name, pb))
194202
.collect();
195203

196204
#[derive(Serialize)]

src/tests/krate.rs

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -420,7 +420,7 @@ fn show() {
420420
let user = user.as_model();
421421

422422
let krate = app.db(|conn| {
423-
CrateBuilder::new("foo_show", user.id)
423+
let krate = CrateBuilder::new("foo_show", user.id)
424424
.description("description")
425425
.documentation("https://example.com")
426426
.homepage("http://example.com")
@@ -430,7 +430,18 @@ fn show() {
430430
.keyword("kw1")
431431
.downloads(20)
432432
.recent_downloads(10)
433-
.expect_build(conn)
433+
.expect_build(conn);
434+
435+
// Make version 1.0.0 mimic a version published before we started recording who published
436+
// versions
437+
let none: Option<i32> = None;
438+
update(versions::table)
439+
.filter(versions::num.eq("1.0.0"))
440+
.set(versions::published_by.eq(none))
441+
.execute(conn)
442+
.unwrap();
443+
444+
krate
434445
});
435446

436447
let json = anon.show_crate("foo_show");
@@ -448,6 +459,7 @@ fn show() {
448459
assert_eq!(json.versions[0].id, versions[0]);
449460
assert_eq!(json.versions[0].krate, json.krate.id);
450461
assert_eq!(json.versions[0].num, "1.0.0");
462+
assert!(json.versions[0].published_by.is_none());
451463
let suffix = "/api/v1/crates/foo_show/1.0.0/download";
452464
assert!(
453465
json.versions[0].dl_path.ends_with(suffix),
@@ -459,6 +471,10 @@ fn show() {
459471

460472
assert_eq!(json.versions[1].num, "0.5.1");
461473
assert_eq!(json.versions[2].num, "0.5.0");
474+
assert_eq!(
475+
json.versions[1].published_by.as_ref().unwrap().login,
476+
user.gh_login
477+
);
462478
}
463479

464480
#[test]
@@ -489,6 +505,14 @@ fn versions() {
489505
.version("1.0.0")
490506
.version("0.5.0")
491507
.expect_build(conn);
508+
// Make version 1.0.0 mimic a version published before we started recording who published
509+
// versions
510+
let none: Option<i32> = None;
511+
update(versions::table)
512+
.filter(versions::num.eq("1.0.0"))
513+
.set(versions::published_by.eq(none))
514+
.execute(conn)
515+
.unwrap();
492516
});
493517

494518
let json: VersionsList = anon.get("/api/v1/crates/foo_versions/versions").good();
@@ -497,6 +521,11 @@ fn versions() {
497521
assert_eq!(json.versions[0].num, "1.0.0");
498522
assert_eq!(json.versions[1].num, "0.5.1");
499523
assert_eq!(json.versions[2].num, "0.5.0");
524+
assert!(json.versions[0].published_by.is_none());
525+
assert_eq!(
526+
json.versions[1].published_by.as_ref().unwrap().login,
527+
user.gh_login
528+
);
500529
}
501530

502531
#[test]

0 commit comments

Comments
 (0)