Skip to content

Commit 5566f19

Browse files
authored
controllers/user/other: Read downloads from crate_downloads table (#8250)
1 parent 04c2a8e commit 5566f19

File tree

4 files changed

+30
-22
lines changed

4 files changed

+30
-22
lines changed

Cargo.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ aws-sdk-sqs = "=1.15.0"
5656
axum = { version = "=0.7.4", features = ["macros", "matched-path"] }
5757
axum-extra = { version = "=0.9.2", features = ["cookie-signed", "typed-header"] }
5858
base64 = "=0.22.0"
59-
bigdecimal = "=0.4.3"
59+
bigdecimal = { version = "=0.4.3", features = ["serde"] }
6060
cargo-manifest = "=0.13.0"
6161
crates_io_cdn_logs = { path = "crates_io_cdn_logs" }
6262
crates_io_env_vars = { path = "crates_io_env_vars" }

src/controllers/user/other.rs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
use crate::controllers::frontend_prelude::*;
2+
use bigdecimal::{BigDecimal, ToPrimitive};
23

34
use crate::models::{CrateOwner, OwnerKind, User};
4-
use crate::schema::{crate_owners, crates, users};
5+
use crate::schema::{crate_downloads, crate_owners, crates, users};
56
use crate::sql::lower;
67
use crate::views::EncodablePublicUser;
78

@@ -29,11 +30,13 @@ pub async fn stats(state: AppState, Path(user_id): Path<i32>) -> AppResult<Json<
2930

3031
let conn = &mut *state.db_read_prefer_primary()?;
3132

32-
let data: i64 = CrateOwner::by_owner_kind(OwnerKind::User)
33+
let data = CrateOwner::by_owner_kind(OwnerKind::User)
3334
.inner_join(crates::table)
35+
.inner_join(crate_downloads::table.on(crates::id.eq(crate_downloads::crate_id)))
3436
.filter(crate_owners::owner_id.eq(user_id))
35-
.select(sum(crates::downloads))
36-
.first::<Option<i64>>(conn)?
37+
.select(sum(crate_downloads::downloads))
38+
.first::<Option<BigDecimal>>(conn)?
39+
.map(|d| d.to_u64().unwrap_or(u64::MAX))
3740
.unwrap_or(0);
3841

3942
Ok(Json(json!({ "total_downloads": data })))

src/tests/routes/users/stats.rs

Lines changed: 21 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -9,33 +9,37 @@ struct UserStats {
99
fn user_total_downloads() {
1010
use crate::builders::CrateBuilder;
1111
use crate::util::{RequestHelper, TestApp};
12-
use diesel::{update, RunQueryDsl};
12+
use crates_io::schema::crate_downloads;
13+
use diesel::prelude::*;
14+
use diesel::{update, QueryDsl, RunQueryDsl};
1315

1416
let (app, anon, user) = TestApp::init().with_user();
1517
let user = user.as_model();
1618
let another_user = app.db_new_user("bar");
1719
let another_user = another_user.as_model();
1820

1921
app.db(|conn| {
20-
let mut krate = CrateBuilder::new("foo_krate1", user.id).expect_build(conn);
21-
krate.downloads = 10;
22-
update(&krate).set(&krate).execute(conn).unwrap();
23-
24-
let mut krate2 = CrateBuilder::new("foo_krate2", user.id).expect_build(conn);
25-
krate2.downloads = 20;
26-
update(&krate2).set(&krate2).execute(conn).unwrap();
27-
28-
let mut another_krate = CrateBuilder::new("bar_krate1", another_user.id).expect_build(conn);
29-
another_krate.downloads = 2;
30-
update(&another_krate)
31-
.set(&another_krate)
22+
let krate = CrateBuilder::new("foo_krate1", user.id).expect_build(conn);
23+
update(crate_downloads::table.filter(crate_downloads::crate_id.eq(krate.id)))
24+
.set(crate_downloads::downloads.eq(10))
3225
.execute(conn)
3326
.unwrap();
3427

35-
let mut no_longer_my_krate = CrateBuilder::new("nacho", user.id).expect_build(conn);
36-
no_longer_my_krate.downloads = 5;
37-
update(&no_longer_my_krate)
38-
.set(&no_longer_my_krate)
28+
let krate2 = CrateBuilder::new("foo_krate2", user.id).expect_build(conn);
29+
update(crate_downloads::table.filter(crate_downloads::crate_id.eq(krate2.id)))
30+
.set(crate_downloads::downloads.eq(20))
31+
.execute(conn)
32+
.unwrap();
33+
34+
let another_krate = CrateBuilder::new("bar_krate1", another_user.id).expect_build(conn);
35+
update(crate_downloads::table.filter(crate_downloads::crate_id.eq(another_krate.id)))
36+
.set(crate_downloads::downloads.eq(2))
37+
.execute(conn)
38+
.unwrap();
39+
40+
let no_longer_my_krate = CrateBuilder::new("nacho", user.id).expect_build(conn);
41+
update(crate_downloads::table.filter(crate_downloads::crate_id.eq(no_longer_my_krate.id)))
42+
.set(crate_downloads::downloads.eq(5))
3943
.execute(conn)
4044
.unwrap();
4145
no_longer_my_krate

0 commit comments

Comments
 (0)