Skip to content

Commit b9d15df

Browse files
committed
Query for published_by with queries for version and crate
When we need published_by
1 parent 3b4bdef commit b9d15df

File tree

5 files changed

+105
-15
lines changed

5 files changed

+105
-15
lines changed

src/controllers/krate/metadata.rs

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@
66
77
use crate::controllers::prelude::*;
88
use crate::models::{
9-
Category, Crate, CrateCategory, CrateDownload, CrateKeyword, CrateVersions, Keyword, Version,
9+
Category, Crate, CrateCategory, CrateDownload, CrateKeyword, CrateVersions, Keyword, User,
10+
Version,
1011
};
1112
use crate::schema::*;
1213
use crate::views::{
@@ -218,10 +219,15 @@ pub fn reverse_dependencies(req: &mut dyn Request) -> CargoResult<Response> {
218219
let versions = versions::table
219220
.filter(versions::id.eq(any(version_ids)))
220221
.inner_join(crates::table)
221-
.select((versions::all_columns, crates::name))
222-
.load::<(Version, String)>(&*conn)?
222+
.left_outer_join(users::table)
223+
.select((
224+
versions::all_columns,
225+
crates::name,
226+
users::all_columns.nullable(),
227+
))
228+
.load::<(Version, String, Option<User>)>(&*conn)?
223229
.into_iter()
224-
.map(|(version, krate_name)| version.encodable(&krate_name, None))
230+
.map(|(version, krate_name, published_by)| version.encodable(&krate_name, published_by))
225231
.collect();
226232

227233
#[derive(Serialize)]

src/controllers/user/me.rs

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -55,11 +55,16 @@ pub fn updates(req: &mut dyn Request) -> CargoResult<Response> {
5555
let followed_crates = Follow::belonging_to(user).select(follows::crate_id);
5656
let data = versions::table
5757
.inner_join(crates::table)
58+
.left_outer_join(users::table)
5859
.filter(crates::id.eq(any(followed_crates)))
5960
.order(versions::created_at.desc())
60-
.select((versions::all_columns, crates::name))
61+
.select((
62+
versions::all_columns,
63+
crates::name,
64+
users::all_columns.nullable(),
65+
))
6166
.paginate(limit, offset)
62-
.load::<((Version, String), i64)>(&*conn)?;
67+
.load::<((Version, String, Option<User>), i64)>(&*conn)?;
6368

6469
let more = data
6570
.get(0)
@@ -68,7 +73,9 @@ pub fn updates(req: &mut dyn Request) -> CargoResult<Response> {
6873

6974
let versions = data
7075
.into_iter()
71-
.map(|((version, crate_name), _)| version.encodable(&crate_name, None))
76+
.map(|((version, crate_name, published_by), _)| {
77+
version.encodable(&crate_name, published_by)
78+
})
7279
.collect();
7380

7481
#[derive(Serialize)]

src/controllers/version/deprecated.rs

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
88
use crate::controllers::prelude::*;
99

10-
use crate::models::{Crate, Version};
10+
use crate::models::{Crate, User, Version};
1111
use crate::schema::*;
1212
use crate::views::EncodableVersion;
1313

@@ -24,11 +24,16 @@ pub fn index(req: &mut dyn Request) -> CargoResult<Response> {
2424

2525
let versions = versions::table
2626
.inner_join(crates::table)
27-
.select((versions::all_columns, crates::name))
27+
.left_outer_join(users::table)
28+
.select((
29+
versions::all_columns,
30+
crates::name,
31+
users::all_columns.nullable(),
32+
))
2833
.filter(versions::id.eq(any(ids)))
29-
.load::<(Version, String)>(&*conn)?
34+
.load::<(Version, String, Option<User>)>(&*conn)?
3035
.into_iter()
31-
.map(|(version, crate_name)| version.encodable(&crate_name, None))
36+
.map(|(version, crate_name, published_by)| version.encodable(&crate_name, published_by))
3237
.collect();
3338

3439
#[derive(Serialize)]
@@ -45,17 +50,22 @@ pub fn show_by_id(req: &mut dyn Request) -> CargoResult<Response> {
4550
let id = &req.params()["version_id"];
4651
let id = id.parse().unwrap_or(0);
4752
let conn = req.db_conn()?;
48-
let (version, krate): (Version, Crate) = versions::table
53+
let (version, krate, published_by): (Version, Crate, Option<User>) = versions::table
4954
.find(id)
5055
.inner_join(crates::table)
51-
.select((versions::all_columns, crate::models::krate::ALL_COLUMNS))
56+
.left_outer_join(users::table)
57+
.select((
58+
versions::all_columns,
59+
crate::models::krate::ALL_COLUMNS,
60+
users::all_columns.nullable(),
61+
))
5262
.first(&*conn)?;
5363

5464
#[derive(Serialize)]
5565
struct R {
5666
version: EncodableVersion,
5767
}
5868
Ok(req.json(&R {
59-
version: version.encodable(&krate.name, None),
69+
version: version.encodable(&krate.name, published_by),
6070
}))
6171
}

src/tests/krate.rs

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1752,6 +1752,46 @@ fn yanked_versions_not_included_in_reverse_dependencies() {
17521752
assert_eq!(deps.meta.total, 0);
17531753
}
17541754

1755+
#[test]
1756+
fn reverse_dependencies_includes_published_by_user_when_present() {
1757+
let (app, anon, user) = TestApp::init().with_user();
1758+
let user = user.as_model();
1759+
1760+
app.db(|conn| {
1761+
let c1 = CrateBuilder::new("c1", user.id)
1762+
.version("1.0.0")
1763+
.expect_build(conn);
1764+
CrateBuilder::new("c2", user.id)
1765+
.version(VersionBuilder::new("2.0.0").dependency(&c1, None))
1766+
.expect_build(conn);
1767+
1768+
// Make c2's version (and,incidentally, c1's, but that doesn't matter) mimic a version
1769+
// published before we started recording who published versions
1770+
let none: Option<i32> = None;
1771+
update(versions::table)
1772+
.set(versions::published_by.eq(none))
1773+
.execute(conn)
1774+
.unwrap();
1775+
1776+
// c3's version will have the published by info recorded
1777+
CrateBuilder::new("c3", user.id)
1778+
.version(VersionBuilder::new("3.0.0").dependency(&c1, None))
1779+
.expect_build(conn);
1780+
});
1781+
1782+
let deps = anon.reverse_dependencies("c1");
1783+
assert_eq!(deps.versions.len(), 2);
1784+
1785+
let c2_version = deps.versions.iter().find(|v| v.krate == "c2").unwrap();
1786+
assert!(c2_version.published_by.is_none());
1787+
1788+
let c3_version = deps.versions.iter().find(|v| v.krate == "c3").unwrap();
1789+
assert_eq!(
1790+
c3_version.published_by.as_ref().unwrap().login,
1791+
user.gh_login
1792+
);
1793+
}
1794+
17551795
#[test]
17561796
fn author_license_and_description_required() {
17571797
let (_, _, _, token) = TestApp::init().with_token();

src/tests/user.rs

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,9 @@ fn crates_by_user_id_not_including_deleted_owners() {
142142

143143
#[test]
144144
fn following() {
145+
use cargo_registry::schema::versions;
146+
use diesel::update;
147+
145148
#[derive(Deserialize)]
146149
struct R {
147150
versions: Vec<EncodableVersion>,
@@ -153,12 +156,21 @@ fn following() {
153156
}
154157

155158
let (app, _, user) = TestApp::init().with_user();
156-
let user_id = user.as_model().id;
159+
let user_model = user.as_model();
160+
let user_id = user_model.id;
157161
app.db(|conn| {
158162
CrateBuilder::new("foo_fighters", user_id)
159163
.version(VersionBuilder::new("1.0.0"))
160164
.expect_build(conn);
161165

166+
// Make foo_fighters's version mimic a version published before we started recording who
167+
// published versions
168+
let none: Option<i32> = None;
169+
update(versions::table)
170+
.set(versions::published_by.eq(none))
171+
.execute(conn)
172+
.unwrap();
173+
162174
CrateBuilder::new("bar_fighters", user_id)
163175
.version(VersionBuilder::new("1.0.0"))
164176
.expect_build(conn);
@@ -176,6 +188,21 @@ fn following() {
176188
let r: R = user.get("/api/v1/me/updates").good();
177189
assert_eq!(r.versions.len(), 2);
178190
assert_eq!(r.meta.more, false);
191+
let foo_version = r
192+
.versions
193+
.iter()
194+
.find(|v| v.krate == "foo_fighters")
195+
.unwrap();
196+
assert!(foo_version.published_by.is_none());
197+
let bar_version = r
198+
.versions
199+
.iter()
200+
.find(|v| v.krate == "bar_fighters")
201+
.unwrap();
202+
assert_eq!(
203+
bar_version.published_by.as_ref().unwrap().login,
204+
user_model.gh_login
205+
);
179206

180207
let r: R = user
181208
.get_with_query("/api/v1/me/updates", "per_page=1")

0 commit comments

Comments
 (0)