Skip to content

Commit 1746fbf

Browse files
committed
Add download count to admin list
1 parent 59a762e commit 1746fbf

File tree

3 files changed

+58
-27
lines changed

3 files changed

+58
-27
lines changed

src/controllers/admin.rs

Lines changed: 51 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -42,20 +42,33 @@ pub async fn list(
4242
.first::<(User, Option<bool>, Option<String>)>(&mut conn)
4343
.await?;
4444

45-
let crates: Vec<(i32, String, Option<String>, DateTime<Utc>, i64)> =
46-
CrateOwner::by_owner_kind(OwnerKind::User)
47-
.inner_join(crates::table)
48-
.filter(crate_owners::owner_id.eq(user.id))
49-
.select((
50-
crates::id,
51-
crates::name,
52-
crates::description,
53-
crates::updated_at,
54-
rev_deps_subquery(),
55-
))
56-
.order(crates::name.asc())
57-
.load(&mut conn)
58-
.await?;
45+
let crates: Vec<(
46+
i32,
47+
String,
48+
Option<String>,
49+
DateTime<Utc>,
50+
Option<i64>,
51+
Option<i64>,
52+
i64,
53+
)> = CrateOwner::by_owner_kind(OwnerKind::User)
54+
.inner_join(crates::table)
55+
.left_join(crate_downloads::table.on(crates::id.eq(crate_downloads::crate_id)))
56+
.left_join(
57+
recent_crate_downloads::table.on(crates::id.eq(recent_crate_downloads::crate_id)),
58+
)
59+
.filter(crate_owners::owner_id.eq(user.id))
60+
.select((
61+
crates::id,
62+
crates::name,
63+
crates::description,
64+
crates::updated_at,
65+
crate_downloads::downloads.nullable(),
66+
recent_crate_downloads::downloads.nullable(),
67+
rev_deps_subquery(),
68+
))
69+
.order(crates::name.asc())
70+
.load(&mut conn)
71+
.await?;
5972

6073
let crate_ids: Vec<_> = crates.iter().map(|(id, ..)| id).collect();
6174

@@ -73,21 +86,33 @@ pub async fn list(
7386
let verified = verified.unwrap_or(false);
7487
let crates = crates
7588
.into_iter()
76-
.map(|(crate_id, name, description, updated_at, num_rev_deps)| {
77-
let versions = versions_by_crate_id.get(&crate_id);
78-
let last_version = versions.and_then(|v| v.last());
79-
AdminCrateInfo {
89+
.map(
90+
|(
91+
crate_id,
8092
name,
8193
description,
8294
updated_at,
95+
downloads,
96+
recent_crate_downloads,
8397
num_rev_deps,
84-
num_versions: versions.map(|v| v.len()).unwrap_or(0),
85-
crate_size: last_version.map(|v| v.crate_size).unwrap_or(0),
86-
bin_names: last_version
87-
.map(|v| v.bin_names.clone())
88-
.unwrap_or_default(),
89-
}
90-
})
98+
)| {
99+
let versions = versions_by_crate_id.get(&crate_id);
100+
let last_version = versions.and_then(|v| v.last());
101+
AdminCrateInfo {
102+
name,
103+
description,
104+
updated_at,
105+
downloads: downloads.unwrap_or_default()
106+
+ recent_crate_downloads.unwrap_or_default(),
107+
num_rev_deps,
108+
num_versions: versions.map(|v| v.len()).unwrap_or(0),
109+
crate_size: last_version.map(|v| v.crate_size).unwrap_or(0),
110+
bin_names: last_version
111+
.map(|v| v.bin_names.clone())
112+
.unwrap_or_default(),
113+
}
114+
},
115+
)
91116
.collect();
92117
Ok(Json(AdminListResponse {
93118
user_email: verified.then_some(email).flatten(),
@@ -106,6 +131,7 @@ pub struct AdminCrateInfo {
106131
pub name: String,
107132
pub description: Option<String>,
108133
pub updated_at: DateTime<Utc>,
134+
pub downloads: i64,
109135
pub num_rev_deps: i64,
110136
pub num_versions: usize,
111137
pub crate_size: i32,

src/tests/mod.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,15 +84,16 @@ pub struct OkBool {
8484
#[allow(dead_code)]
8585
ok: bool,
8686
}
87-
#[derive(Deserialize)]
87+
#[derive(Deserialize, Debug)]
8888
pub struct AdminListResponse {
8989
user_email: Option<String>,
9090
crates: Vec<AdminCrateInfo>,
9191
}
92-
#[derive(Deserialize)]
92+
#[derive(Deserialize, Debug)]
9393
pub struct AdminCrateInfo {
9494
name: String,
9595
description: Option<String>,
96+
downloads: i64,
9697
num_versions: usize,
9798
num_rev_deps: i64,
9899
}

src/tests/routes/crates/admin.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,8 @@ async fn index_include_yanked() -> anyhow::Result<()> {
4444

4545
let crate_1 = CrateBuilder::new("unyanked", user.id)
4646
.description("My Fun Crate")
47+
.downloads(500)
48+
.recent_downloads(36)
4749
.version(VersionBuilder::new("0.1.0").yanked(true))
4850
.version(VersionBuilder::new("1.0.0"))
4951
.version(VersionBuilder::new("2.0.0"))
@@ -71,12 +73,14 @@ async fn index_include_yanked() -> anyhow::Result<()> {
7173
let json_crate_0 = &json.crates[0];
7274
assert_eq!(json_crate_0.name, "all_yanked");
7375
assert!(json_crate_0.description.is_none());
76+
assert_eq!(json_crate_0.downloads, 0);
7477
assert_eq!(json_crate_0.num_versions, 2);
7578
assert_eq!(json_crate_0.num_rev_deps, 0);
7679

7780
let json_crate_1 = &json.crates[1];
7881
assert_eq!(json_crate_1.name, "unyanked");
7982
assert_eq!(json_crate_1.description.as_ref().unwrap(), "My Fun Crate");
83+
assert_eq!(json_crate_1.downloads, 536);
8084
assert_eq!(json_crate_1.num_versions, 3);
8185
assert_eq!(json_crate_1.num_rev_deps, 1);
8286

0 commit comments

Comments
 (0)