Skip to content

Commit eb5e759

Browse files
committed
controllers/summary: Expose the default_version field
1 parent b1e96f8 commit eb5e759

File tree

2 files changed

+40
-4
lines changed

2 files changed

+40
-4
lines changed

src/controllers/summary.rs

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
use crate::app::AppState;
22
use crate::models::{Category, Crate, CrateVersions, Keyword, TopVersions, Version};
3-
use crate::schema::{crate_downloads, crates, keywords, metadata, recent_crate_downloads};
3+
use crate::schema::{
4+
crate_downloads, crates, default_versions, keywords, metadata, recent_crate_downloads, versions,
5+
};
46
use crate::tasks::spawn_blocking;
57
use crate::util::diesel::Conn;
68
use crate::util::errors::AppResult;
@@ -25,7 +27,7 @@ pub async fn summary(state: AppState) -> AppResult<Json<Value>> {
2527

2628
fn encode_crates(
2729
conn: &mut impl Conn,
28-
data: Vec<(Crate, i64, Option<i64>)>,
30+
data: Vec<(Crate, i64, Option<i64>, Option<String>)>,
2931
) -> AppResult<Vec<EncodableCrate>> {
3032
let krates = data.iter().map(|(c, ..)| c).collect::<Vec<_>>();
3133
let versions: Vec<Version> = krates.versions().load(conn)?;
@@ -34,10 +36,10 @@ pub async fn summary(state: AppState) -> AppResult<Json<Value>> {
3436
.into_iter()
3537
.map(TopVersions::from_versions)
3638
.zip(data)
37-
.map(|(top_versions, (krate, total, recent))| {
39+
.map(|(top_versions, (krate, total, recent, default_version))| {
3840
Ok(EncodableCrate::from_minimal(
3941
krate,
40-
None,
42+
default_version.as_deref(),
4143
Some(&top_versions),
4244
None,
4345
false,
@@ -52,18 +54,23 @@ pub async fn summary(state: AppState) -> AppResult<Json<Value>> {
5254
Crate::as_select(),
5355
crate_downloads::downloads,
5456
recent_crate_downloads::downloads.nullable(),
57+
versions::num.nullable(),
5558
);
5659

5760
let new_crates = crates::table
5861
.inner_join(crate_downloads::table)
5962
.left_join(recent_crate_downloads::table)
63+
.left_join(default_versions::table)
64+
.left_join(versions::table.on(default_versions::version_id.eq(versions::id)))
6065
.order(crates::created_at.desc())
6166
.select(selection)
6267
.limit(10)
6368
.load(conn)?;
6469
let just_updated = crates::table
6570
.inner_join(crate_downloads::table)
6671
.left_join(recent_crate_downloads::table)
72+
.left_join(default_versions::table)
73+
.left_join(versions::table.on(default_versions::version_id.eq(versions::id)))
6774
.filter(crates::updated_at.ne(crates::created_at))
6875
.order(crates::updated_at.desc())
6976
.select(selection)
@@ -73,6 +80,8 @@ pub async fn summary(state: AppState) -> AppResult<Json<Value>> {
7380
let mut most_downloaded_query = crates::table
7481
.inner_join(crate_downloads::table)
7582
.left_join(recent_crate_downloads::table)
83+
.left_join(default_versions::table)
84+
.left_join(versions::table.on(default_versions::version_id.eq(versions::id)))
7685
.into_boxed();
7786
if !config.excluded_crate_names.is_empty() {
7887
most_downloaded_query =
@@ -87,6 +96,8 @@ pub async fn summary(state: AppState) -> AppResult<Json<Value>> {
8796
let mut most_recently_downloaded_query = crates::table
8897
.inner_join(crate_downloads::table)
8998
.inner_join(recent_crate_downloads::table)
99+
.left_join(default_versions::table)
100+
.left_join(versions::table.on(default_versions::version_id.eq(versions::id)))
90101
.into_boxed();
91102
if !config.excluded_crate_names.is_empty() {
92103
most_recently_downloaded_query = most_recently_downloaded_query

src/tests/routes/summary.rs

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ async fn summary_new_crates() {
5151

5252
CrateBuilder::new("most_recent_downloads", user.id)
5353
.version(VersionBuilder::new("0.2.0"))
54+
.version(VersionBuilder::new("0.2.1").yanked(true))
5455
.keyword("popular")
5556
.category("cat1")
5657
.downloads(5000)
@@ -59,6 +60,7 @@ async fn summary_new_crates() {
5960

6061
CrateBuilder::new("just_updated", user.id)
6162
.version(VersionBuilder::new("0.1.0"))
63+
.version(VersionBuilder::new("0.1.1").yanked(true))
6264
.version(VersionBuilder::new("0.1.2"))
6365
// update 'just_updated' krate. Others won't appear because updated_at == created_at.
6466
.updated_at(now_)
@@ -67,13 +69,15 @@ async fn summary_new_crates() {
6769
CrateBuilder::new("just_updated_patch", user.id)
6870
.version(VersionBuilder::new("0.1.0"))
6971
.version(VersionBuilder::new("0.2.0"))
72+
.version(VersionBuilder::new("0.2.1").yanked(true))
7073
// Add a patch version be newer than the other versions, including the higher one.
7174
.version(VersionBuilder::new("0.1.1").created_at(now_plus_two))
7275
.updated_at(now_plus_two)
7376
.expect_build(conn);
7477

7578
CrateBuilder::new("with_downloads", user.id)
7679
.version(VersionBuilder::new("0.3.0"))
80+
.version(VersionBuilder::new("0.3.1").yanked(true))
7781
.keyword("popular")
7882
.downloads(1000)
7983
.expect_build(conn);
@@ -92,25 +96,37 @@ async fn summary_new_crates() {
9296
assert_eq!(json.num_crates, 5);
9397
assert_eq!(json.num_downloads, 6000);
9498
assert_eq!(json.most_downloaded[0].name, "most_recent_downloads");
99+
assert_eq!(
100+
json.most_downloaded[0].default_version,
101+
Some("0.2.0".into())
102+
);
95103
assert_eq!(json.most_downloaded[0].downloads, 5000);
96104
assert_eq!(json.most_downloaded[0].recent_downloads, Some(50));
97105
assert_eq!(
98106
json.most_recently_downloaded[0].name,
99107
"most_recent_downloads"
100108
);
109+
assert_eq!(
110+
json.most_recently_downloaded[0].default_version,
111+
Some("0.2.0".into())
112+
);
101113
assert_eq!(json.most_recently_downloaded[0].recent_downloads, Some(50));
102114
assert_eq!(json.popular_keywords[0].keyword, "popular");
103115
assert_eq!(json.popular_categories[0].category, "Category 1");
104116
assert_eq!(json.just_updated.len(), 2);
105117

106118
assert_eq!(json.just_updated[0].name, "just_updated_patch");
119+
assert_eq!(json.just_updated[0].default_version, Some("0.2.0".into()));
107120
assert_eq!(json.just_updated[0].max_version, "0.2.0");
108121
assert_eq!(json.just_updated[0].newest_version, "0.1.1");
109122

110123
assert_eq!(json.just_updated[1].name, "just_updated");
124+
assert_eq!(json.just_updated[1].default_version, Some("0.1.2".into()));
111125
assert_eq!(json.just_updated[1].max_version, "0.1.2");
112126
assert_eq!(json.just_updated[1].newest_version, "0.1.2");
113127

128+
assert_eq!(json.new_crates[0].name, "with_downloads");
129+
assert_eq!(json.new_crates[0].default_version, Some("0.3.0".into()));
114130
assert_eq!(json.new_crates.len(), 5);
115131
}
116132

@@ -132,6 +148,7 @@ async fn excluded_crate_id() {
132148

133149
CrateBuilder::new("some_downloads", user.id)
134150
.version(VersionBuilder::new("0.1.0"))
151+
.version(VersionBuilder::new("0.2.0").yanked(true))
135152
.description("description")
136153
.keyword("popular")
137154
.category("cat1")
@@ -151,9 +168,17 @@ async fn excluded_crate_id() {
151168

152169
assert_eq!(json.most_downloaded.len(), 1);
153170
assert_eq!(json.most_downloaded[0].name, "some_downloads");
171+
assert_eq!(
172+
json.most_downloaded[0].default_version,
173+
Some("0.1.0".into())
174+
);
154175
assert_eq!(json.most_downloaded[0].downloads, 20);
155176

156177
assert_eq!(json.most_recently_downloaded.len(), 1);
157178
assert_eq!(json.most_recently_downloaded[0].name, "some_downloads");
179+
assert_eq!(
180+
json.most_recently_downloaded[0].default_version,
181+
Some("0.1.0".into())
182+
);
158183
assert_eq!(json.most_recently_downloaded[0].recent_downloads, Some(10));
159184
}

0 commit comments

Comments
 (0)