Skip to content

Commit 3b4bdef

Browse files
committed
Make a method to fetch the user the version was published by
And use it in places where there's only one version
1 parent 477c73c commit 3b4bdef

File tree

3 files changed

+55
-3
lines changed

3 files changed

+55
-3
lines changed

src/controllers/version/metadata.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,12 +68,14 @@ pub fn authors(req: &mut dyn Request) -> CargoResult<Response> {
6868
/// API route to have.
6969
pub fn show(req: &mut dyn Request) -> CargoResult<Response> {
7070
let (version, krate) = version_and_crate(req)?;
71+
let conn = req.db_conn()?;
72+
let published_by = version.published_by(&conn);
7173

7274
#[derive(Serialize)]
7375
struct R {
7476
version: EncodableVersion,
7577
}
7678
Ok(req.json(&R {
77-
version: version.encodable(&krate.name, None),
79+
version: version.encodable(&krate.name, published_by),
7880
}))
7981
}

src/models/version.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,15 @@ impl Version {
110110
.set(rendered_at.eq(now))
111111
.execute(conn)
112112
}
113+
114+
/// Gets the User who ran `cargo publish` for this version, if recorded.
115+
/// Not for use when you have a group of versions you need the publishers for.
116+
pub fn published_by(&self, conn: &PgConnection) -> Option<User> {
117+
match self.published_by {
118+
Some(pb) => users::table.find(pb).first(conn).ok(),
119+
None => None,
120+
}
121+
}
113122
}
114123

115124
impl NewVersion {

src/tests/version.rs

Lines changed: 43 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,12 +47,12 @@ fn index() {
4747
}
4848

4949
#[test]
50-
fn show() {
50+
fn show_by_id() {
5151
let (app, anon, user) = TestApp::init().with_user();
5252
let user = user.as_model();
5353

5454
let v = app.db(|conn| {
55-
let krate = CrateBuilder::new("foo_vers_show", user.id).expect_build(conn);
55+
let krate = CrateBuilder::new("foo_vers_show_id", user.id).expect_build(conn);
5656
VersionBuilder::new("2.0.0")
5757
.size(1234)
5858
.expect_build(krate.id, user.id, conn)
@@ -64,6 +64,47 @@ fn show() {
6464
assert_eq!(json.version.crate_size, Some(1234));
6565
}
6666

67+
#[test]
68+
fn show_by_crate_name_and_semver_with_published_by() {
69+
let (app, anon, user) = TestApp::init().with_user();
70+
let user = user.as_model();
71+
72+
let v = app.db(|conn| {
73+
let krate = CrateBuilder::new("foo_vers_show", user.id).expect_build(conn);
74+
VersionBuilder::new("2.0.0")
75+
.size(1234)
76+
.expect_build(krate.id, user.id, conn)
77+
});
78+
79+
let json: VersionResponse = anon.show_version("foo_vers_show", "2.0.0");
80+
assert_eq!(json.version.id, v.id);
81+
assert_eq!(json.version.crate_size, Some(1234));
82+
assert_eq!(json.version.published_by.unwrap().login, user.gh_login);
83+
}
84+
85+
#[test]
86+
fn show_by_crate_name_and_semver_no_published_by() {
87+
use diesel::update;
88+
89+
let (app, anon, user) = TestApp::init().with_user();
90+
let user = user.as_model();
91+
92+
app.db(|conn| {
93+
CrateBuilder::new("foo_vers_show_no_pb", user.id)
94+
.version("1.0.0")
95+
.expect_build(conn);
96+
// Mimic a version published before we started recording who published versions
97+
let none: Option<i32> = None;
98+
update(versions::table)
99+
.set(versions::published_by.eq(none))
100+
.execute(conn)
101+
.unwrap();
102+
});
103+
104+
let json: VersionResponse = anon.show_version("foo_vers_show_no_pb", "1.0.0");
105+
assert!(json.version.published_by.is_none());
106+
}
107+
67108
#[test]
68109
fn authors() {
69110
let (app, anon, user) = TestApp::init().with_user();

0 commit comments

Comments
 (0)